標籤:自己 eve 0ms lov rri 必須 fling context get
最近在看任玉剛老師的《Android 開發藝術探索》,結合老師書上的知識和網上的資料來簡單的記錄一下自己對這些的理解
1.VelocityTracker類
VelocityTracker類是Android進行手勢的速度追蹤類,用於追蹤在滑動過程中的速度,同時包括水平速度和豎直速度。在這裡簡單的介紹一下這個使用方式。
如果我們想要追蹤一個View上面的手勢滑動速度的話,這個類肯定會用到的。其實我們也可以通過其他的方式來進行計算。
例如:
A.在DOWN事件中,記錄下當前的時間、事件的xy座標。
B.在UP事件,來進行計算。
但是這種方式有一個缺點,一個是計算起來是比較麻煩,其次是如果使用者滑動的是一個來回,相對距離就為0,那麼速度就為0,肯定是不對的。而VelocityTracker類可以簡化我們的操作。下面來介紹VelocityTracker類的用法。
(1).初始化VelocityTracker類的對象
通常我們會在View的onTouchEvent方法裡面的DOWN事件進行對VelocityTracker類初始化,通過調用VelocityTracker類的靜態方法--obtain方法獲得VelocityTracker的對象。
1 //獲得VelocityTracker類的對象2 velocityTracker = VelocityTracker.obtain();
(2).獲得速度
通常我們在UP事件時來擷取速度,不過在擷取速度時,需要注意的是:在獲得速度之前,我們設定一個東西,那麼就是單位時間,通過調用computeCurrentVelocity(int units)方法來設定一個時間段。
有人有疑問,這個有什麼用呢?比如,我們這樣說,一個速度本來是100/1000ms,也就是說是100/1s,如果我們通過調用上面的方法來設定一個單位時間的話,例如設定為5000(單位為ms),那麼速度就變為了500/5000ms。computeCurrentVelocity方法的作用就是這個!
設定完了單位時間,那麼我們可以直接調用getxVelovity()方法和getyVelocity()方法來擷取水平速度和豎直速度。
1 //註冊事件 2 velocityTracker.addMovement(event); 3 //設定單位時間 4 velocityTracker.computeCurrentVelocity(100); 5 //水平速度 6 float xVelocity = velocityTracker.getXVelocity(); 7 //豎直速度 8 float yVelocity = velocityTracker.getYVelocity(); 9 Log.i("main", "xVelocity = " + xVelocity + " yVelocity = " + yVelocity);10 break;
還需要注意的是:我們在計算速度之前,必須先調用addMoveEvent方法來註冊事件。
(3).釋放VelocityTracker對象
我們用完了VelocityTracker對象之後,必須調用clear方法和recycle方法來釋放VelocityTracker對象。通常這個操作是在UP和CANCEL裡面進行的,最好同時都要操作!
1 private void releaseVelocityTracker() {2 if (velocityTracker != null) {3 velocityTracker.clear();4 velocityTracker.recycle();5 }6 }
(4).完整的代碼
1 public class MyView extends View { 2 private VelocityTracker velocityTracker = null; 3 4 public MyView(Context context) { 5 super(context); 6 } 7 8 public MyView(Context context, @Nullable AttributeSet attrs) { 9 super(context, attrs);10 }11 12 public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {13 super(context, attrs, defStyleAttr);14 }15 16 @Override17 public boolean onTouchEvent(MotionEvent event) {18 19 switch (event.getAction()) {20 case MotionEvent.ACTION_DOWN: {21 //獲得VelocityTracker類的對象22 velocityTracker = VelocityTracker.obtain();23 break;24 }25 case MotionEvent.ACTION_MOVE: {26 //註冊事件27 velocityTracker.addMovement(event);28 //設定單位時間29 velocityTracker.computeCurrentVelocity(100);30 //水平速度31 float xVelocity = velocityTracker.getXVelocity();32 //豎直速度33 float yVelocity = velocityTracker.getYVelocity();34 Log.i("main", "xVelocity = " + xVelocity + " yVelocity = " + yVelocity);35 break;36 }37 case MotionEvent.ACTION_UP: {38 //釋放VelocityTracker對象39 releaseVelocityTracker();40 break;41 }42 case MotionEvent.ACTION_CANCEL: {43 releaseVelocityTracker();44 break;45 }46 }47 return true;48 }49 50 private void releaseVelocityTracker() {51 if (velocityTracker != null) {52 velocityTracker.clear();53 velocityTracker.recycle();54 }55 }56 }
2.GestureDetector類
手勢檢測的類,用於輔助檢查使用者的單擊、滑動、長按、雙擊等行為。GestureDetector類的使用也不是很麻煩!
(1).建立GestureDetector類的對象
需要注意的是,GestureDetector構造方法凡是不含有的Context的構造都到期,同時構造方法需要我們傳入一個OnGestureListener的對象,我們可以自己定義一個介面,實現OnGestureListener介面;也可以使用匿名內部類。介面裡面的方法解釋,待會會用一張表來表示。
(2).GestureDetector對象接管View的onTouchEvent的事件
我們只需要將View的onTouchEvent中的event傳入GestureDetector對象的onTouchEvent方法裡面去就行。
1 @Override2 public boolean onTouchEvent(MotionEvent event) {3 //gestureDetector接管事件4 return gestureDetector.onTouchEvent(event);5 }
(3).方法解釋
在OnGestureListener介面有很多的抽象方法,在這裡用一個表來展示作用
方法名 |
解釋 |
onDown |
手指輕輕觸控螢幕幕的一瞬間,由一個ACTION_DOWN觸發 |
onShowPress |
手指輕輕的觸控螢幕幕,尚未鬆動或者拖動,由一個ACTION_DOWN觸發 注意和onDown方法區別,它強調的是沒有鬆開或者拖動的狀態 |
oSingleTapUp |
手指(輕輕觸控螢幕幕之後)鬆開,伴隨著一個MotionEvent.ACTION_UP而觸發,這是單擊事件的行為 |
onScroll |
手指按下螢幕並且拖動,由一個ACTION_DOWN,多個ACTION_MOVE觸發,這是拖動行為 |
onLongPress |
使用者長久的按著螢幕不放,即長按 |
onFling |
使用者按下觸控螢幕,快速滑動後鬆開,由一個ACTION_DOWN,多個ACTION_MOVE,和一個ACTION_UP觸發, 這是快速滑動行為 |
如果我們想要實現雙擊的事件怎麼辦?在GestureDetector對象中,有一個方法setOnDoubleTapListener(OnDoubleTapListener onDoubleTapListener),可以設定雙擊事件的監聽。在這裡再解釋OnDoubleTapListener介面的方法作用。
方法名 |
解釋 |
onDoubleTap |
雙擊,由2次連續的單擊組成,它不能和onSingleTapCOnfirmed方法共存 |
onSingleTapConfirmed |
嚴格的單擊行為 注意它和onSingleTapUp的區別,如果觸發了onSingleTapConfirmed方法,那麼後面不可能再緊跟著 另一個單擊單擊行為了,即只可能是單擊,而不可能是雙擊中一次的單擊 |
onDoubleTapEvent |
表示發生了雙擊行為,在雙擊的期間,ACTION_DOWN,ACTION_MOVE和ACTION_UP都會觸發此回調 |
Android擴充-VelocityTracker、GestureDetector的使用