日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义ViewGroup实现ViewPager的滑动效果

發(fā)布時(shí)間:2025/6/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义ViewGroup实现ViewPager的滑动效果 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
看下他的 布局 文件:



  • <?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ù)制代碼
    ? ?? ? 底部的LinearLayout是放了5個(gè)按鈕,上面使用到了一個(gè)自定義的控件:MyScrollLayout下面再看下這個(gè)自定義控件:里面使用frameLayout放了5張圖片。

  • 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ù)制代碼

    首先注意,他繼承了ViewGroup類,在這里面主要重寫了onMeasure()、onTouchEvent()等方法,在這里使用了一個(gè)自定義的接口private OnViewChangeListener mOnViewChangeListener。看下它的定義:

  • public interface OnViewChangeListener {??

  • ? ? public void OnViewChange(int view);??

  • }??
  • 復(fù)制代碼

    ? ?? ?這個(gè)接口里之定義了一個(gè)回調(diào)方法:OnViewChange()這個(gè)方法的具體實(shí)現(xiàn),是在主Activity中:

  • 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ù)制代碼

    這個(gè)OnViewChange()方法,主要調(diào)用了setCurPoint()方法,就是完成界面的跳轉(zhuǎn)。在MyScrollLayout中的snapToScreen()方法中就是典型的回調(diào)方法:


  • 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);??


這句代碼就是典型的回調(diào)。

在MyScrollLayout的onTouchEvent()的方法里面是對觸屏事件做出的響應(yīng):





  • 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í)。

    總結(jié)

    以上是生活随笔為你收集整理的自定义ViewGroup实现ViewPager的滑动效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 俄罗斯毛片 | 日日日人人人 | 涩涩网站入口 | 国产调教一区 | 午夜影院一区二区三区 | 国产小视频在线观看免费 | 亚洲a免费 | 欧美精品一区二区免费看 | 色性av | 91n视频| 丝袜国产一区 | 可以在线观看av的网站 | 日本黄色片 | 国产精品乱码 | 欧美福利影院 | 亚洲精品热 | 国产成人自拍网 | 香蕉久久久 | 豆国产97在线 | 亚洲 | 亚洲精品区| 欧美人在线 | 欧亚一区二区 | 欧美综合亚洲图片综合区 | 欧美视频网站 | 一级黄色片片 | 久久久久99精品成人片我成大片 | 美女扒开粉嫩尿口 | 日韩av网站大全 | 天天操夜夜草 | 国产精品77 | 亚洲精品粉嫩小泬20p | 天堂视频中文在线 | 亚州黄色网址 | 伊人影片| 亚洲视频入口 | 不卡一区二区在线视频 | 在线h网| 特黄做受又粗又大又硬老头 | 免费成人av在线播放 | 欧洲色av| 久久噜噜噜精品国产亚洲综合 | av噜噜| 欧美激情xxx | 欧美性猛交 | 国产欧洲亚洲 | 国产精品黑人一区二区三区 | 精品国产一区二区三区久久久蜜臀 | 无码av免费毛片一区二区 | 国产情趣视频 | 国产首页| 福利视频一二区 | 深田咏美在线x99av | 久久久久草 | 丁香婷婷激情五月 | 国产第七页 | 国产91高清 | 欧美片免费网站 | 欧洲一区二区在线 | 中文字幕精品一区久久久久 | 男女激情四射网站 | 日本国产精品一区 | 中文字幕在线观看第二页 | 国产清纯在线 | av老司机久久 | 爱情岛亚洲首页论坛小巨 | 欧美国产高清 | 久久2018| 四虎av| 一级黄色片在线观看 | 欧美日韩中文字幕视频 | 国产人妖ts重口系列网站观看 | 欧美激情视频一区二区三区在线播放 | 美日韩精品 | 国产成人在线观看网站 | 九一国产精品 | 久久久国产成人 | 麻豆av在线免费观看 | 国产精品视频 | 操极品少妇 | 中文字幕乱码一区二区 | 日日操夜夜撸 | 2018自拍偷拍 | 色婷婷精品国产一区二区三区 | 男女日批在线观看 | 欧美一区二区三区视频在线观看 | 色5月婷婷 | 又爽av| 国产日韩欧美亚洲 | 国产嫩bbwbbw高潮 | 在线亚洲网站 | 精品婷婷色一区二区三区蜜桃 | 国产主播99 | 91在线欧美 | 无码国产伦一区二区三区视频 | 欧美黄色影院 | 久久久久久久伊人 | 亚洲欧洲成人 | 欧美成人动态图 | 国产中文在线播放 |