自定义ViewGroup实现ViewPager的滑动效果
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                自定义ViewGroup实现ViewPager的滑动效果
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            看下他的
布局
文件:
 
 
  
 
 
 
 
 
 
 
  final int action = event.getAction();? ?? ?
  
 ? ?? ?? ?? ?final float x = event.getX();? ?? ?
  
 ? ?? ?? ?? ?final float y = event.getY();? ?? ?? ?? ?? ?? ?? ?
  
 ? ?? ?? ?? ?switch (action) {? ?? ?
  
 ? ?? ?? ?? ?case MotionEvent.ACTION_DOWN:? ?? ?? ?? ?? ???
  
 ? ?? ?? ?? ?? ?? ?Log.i("", "onTouchEvent??ACTION_DOWN");? ?? ?? ?? ?? ?? ? 
  
 ? ?? ?? ?? ?? ? if (mVelocityTracker == null) {? ?? ?
  
 ? ?? ?? ?? ?? ?? ?? ?? ?mVelocityTracker = VelocityTracker.obtain();? ?? ?
  
 ? ?? ?? ?? ?? ?? ?? ?? ?mVelocityTracker.addMovement(event);? ?
  
 ? ?? ?? ?? ?? ? }? ?? ?? ?? ???
  
 ? ?? ?? ?? ?? ? if (!mScroller.isFinished()){? ?? ?
  
 ? ?? ?? ?? ?? ?? ???mScroller.abortAnimation();? ?? ?
  
 ? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?? ?
  
 ? ?? ?? ?? ?? ? mLastMotionX = x;? ?? ?? ?? ?? ? 
  
 ? ?? ?? ?? ?? ? break;? ?? ?? ?? ?? ?? ?? ?? ?
  
 ? ?? ?? ?? ?case MotionEvent.ACTION_MOVE:? ? 
  
 ? ?? ?? ?? ?? ?int deltaX = (int)(mLastMotionX - x);? ?? ?? ?? ?? ???
  
 ? ?? ?? ?? ?? ?if (IsCanMove(deltaX)){??
  
 ? ?? ?? ?? ?? ???if (mVelocityTracker != null){??
  
 ? ?? ?? ?? ?? ?? ?? ?? ?mVelocityTracker.addMovement(event);? ?
  
 ? ?? ?? ?? ?? ???}? ???
  
 ? ?? ?? ?? ?? ? mLastMotionX = x;? ?? ? 
  
 ? ?? ?? ?? ?? ? scrollBy(deltaX, 0);? ?? ?
  
 ? ?? ?? ?? ?? ?}? ?? ?? ?
  
 ? ?? ?? ?? ?? ?break;? ?? ?? ?? ?? ?? ?? ?? ? 
  
 ? ?? ?? ?? ?case MotionEvent.ACTION_UP:? ?? ?? ?? ?? ?? ?? ???
  
 ? ?? ?? ?? ?? ? int velocityX = 0;??
  
 ? ?? ?? ?? ?? ? if (mVelocityTracker != null){??
  
 ? ?? ?? ?? ?? ?? ???mVelocityTracker.addMovement(event);? ?
  
 ? ?? ?? ?? ?? ?? ???mVelocityTracker.computeCurrentVelocity(1000);? ? 
  
 ? ?? ?? ?? ?? ?? ???velocityX = (int) mVelocityTracker.getXVelocity();??
  
 ? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 
  
 ? ?? ?? ?? ?? ? if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {? ?? ?? ?? ?? ?
  
 ? ?? ?? ?? ?? ?? ???Log.e(TAG, "snap left");? ?? ?
  
 ? ?? ?? ?? ?? ?? ???snapToScreen(mCurScreen - 1);? ?? ?? ?
  
 ? ?? ?? ?? ?? ? } else if (velocityX < -SNAP_VELOCITY? ?? ?? ?
  
 ? ?? ?? ?? ?? ?? ?? ?? ?&& mCurScreen < getChildCount() - 1) {? ?? ?? ?? ? 
  
 ? ?? ?? ?? ?? ?? ???Log.e(TAG, "snap right");? ?? ?
  
 ? ?? ?? ?? ?? ?? ???snapToScreen(mCurScreen + 1);? ?? ?? ?
  
 ? ?? ?? ?? ?? ? } else {? ?? ?? ?
  
 ? ?? ?? ?? ?? ?? ???snapToDestination();? ?? ?? ?
  
 ? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 
  
 ? ?? ?? ?? ?? ? if (mVelocityTracker != null) {? ?? ?? ?
  
 ? ?? ?? ?? ?? ?? ???mVelocityTracker.recycle();? ?? ?? ?
  
 ? ?? ?? ?? ?? ?? ???mVelocityTracker = null;? ?? ?? ?
  
 ? ?? ?? ?? ?? ? }? ?? ?? ?
  
 ? ?? ?? ?? ?? ? break;
  
 ??}??   復(fù)制代碼
 
 
通過判斷移動距離和移動方向做出不同的響應(yīng)。歡迎大家一起討論,一起學(xué)習(xí)。
                        
                        
                        
 
- <?xml version="1.0" encoding="utf-8"?>? ?? ?
 
 
- <RelativeLayout? ?
 
 
- ? ? android:layout_width="fill_parent"? ?
 
 
- ? ? android:layout_height="fill_parent"??
 
 
- ? ? xmlns:android="http://schemas.android.com/apk/res/android">? ?? ?
 
 
- ? ? <com.genius.scroll.MyScrollLayout? ?? ?
 
 
- ? ?? ?xmlns:android="http://schemas.android.com/apk/res/android"? ?? ?
 
 
- ? ?? ?android:id="@+id/ScrollLayout"? ?? ?
 
 
- ? ?? ?android:layout_width="fill_parent"? ?? ?
 
 
- ? ?? ?android:layout_height="fill_parent">? ?? ? 
 
 
- ? ?? ?<FrameLayout? ?? ?
 
 
- ? ?? ???android:background="@drawable/guide01"? ?? ?
 
 
- ? ?? ???android:layout_width="fill_parent"? ?? ?
 
 
- ? ?? ???android:layout_height="fill_parent">??
 
 
- ? ?? ?</FrameLayout>? ?? ?? ? 
 
 
- ? ?? ?<FrameLayout? ?? ?
 
 
- ? ?? ???android:background="@drawable/guide02"? ?? ?
 
 
- ? ?? ???android:layout_width="fill_parent"? ?? ?
 
 
- ? ?? ???android:layout_height="fill_parent">??
 
 
- ? ?? ?</FrameLayout>? ?? ?? ?? ???
 
 
- ? ?? ?<FrameLayout? ?? ? 
 
 
- ? ?? ???android:background="@drawable/guide03"? ?? ? 
 
 
- ? ?? ???android:layout_width="fill_parent"? ?? ?
 
 
- ? ?? ???android:layout_height="fill_parent">? ?? ???
 
 
- ? ?? ?</FrameLayout>? ?? ?? ? 
 
 
- ? ?? ?<FrameLayout? ?? ?
 
 
- ? ?? ???android:background="@drawable/guide04"? ?? ?
 
 
- ? ?? ???android:layout_width="fill_parent"? ?? ?
 
 
- ? ?? ???android:layout_height="fill_parent">? ?? ?
 
 
- ? ?? ?</FrameLayout>? ?? ?? ? 
 
 
- ? ?? ?<FrameLayout? ?? ?
 
 
- ? ?? ???android:background="@drawable/guide05"? ?? ?
 
 
- ? ?? ???android:layout_width="fill_parent"? ?? ?
 
 
- ? ?? ???android:layout_height="fill_parent">? ?? ?
 
 
- ? ?? ?</FrameLayout>? ?? ?? ?? ?
 
 
- ? ? </com.genius.scroll.MyScrollLayout>? ?
 
 
- ? ? <LinearLayout? ?
 
 
- ? ?? ???android:orientation="horizontal"? ?
 
 
- ? ?? ???android:id="@+id/llayout"? ?
 
 
- ? ?? ???android:layout_width="wrap_content"? ?
 
 
- ? ?? ???android:layout_height="wrap_content"? ?
 
 
- ? ?? ???android:layout_marginBottom="24.0dip"? ?
 
 
- ? ?? ???android:layout_alignParentBottom="true"? ?
 
 
- ? ?? ???android:layout_centerHorizontal="true">? ?? ???
 
 
- ? ?? ???<ImageView android:clickable="true"? ? 
 
 
- ? ?? ?? ?? ?android:padding="15.0dip"? ?
 
 
- ? ?? ?? ?? ?android:layout_gravity="center_vertical"? ?
 
 
- ? ?? ?? ?? ?android:layout_width="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:layout_height="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:src="@drawable/guide_round" />??
 
 
- ? ?? ???<ImageView android:clickable="true"? ? 
 
 
- ? ?? ?? ?? ?android:padding="15.0dip"? ? 
 
 
- ? ?? ?? ?? ?android:layout_gravity="center_vertical"? ?
 
 
- ? ?? ?? ?? ?android:layout_width="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:layout_height="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:src="@drawable/guide_round" />??
 
 
- ? ?? ???<ImageView android:clickable="true"? ? 
 
 
- ? ?? ?? ?? ?android:padding="15.0dip"? ? 
 
 
- ? ?? ?? ?? ?android:layout_gravity="center_vertical"? ?
 
 
- ? ?? ?? ?? ?android:layout_width="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:layout_height="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:src="@drawable/guide_round" />??
 
 
- ? ?? ???<ImageView android:clickable="true"? ? 
 
 
- ? ?? ?? ?? ?android:padding="15.0dip"? ? 
 
 
- ? ?? ?? ?? ?android:layout_gravity="center_vertical"? ?
 
 
- ? ?? ?? ?? ?android:layout_width="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:layout_height="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:src="@drawable/guide_round" />??
 
 
- ? ?? ???<ImageView android:clickable="true"? ? 
 
 
- ? ?? ?? ?? ?android:padding="15.0dip"? ? 
 
 
- ? ?? ?? ?? ?android:layout_gravity="center_vertical"? ?
 
 
- ? ?? ?? ?? ?android:layout_width="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:layout_height="wrap_content"? ?
 
 
- ? ?? ?? ?? ?android:src="@drawable/guide_round" />??
 
 
- ? ? </LinearLayout>? ???
 
 
- </RelativeLayout>?? 復(fù)制代碼
- public class MyScrollLayout extends ViewGroup{??
 
 
- ??
 
 
- ? ? private static final String TAG = "ScrollLayout";? ?? ???
 
 
- ? ? private VelocityTracker mVelocityTracker;? ?? ?? ???// 用于判斷甩動手勢? ?? ?
 
 
- ? ? private static final int SNAP_VELOCITY = 600;? ?? ?? ? 
 
 
- ? ? private Scroller??mScroller;? ?? ?? ?? ?? ?? ?? ?? ?// 滑動控制器? ?? ?
 
 
- ? ? private int mCurScreen;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ? private int mDefaultScreen = 0;? ?? ?? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ? private float mLastMotionX;? ?? ?? ?
 
 
- ? ?? ?
 
 
- ? ? private OnViewChangeListener mOnViewChangeListener;? ? 
 
 
- ? ? public MyScrollLayout(Context context) {??
 
 
- ? ?? ???super(context);??
 
 
- ? ?? ???init(context);??
 
 
- ? ? }? ???
 
 
- ? ? public MyScrollLayout(Context context, AttributeSet attrs) {??
 
 
- ? ?? ???super(context, attrs);??
 
 
- ? ?? ???init(context);??
 
 
- ? ? }? ???
 
 
- ? ? public MyScrollLayout(Context context, AttributeSet attrs, int defStyle) {??
 
 
- ? ?? ???super(context, attrs, defStyle);? ?? ?
 
 
- ? ?? ???init(context);??
 
 
- ? ? }? ???
 
 
- ? ? private void init(Context context)??
 
 
- ? ? {??
 
 
- ? ?? ???mCurScreen = mDefaultScreen;? ?? ?? ?? ?? ?? ?? ?? ???
 
 
- ? ?? ???mScroller = new Scroller(context);? ?? ???
 
 
- ? ? }??
 
 
- ??
 
 
- ? ? @Override??
 
 
- ? ? protected void onLayout(boolean changed, int l, int t, int r, int b) {??
 
 
- ? ?? ???// TODO Auto-generated method stub? ?? ???
 
 
- ? ?? ?? ?if (changed) {? ?? ?
 
 
- ? ?? ?? ?? ?? ? int childLeft = 0;? ?? ?
 
 
- ? ?? ?? ?? ?? ? final int childCount = getChildCount();? ?? ?? ?? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ? for (int i=0; i<childCount; i++) {? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???final View childView = getChildAt(i);? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???if (childView.getVisibility() != View.GONE) {? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?final int childWidth = childView.getMeasuredWidth();? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?childView.layout(childLeft, 0,? ?? ? 
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???childLeft+childWidth, childView.getMeasuredHeight());? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?childLeft += childWidth;? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???}? ?? ?
 
 
- ? ?? ?? ?? ?? ? }? ?? ?
 
 
- ? ?? ?? ?? ?}? ?? ?
 
 
- ? ? }??
 
 
- ??
 
 
- ? ? @Override??
 
 
- ? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {??
 
 
- ? ?? ???// TODO Auto-generated method stub??
 
 
- ? ?? ???super.onMeasure(widthMeasureSpec, heightMeasureSpec);? ?? ?? ?
 
 
- ? ?? ???final int width = MeasureSpec.getSize(widthMeasureSpec);? ?? ?? ?
 
 
- ? ?? ???final int widthMode = MeasureSpec.getMode(widthMeasureSpec);? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ?? ???final int count = getChildCount();? ?? ?? ?
 
 
- ? ?? ???for (int i = 0; i < count; i++) {? ?? ?? ?
 
 
- ? ?? ?? ?? ?getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);? ?? ?? ?
 
 
- ? ?? ???}? ?? ?? ?? ?? ?? ?
 
 
- ? ?? ???scrollTo(mCurScreen * width, 0);? ?? ?? ? 
 
 
- ? ? }??
 
 
- ??
 
 
- ? ???public void snapToDestination() {? ?? ?
 
 
- ? ?? ?? ?? ?final int screenWidth = getWidth();? ?? ?
 
 
- ? ?? ?? ?? ?final int destScreen = (getScrollX()+ screenWidth/2)/screenWidth;? ?? ?
 
 
- ? ?? ?? ?? ?snapToScreen(destScreen);? ?? ?
 
 
- ? ???}? ? 
 
 
- ? ?? ?
 
 
- ? ???public void snapToScreen(int whichScreen) {? ?? ?? ? 
 
 
- ? ?? ?? ?? ?// get the valid layout page? ?? ?
 
 
- ? ?? ?? ?? ?whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1));? ?? ?
 
 
- ? ?? ?? ?? ?if (getScrollX() != (whichScreen*getWidth())) {? ?? ?? ?? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ? final int delta = whichScreen*getWidth()-getScrollX();? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?mScroller.startScroll(getScrollX(), 0,? ?? ? 
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?delta, 0, Math.abs(delta)*2);? ?? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ? mCurScreen = whichScreen;? ?? ?
 
 
- ? ?? ?? ?? ?? ? invalidate();? ?? ? // Redraw the layout? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?? ? if (mOnViewChangeListener != null)??
 
 
- ? ?? ?? ?? ?? ? {??
 
 
- ? ?? ?? ?? ?? ?? ???mOnViewChangeListener.OnViewChange(mCurScreen);??
 
 
- ? ?? ?? ?? ?? ? }??
 
 
- ? ?? ?? ?? ?}? ?? ?
 
 
- ? ?? ???}? ?? ?
 
 
- ??
 
 
- ? ? @Override??
 
 
- ? ? public void computeScroll() {??
 
 
- ? ?? ???// TODO Auto-generated method stub??
 
 
- ? ?? ???if (mScroller.computeScrollOffset()) {? ?? ?
 
 
- ? ?? ?? ?? ?scrollTo(mScroller.getCurrX(), mScroller.getCurrY());? ? 
 
 
- ? ?? ?? ?? ?postInvalidate();? ?? ?
 
 
- ? ?? ???}? ???
 
 
- ? ? }??
 
 
- ??
 
 
- ? ? @Override??
 
 
- ? ? public boolean onTouchEvent(MotionEvent event) {??
 
 
- ? ?? ???// TODO Auto-generated method stub? ?? ?? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?final int action = event.getAction();? ?? ?
 
 
- ? ?? ?? ?? ?final float x = event.getX();? ?? ?
 
 
- ? ?? ?? ?? ?final float y = event.getY();? ?? ?? ?? ?? ?? ?? ?
 
 
- ? ?? ?? ?? ?switch (action) {? ?? ?
 
 
- ? ?? ?? ?? ?case MotionEvent.ACTION_DOWN:? ?? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ?? ?Log.i("", "onTouchEvent??ACTION_DOWN");? ?? ?? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?? ? if (mVelocityTracker == null) {? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?mVelocityTracker = VelocityTracker.obtain();? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?mVelocityTracker.addMovement(event);? ?
 
 
- ? ?? ?? ?? ?? ? }? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ? if (!mScroller.isFinished()){? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???mScroller.abortAnimation();? ?? ?
 
 
- ? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ? mLastMotionX = x;? ?? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?? ? break;? ?? ?? ?? ?? ?? ?? ?? ?
 
 
- ? ?? ?? ?? ?case MotionEvent.ACTION_MOVE:? ? 
 
 
- ? ?? ?? ?? ?? ?int deltaX = (int)(mLastMotionX - x);? ?? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ?if (IsCanMove(deltaX)){??
 
 
- ? ?? ?? ?? ?? ???if (mVelocityTracker != null){??
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?mVelocityTracker.addMovement(event);? ?
 
 
- ? ?? ?? ?? ?? ???}? ???
 
 
- ? ?? ?? ?? ?? ? mLastMotionX = x;? ?? ? 
 
 
- ? ?? ?? ?? ?? ? scrollBy(deltaX, 0);? ?? ?
 
 
- ? ?? ?? ?? ?? ?}? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ?break;? ?? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?case MotionEvent.ACTION_UP:? ?? ?? ?? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ? int velocityX = 0;??
 
 
- ? ?? ?? ?? ?? ? if (mVelocityTracker != null){??
 
 
- ? ?? ?? ?? ?? ?? ???mVelocityTracker.addMovement(event);? ?
 
 
- ? ?? ?? ?? ?? ?? ???mVelocityTracker.computeCurrentVelocity(1000);? ? 
 
 
- ? ?? ?? ?? ?? ?? ???velocityX = (int) mVelocityTracker.getXVelocity();??
 
 
- ? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?? ? if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {? ?? ?? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???Log.e(TAG, "snap left");? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???snapToScreen(mCurScreen - 1);? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ? } else if (velocityX < -SNAP_VELOCITY? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?&& mCurScreen < getChildCount() - 1) {? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?? ?? ???Log.e(TAG, "snap right");? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???snapToScreen(mCurScreen + 1);? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ? } else {? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???snapToDestination();? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ? }? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?? ? if (mVelocityTracker != null) {? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???mVelocityTracker.recycle();? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ???mVelocityTracker = null;? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ? }? ?? ?? ?
 
 
- ? ?? ?? ?? ?? ? break;? ?? ???
 
 
- ? ?? ?? ?? ?}? ?? ?? ?? ?? ?? ?? ?
 
 
- ? ?? ?? ?? ?return true;? ?? ?
 
 
- ? ? }??
 
 
- ??
 
 
- ? ? private boolean IsCanMove(int deltaX)??
 
 
- ? ? {??
 
 
- ? ?? ???if (getScrollX() <= 0 && deltaX < 0 ){??
 
 
- ? ?? ?? ?? ?return false;??
 
 
- ? ?? ???}? ???
 
 
- ? ?? ???if??(getScrollX() >=??(getChildCount() - 1) * getWidth() && deltaX > 0){??
 
 
- ? ?? ?? ?? ?return false;??
 
 
- ? ?? ???}? ?? ?? ?
 
 
- ? ?? ???return true;??
 
 
- ? ? }??
 
 
- ? ?? ?
 
 
- ? ? public void SetOnViewChangeListener(OnViewChangeListener listener)??
 
 
- ? ? {??
 
 
- ? ?? ???mOnViewChangeListener = listener;??
 
 
- ? ? }??
 
 
- }?? 復(fù)制代碼
- public interface OnViewChangeListener {??
 
 
- ? ? public void OnViewChange(int view);??
 
 
- }?? 復(fù)制代碼
- public class SwitchViewDemoActivity extends Activity implements OnViewChangeListener, OnClickListener{??
 
 
- ? ? /** Called when the activity is first created. */??
 
 
- ??
 
 
- ? ? private MyScrollLayout mScrollLayout;? ???
 
 
- ? ? private ImageView[] mImageViews;? ?? ?
 
 
- ? ? private int mViewCount;? ?
 
 
- ? ? private int mCurSel;??
 
 
- ? ?? ?
 
 
- ? ? @Override??
 
 
- ? ? public void onCreate(Bundle savedInstanceState) {??
 
 
- ? ?? ???super.onCreate(savedInstanceState);??
 
 
- ? ?? ???setContentView(R.layout.main);? ?? ?? ? 
 
 
- ? ?? ???init();??
 
 
- ? ? }??
 
 
- ? ?? ?
 
 
- ? ? private void init()??
 
 
- ? ? {??
 
 
- ? ?? ???mScrollLayout = (MyScrollLayout) findViewById(R.id.ScrollLayout);? ???
 
 
- ? ?? ???LinearLayout linearLayout = (LinearLayout) findViewById(R.id.llayout);? ?? ???
 
 
- ? ?? ???mViewCount = mScrollLayout.getChildCount();??
 
 
- ? ?? ???mImageViews = new ImageView[mViewCount];? ?? ?
 
 
- ? ?? ???for(int i = 0; i < mViewCount; i++)? ?? ?{??
 
 
- ? ?? ?? ?? ?mImageViews = (ImageView) linearLayout.getChildAt(i);??
 
 
- ? ?? ?? ?? ?mImageViews.setEnabled(true);??
 
 
- ? ?? ?? ?? ?mImageViews.setOnClickListener(this);??
 
 
- ? ?? ?? ?? ?mImageViews.setTag(i);??
 
 
- ? ?? ???}? ?? ?? ?
 
 
- ? ?? ???mCurSel = 0;??
 
 
- ? ?? ???mImageViews[mCurSel].setEnabled(false);? ?? ? 
 
 
- ? ?? ???mScrollLayout.SetOnViewChangeListener(this);??
 
 
- ? ? }??
 
 
- ??
 
 
- ? ? private void setCurPoint(int index)??
 
 
- ? ? {??
 
 
- ? ?? ???if (index < 0 || index > mViewCount - 1 || mCurSel == index)? ?? ?{??
 
 
- ? ?? ?? ?? ?return ;??
 
 
- ? ?? ???}? ?? ?? ?
 
 
- ? ?? ???mImageViews[mCurSel].setEnabled(true);??
 
 
- ? ?? ???mImageViews[index].setEnabled(false);? ?? ?? ?
 
 
- ? ?? ???mCurSel = index;??
 
 
- ? ? }??
 
 
- ??
 
 
- ? ? @Override??
 
 
- ? ? public void OnViewChange(int view) {??
 
 
- ? ?? ???// TODO Auto-generated method stub??
 
 
- ? ?? ???setCurPoint(view);??
 
 
- ? ? }??
 
 
- ??
 
 
- ? ? @Override??
 
 
- ? ? public void onClick(View v) {??
 
 
- ? ?? ???// TODO Auto-generated method stub??
 
 
- ? ?? ???int pos = (Integer)(v.getTag());??
 
 
- ? ?? ???setCurPoint(pos);??
 
 
- ? ?? ???mScrollLayout.snapToScreen(pos);??
 
 
- ? ? }??
 
 
- }?? 復(fù)制代碼
- public void snapToScreen(int whichScreen) {? ?? ? 
 
 
- ? ?? ?? ?? ?// get the valid layout page? ?? ?
 
 
- ? ?? ?? ?? ?whichScreen = Math.max(0, Math.min(whichScreen, getChildCount()-1));? ?? ?
 
 
- ? ?? ?? ?? ?if (getScrollX() != (whichScreen*getWidth())) {? ?? ?? ?? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ? final int delta = whichScreen*getWidth()-getScrollX();? ?? ?
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?mScroller.startScroll(getScrollX(), 0,? ?? ? 
 
 
- ? ?? ?? ?? ?? ?? ?? ?? ?delta, 0, Math.abs(delta)*2);? ?? ?? ?? ?? ???
 
 
- ? ?? ?? ?? ?? ? mCurScreen = whichScreen;? ?? ?
 
 
- ? ?? ?? ?? ?? ? invalidate();? ?? ? // Redraw the layout? ?? ?? ?? ?? ?? ?? ? 
 
 
- ? ?? ?? ?? ?? ? if (mOnViewChangeListener != null)??
 
 
- ? ?? ?? ?? ?? ? {??
 
 
- ? ?? ?? ?? ?? ?? ???mOnViewChangeListener.OnViewChange(mCurScreen);??
 
 
- ? ?? ?? ?? ?? ? }??
 
 
- ? ?? ?? ?? ?}? ?? ?
 
 
- ? ?? ???}? ? 復(fù)制代碼
- mOnViewChangeListener.OnViewChange(mCurScreen);??
 
? ?? ? 底部的LinearLayout是放了5個按鈕,上面使用到了一個自定義的控件:MyScrollLayout下面再看下這個自定義控件:里面使用frameLayout放了5張圖片。
首先注意,他繼承了ViewGroup類,在這里面主要重寫了onMeasure()、onTouchEvent()等方法,在這里使用了一個自定義的接口private OnViewChangeListener mOnViewChangeListener。看下它的定義:
? ?? ?這個接口里之定義了一個回調(diào)方法:OnViewChange()這個方法的具體實現(xiàn),是在主Activity中:
這個OnViewChange()方法,主要調(diào)用了setCurPoint()方法,就是完成界面的跳轉(zhuǎn)。在MyScrollLayout中的snapToScreen()方法中就是典型的回調(diào)方法:
這句代碼就是典型的回調(diào)。
在MyScrollLayout的onTouchEvent()的方法里面是對觸屏事件做出的響應(yīng):
通過判斷移動距離和移動方向做出不同的響應(yīng)。歡迎大家一起討論,一起學(xué)習(xí)。
總結(jié)
以上是生活随笔為你收集整理的自定义ViewGroup实现ViewPager的滑动效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Android:30分钟弄明白Touch
- 下一篇: Android View系统解析(上)
