標籤:
滑動處理需要用到的各種工具類:
android.view.VelocityTracker
android.view.OverScroller
android.view.ViewConfiguration
VelocityTracker類
主要用跟蹤觸控螢幕事件(flinging事件和其他gestures手勢事件)的速率。
用addMovement(MotionEvent)函數將Motion event加入到VelocityTracker類執行個體中。你可以使用getXVelocity() 或getXVelocity()獲得橫向和豎向的速率,但是使用它們之前請先調用computeCurrentVelocity(int units)來初始化速率的單位 。
computeCurrentVelocity(int units, float maxVelocity)
unitis表示速率的基本時間單位。unitis值為1的表示是,一毫秒時間單位內運動了多少個像素, unitis值為1000表示一秒(1000毫秒)時間單位內運動了多少個像素maxVelocity表示速率的最大值
1 @Override 2 public boolean onTouchEvent(MotionEvent event) { 3 // 獲得允許執行一個fling手勢動作的最大速度值 4 int mMaximumVelocity = ViewConfiguration.get(context) 5 .getScaledMaximumFlingVelocity(); 6 7 // 執行個體化 8 VelocityTracker mVelocityTracker = VelocityTracker.obtain(); 9 mVelocityTracker.addMovement(event);10 int action = event.getAction();11 float y = event.getY();12 13 switch (action) {14 case MotionEvent.ACTION_DOWN:15 16 return true;17 case MotionEvent.ACTION_MOVE:18 19 break;20 case MotionEvent.ACTION_CANCEL:21 // 回收22 mVelocityTracker.recycle();23 24 break;25 case MotionEvent.ACTION_UP:26 // 初始化速率的單位27 mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);28 int velocityY = (int) mVelocityTracker.getYVelocity();29 30 // 回收31 mVelocityTracker.recycle();32 33 break;34 }35 36 return super.onTouchEvent(event);37 }
OverScroller類
是為了實現View平滑滾動的一個Helper類。它的作用就是輔助記錄和計算我們滑動的距離和速度這些,用於自訂移動時幫我們處理掉數學的計算部分。
1 OverScroller mScroller = new OverScroller(context);2 //滾動,startX, startY為開始滾動的位置,dx,dy為滾動的位移量, duration為完成滾動的時間3 mScroller.startScroll(int startX, int startY, int dx, int dy) 4 //使用預設完成時間250ms5 mScroller.startScroll(int startX, int startY, int dx, int dy, int duration)6 //傳回值為boolean,true說明滾動尚未完成,false說明滾動已經完成。7 mScroller.computeScrollOffset()
設定mScroller滾動的位置時,並不會導致View的滾動,通常是用mScroller記錄/計算View滾動的位置,再重寫View的computeScroll(),完成實際的滾動。
ViewConfiguration類
這個類主要定義了UI中所使用到的標準常量,像逾時、尺寸、距離,如果我們需要得到這些常量的資料,我們就可以通過這個類來擷取
1 //獲得觸發移動事件的最短距離,如果小於這個距離就不觸發行動控制項2 int mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();3 //獲得允許執行一個fling手勢動作的最大速度值4 int mMaximumVelocity = ViewConfiguration.get(context).getScaledMaximumFlingVelocity();5 //獲得允許執行一個fling手勢動作的最小速度值6 int mMinimumVelocity = ViewConfiguration.get(context).getScaledMinimumFlingVelocity();
如果布局控制項以及其子控制項的尺寸進行精確的控制那就要重寫下面這個方法了
onMeasure(int widthMeasureSpec, int heightMeasureSpec)
Android自訂View滑動事件處理總結