原理:Android手勢識別其實和我們平常對觸摸事件的處理是一樣的,都是對MotionEvent事件進行計算處理。
Android為我們提供了兩個基本的手勢識別。
- GestureDetector:單手勢識別,可以識別按下,單擊,雙擊,長按,滑動,fling滑動。
- ScaleGestureDetector:縮放手勢識別,
1. GestureDetector單手勢識別
GestureDetector中有兩個重要接口,
- OnGestureListener,識別單次點擊,滑動,fling滑動的接口。
- OnDoubleTapListener: 識別雙擊回調的接口。
Android為了我們使用方便,給我們提供了SimpleOnGestureListener類,該類包含了上述兩個接口,我們可以根據需要選擇性實現方法。
eg:
GestureDetector gestureDetector = new GestureDetector(requireActivity(), new GestureDetector.SimpleOnGestureListener() {
//按下時觸發
public boolean onDown(MotionEvent e) {
return true;
}
//按下onDown很短時間沒有離開觸發,單純快速點擊不會觸發,一般不使用該方法。
public void onShowPress(MotionEvent e) {
}
//觸摸抬起時觸發,如果只是單純的單擊很快執行順序為onDown-->onSingleTapUp,長按不會觸發該事件
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
//滑動觸發
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
//快速滑動后的Fling滑動, velocityX表示x方向速度
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
//長按觸發,長按的觸發順序為onDown-->onShowPress->onLongPress
public void onLongPress(MotionEvent e) {
}
//單擊確認觸發,發生在onSingleTapUp之后,抬起后才能確認是否是單擊
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
//雙擊確認觸發,
public boolean onDoubleTap(MotionEvent e) {
return false;
}
//雙擊過程中發生的事件,一般不用
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
});
上面為單手勢實例化,使用時直接將觸摸事件傳遞進GestureDetector即可,
gestureDetector.onTouchEvent(e);
2. ScaleGestureDetector縮放
縮放手勢識別使用方式和GestureDetector一樣,而且回調接口比較簡單
ScaleGestureDetector gestureDetector = new ScaleGestureDetector(requireActivity(), new
ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override //開始縮放
public boolean onScaleBegin(ScaleGestureDetector detector) {
return super.onScaleBegin(detector);
}
@Override //縮放回調
public boolean onScale(ScaleGestureDetector detector) {
return super.onScale(detector);
}
@Override //結束縮放
public void onScaleEnd(ScaleGestureDetector detector) {
super.onScaleEnd(detector);
}
});
3. 自定義手勢識別
Android的手勢識別都是對觸摸的計算,可以根據自己需要的邏輯來自己定義識別,可以研究試下GestureDetector與ScaleGestureDetector源碼,
這里的源碼是別人寫的,我這里只做引用使用。
4. 其他觸摸計算輔助類 VelocityTracker
VelocityTracker是用來計算滑動速度的,通常用戶快速滑動后我們會根據用戶的滑動速度來再加一段自動滑動(Fling滑動)。使用方式也簡單。各個手勢識別中一般也都用到它。
-
初始化。
VelocityTracker tracker = VelocityTracker.obtain();
-
將觸摸事件添加到計算數據中。多次添加,一般每個觸摸事件都添加進入
tracker.addMovement(motionEvent);
-
獲得滑動速度之前,先計算,計算之前添加的數據才有速度結果
//1000 計算結果速度的時間,這里是1000ms多少像素, 5f表示想要得到的速度的最大值。 tracker.computeCurrentVelocity(1000, 5f)
-
獲取滑動速度
tracker.getXVelocity(); tracker.getYVelocity()
-
清除VelocityTracker中原有的數據
tracker.clear(); //相當于初始化之后的狀態
-
用完記得最后回收
tracker.recycler();