詳解Android View的事件體系 之View基礎(二)
前言
掌握View的事件體系是Android 向高階邁向的必經之路,本片部落格講解Android View的相關基礎知識第二部分,後面我們會為大家講解View事件體系、View事件分發等知識內容。View相關知識第一部分https://blog.csdn.net/huangliniqng/article/details/83933241
1.View基礎
1.1 手勢檢測GestureDetector
首先我們看一下官方API對GestureDetector的介紹:
GestureDetector 可以檢測到使用者的點選、雙擊、長按等事件,該類為我們提供了三個介面和一個內部類。
名稱 | 作用 |
GestureDetector.OnContextClickListener | 上下文單擊 |
GestureDetector.OnDoubleTapListener | 雙擊 |
GestureDetector.OnGestureListener | 檢測到手勢 |
GestureDetector.SimpleOnGestureListener | 事件子集 |
1.1.1 GestureDetector.OnGestureListener
首先我們和上篇部落格中提到的一樣,新建一個繼承自View的類,同時讓這個類實現GestureDetector.OnGestureListener介面,我們可以看到該介面複寫了下述方法
@Override public boolean onDown(MotionEvent e) { return false; } @Override public void onShowPress(MotionEvent e) { } @Override public boolean onSingleTapUp(MotionEvent e) { return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } @Override public void onLongPress(MotionEvent e) { Log.d(TAG,"長按了"); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; }
通過 gestureDetector = new GestureDetector(this); 初始化gestureDetector,在View的OnTouchEvent事件中,交給gestureDetector來處理即,gestureDetector.onTouchEvent(event);這裡我們只看onLongPress方法,顧名思義就是長按時觸發的事件,我們在方法中列印Log,當我們的手指在View上長按之後列印日誌如下:
1.1.2 GestureDetector.OnDoubleTapListener
接著我們讓View實現GestureDetector.OnDoubleTapListener介面,我們可以看到該介面實現了下列方法:
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.d(Tag,"雙擊Tap");
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.d(Tag,"雙擊TapEvent");
return false;
}
既然是雙擊實現,那麼我們在這裡只關心onDoubleTapEvent和onDoubleTap方法,我們在上述兩個方法中列印日誌,我們在View上雙擊,列印日誌如下:
由此可知onDoubleTapEvent 是雙擊方法結束時呼叫,onDoubleTap是雙擊發生時第一次和第二次間隔時間所觸發的,如果只是單擊onDoubleTap不會觸發。
其實除了雙擊事件或者說包括雙擊事件,都是可以直接通過onTouchEvent()方法判斷出來的,開發時開發者可根據自己需求自己選擇。
1.2 VelocityTracker
翻譯過來就是追蹤速度,可以判斷滑動的速度以及單擊的速度,首先我們獲取VelocityTracker物件velocityTracker = VelocityTracker.obtain();在View的onTouchEvent方法中新增:velocityTracker.addMovement(event);
首先要計算速度,計算速度傳入計算的時間差值,那麼求得的速度就是每畫素/時間差,比如我們計算在1S內的速度,程式碼如下:
velocityTracker.computeCurrentVelocity(1000);
int x = (int) velocityTracker.getXVelocity();
int y = (int) velocityTracker.getYVelocity();
x和y分別為一秒內在x軸滑過的畫素和一秒內在y軸滑過的畫素。
有view座標系可以知道,如果在x軸從右向左滑動,那麼計算出來的速度為負值。不適用的時候使用clear方法和recycle方法進行記憶體回收。
github:https://github.com/huanglinqing123
歡迎關注技術公眾號,微訊號搜尋ColorfulCode 程式碼男人
分享技術文章,投稿分享,不限技術種類,不限技術深度,讓更多人因為分享而受益。