推荐:
Android中利用ViewPager实现视图切换
http://bigcat.easymorse.com/?p=1532

ViewPager example -实现左右两个屏幕的切换
http://blog.csdn.net/b02330224/article/details/6770945

这个组件和ScrollLayout实现的功能是一样的.
package com.ql.app;import android.content.Context;   import android.util.Log;   import android.content.res.TypedArray;   import android.util.AttributeSet;   import android.view.MotionEvent;   import android.view.VelocityTracker;   import android.view.View;   import android.view.ViewGroup;   import android.view.ViewConfiguration;   import android.widget.Scroller;     public class DragableSpace extends ViewGroup {       private Scroller mScroller;       private VelocityTracker mVelocityTracker;         private int mScrollX = 0;       private int mCurrentScreen = 0;         private float mLastMotionX;         private static final String LOG_TAG = "DragableSpace";         private static final int SNAP_VELOCITY = 1000;         private final static int TOUCH_STATE_REST = 0;       private final static int TOUCH_STATE_SCROLLING = 1;         private int mTouchState = TOUCH_STATE_REST;         private int mTouchSlop = 0;         public DragableSpace(Context context) {           super(context);           mScroller = new Scroller(context);             mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();             this.setLayoutParams(new ViewGroup.LayoutParams(                       ViewGroup.LayoutParams.WRAP_CONTENT,                       ViewGroup.LayoutParams.FILL_PARENT));       }         public DragableSpace(Context context, AttributeSet attrs) {           super(context, attrs);           mScroller = new Scroller(context);             mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();             this.setLayoutParams(new ViewGroup.LayoutParams(                       ViewGroup.LayoutParams.WRAP_CONTENT ,                       ViewGroup.LayoutParams.FILL_PARENT));             TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.DragableSpace);           mCurrentScreen = a.getInteger(R.styleable.DragableSpace_default_screen, 0);       }         @Override      public boolean onInterceptTouchEvent(MotionEvent ev) {                                 final int action = ev.getAction();           if ((action == MotionEvent.ACTION_MOVE)                   && (mTouchState != TOUCH_STATE_REST)) {               return true;                   }             final float x = ev.getX();             switch (action) {               case MotionEvent.ACTION_MOVE:                                                         final int xDiff = (int) Math.abs(x - mLastMotionX);                     boolean xMoved = xDiff > mTouchSlop;                     if (xMoved) {                       // Scroll if the user moved far enough along the X axis                       mTouchState = TOUCH_STATE_SCROLLING;                   }                   break;                 case MotionEvent.ACTION_DOWN:                   // Remember location of down touch                   mLastMotionX = x;                                       mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;                   break;                 case MotionEvent.ACTION_CANCEL:               case MotionEvent.ACTION_UP:                   // Release the drag                   mTouchState = TOUCH_STATE_REST;                   break;           }                       return mTouchState != TOUCH_STATE_REST;       }         @Override      public boolean onTouchEvent(MotionEvent event) {             if (mVelocityTracker == null) {               mVelocityTracker = VelocityTracker.obtain();           }           mVelocityTracker.addMovement(event);             final int action = event.getAction();           final float x = event.getX();             switch (action) {               case MotionEvent.ACTION_DOWN:                   Log.i(LOG_TAG, "event : down");                                     if (!mScroller.isFinished()) {                       mScroller.abortAnimation();                   }                     // Remember where the motion event started                   mLastMotionX = x;                   break;               case MotionEvent.ACTION_MOVE:                   // Log.i(LOG_TAG,"event : move");                   // if (mTouchState == TOUCH_STATE_SCROLLING) {                   // Scroll to follow the motion event                   final int deltaX = (int) (mLastMotionX - x);                   mLastMotionX = x;                     //Log.i(LOG_TAG, "event : move, deltaX " + deltaX + ", mScrollX " + mScrollX);                     if (deltaX < 0) {                       if (mScrollX > 0) {                           scrollBy(Math.max(-mScrollX, deltaX), 0);                       }                   } else if (deltaX > 0) {                       final int availableToScroll = getChildAt(getChildCount() - 1)                           .getRight()                           - mScrollX - getWidth();                       if (availableToScroll > 0) {                           scrollBy(Math.min(availableToScroll, deltaX), 0);                       }                   }                   // }                   break;               case MotionEvent.ACTION_UP:                   Log.i(LOG_TAG, "event : up");                   // if (mTouchState == TOUCH_STATE_SCROLLING) {                   final VelocityTracker velocityTracker = mVelocityTracker;                   velocityTracker.computeCurrentVelocity(1000);                   int velocityX = (int) velocityTracker.getXVelocity();                     if (velocityX > SNAP_VELOCITY && mCurrentScreen > 0) {                       // Fling hard enough to move left                       snapToScreen(mCurrentScreen - 1);                   } else if (velocityX < -SNAP_VELOCITY                           && mCurrentScreen < getChildCount() - 1) {                       // Fling hard enough to move right                       snapToScreen(mCurrentScreen + 1);                   } else {                       snapToDestination();                   }                     if (mVelocityTracker != null) {                       mVelocityTracker.recycle();                       mVelocityTracker = null;                   }                   // }                   mTouchState = TOUCH_STATE_REST;                   break;               case MotionEvent.ACTION_CANCEL:                   Log.i(LOG_TAG, "event : cancel");                   mTouchState = TOUCH_STATE_REST;           }           mScrollX = this.getScrollX();             return true;       }         private void snapToDestination() {           final int screenWidth = getWidth();           final int whichScreen = (mScrollX + (screenWidth / 2)) / screenWidth;           Log.i(LOG_TAG, "from des");           snapToScreen(whichScreen);       }         public void snapToScreen(int whichScreen) {                    Log.i(LOG_TAG, "snap To Screen " + whichScreen);           mCurrentScreen = whichScreen;           final int newX = whichScreen * getWidth();           final int delta = newX - mScrollX;           mScroller.startScroll(mScrollX, 0, delta, 0, Math.abs(delta) * 2);                        invalidate();       }         public void setToScreen(int whichScreen) {           Log.i(LOG_TAG, "set To Screen " + whichScreen);           mCurrentScreen = whichScreen;           final int newX = whichScreen * getWidth();           mScroller.startScroll(newX, 0, 0, 0, 10);                        invalidate();       }         @Override      protected void onLayout(boolean changed, int l, int t, int r, int b) {           int childLeft = 0;             final int count = getChildCount();           for (int i = 0; i < count; i++) {               final View child = getChildAt(i);               if (child.getVisibility() != View.GONE) {                   final int childWidth = child.getMeasuredWidth();                   child.layout(childLeft, 0, childLeft + childWidth, child                           .getMeasuredHeight());                   childLeft += childWidth;               }           }         }         @Override      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {           super.onMeasure(widthMeasureSpec, heightMeasureSpec);             final int width = MeasureSpec.getSize(widthMeasureSpec);           final int widthMode = MeasureSpec.getMode(widthMeasureSpec);           if (widthMode != MeasureSpec.EXACTLY) {               throw new IllegalStateException("error mode.");           }             final int heightMode = MeasureSpec.getMode(heightMeasureSpec);           if (heightMode != MeasureSpec.EXACTLY) {               throw new IllegalStateException("error mode.");           }             // The children are given the same width and height as the workspace           final int count = getChildCount();           for (int i = 0; i < count; i++) {               getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);           }           Log.i(LOG_TAG, "moving to screen "+mCurrentScreen);           scrollTo(mCurrentScreen * width, 0);             }           @Override      public void computeScroll() {           if (mScroller.computeScrollOffset()) {               mScrollX = mScroller.getCurrX();               scrollTo(mScrollX, 0);               postInvalidate();           }       }   } 

里面用到的一个自定义属性,用于控制当前显示页.
<?xml version="1.0" encoding="utf-8"?><resources><declare-styleable name="DragableSpace"><attr name="default_screen" format="integer"/></declare-styleable></resources>

用法布局,这里假设有3页:
<?xml version="1.0" encoding="utf-8"?>   <com.ql.app.DragableSpace xmlns:app="http://schemas.android.com/apk/res/com.ql.app"      xmlns:android="http://schemas.android.com/apk/res/android"  android:id="@+id/space"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  app:default_screen="0"  >   <include android:id="@+id/left"  layout="@layout/screen_0" />   <include android:id="@+id/center"  layout="@layout/screen_1" />   <include android:id="@+id/right"  layout="@layout/screen_2" />   </com.ql.app.DragableSpace>

更多相关文章

  1. [置顶] android中cardview的基本使用
  2. ScrollView中的组件设置android:layout_height=fill_parent不起
  3. android翻转动画,界面不会颠倒
  4. android 开源组件合集-UI篇(2013-11-07更新)
  5. Android引导页播放视频——使用VideoView
  6. Android(安卓)开源项目及网址
  7. android api 中文 (74)―― AdapterView.AdapterContextMenuInfo
  8. 【面试题】Android类应该复习的内容
  9. Android(安卓)include使用

随机推荐

  1. 求一段与读取数据库数据,写入一个数组的ja
  2. Tinking in java枚举类型的自动贩售机
  3. JAVA 静态方法和静态变量和final和※静态
  4. 基于JavaScript实现验证码功能
  5. JAVA: 第一个只出现1次的字符
  6. 在iOS上签名的数据无法在Java中验证
  7. 整理的关于Java对mongodb进行的CURD操作
  8. Memcached提升web数据操作读写性能
  9. 未能解决:com.google.android.gms:play-s
  10. java 访问控制修饰符总结详解