原理:Android手勢(shì)識(shí)別其實(shí)和我們平常對(duì)觸摸事件的處理是一樣的,都是對(duì)MotionEvent事件進(jìn)行計(jì)算處理加缘。
Android為我們提供了兩個(gè)基本的手勢(shì)識(shí)別啼染。
- GestureDetector:單手勢(shì)識(shí)別掏觉,可以識(shí)別按下,單擊沈善,雙擊乡数,長(zhǎng)按,滑動(dòng)闻牡,fling滑動(dòng)瞳脓。
- ScaleGestureDetector:縮放手勢(shì)識(shí)別,
1. GestureDetector單手勢(shì)識(shí)別
GestureDetector中有兩個(gè)重要接口澈侠,
- OnGestureListener劫侧,識(shí)別單次點(diǎn)擊,滑動(dòng)哨啃,fling滑動(dòng)的接口烧栋。
- OnDoubleTapListener: 識(shí)別雙擊回調(diào)的接口。
Android為了我們使用方便拳球,給我們提供了SimpleOnGestureListener類审姓,該類包含了上述兩個(gè)接口,我們可以根據(jù)需要選擇性實(shí)現(xiàn)方法祝峻。
eg:
GestureDetector gestureDetector = new GestureDetector(requireActivity(), new GestureDetector.SimpleOnGestureListener() {
//按下時(shí)觸發(fā)
public boolean onDown(MotionEvent e) {
return true;
}
//按下onDown很短時(shí)間沒有離開觸發(fā)魔吐,單純快速點(diǎn)擊不會(huì)觸發(fā),一般不使用該方法莱找。
public void onShowPress(MotionEvent e) {
}
//觸摸抬起時(shí)觸發(fā)酬姆,如果只是單純的單擊很快執(zhí)行順序?yàn)閛nDown-->onSingleTapUp,長(zhǎng)按不會(huì)觸發(fā)該事件
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
//滑動(dòng)觸發(fā)
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
//快速滑動(dòng)后的Fling滑動(dòng), velocityX表示x方向速度
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
//長(zhǎng)按觸發(fā)奥溺,長(zhǎng)按的觸發(fā)順序?yàn)閛nDown-->onShowPress->onLongPress
public void onLongPress(MotionEvent e) {
}
//單擊確認(rèn)觸發(fā)辞色,發(fā)生在onSingleTapUp之后,抬起后才能確認(rèn)是否是單擊
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
//雙擊確認(rèn)觸發(fā)浮定,
public boolean onDoubleTap(MotionEvent e) {
return false;
}
//雙擊過程中發(fā)生的事件相满,一般不用
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
});
上面為單手勢(shì)實(shí)例化,使用時(shí)直接將觸摸事件傳遞進(jìn)GestureDetector即可桦卒,
gestureDetector.onTouchEvent(e);
2. ScaleGestureDetector縮放
縮放手勢(shì)識(shí)別使用方式和GestureDetector一樣立美,而且回調(diào)接口比較簡(jiǎn)單
ScaleGestureDetector gestureDetector = new ScaleGestureDetector(requireActivity(), new
ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override //開始縮放
public boolean onScaleBegin(ScaleGestureDetector detector) {
return super.onScaleBegin(detector);
}
@Override //縮放回調(diào)
public boolean onScale(ScaleGestureDetector detector) {
return super.onScale(detector);
}
@Override //結(jié)束縮放
public void onScaleEnd(ScaleGestureDetector detector) {
super.onScaleEnd(detector);
}
});
3. 自定義手勢(shì)識(shí)別
Android的手勢(shì)識(shí)別都是對(duì)觸摸的計(jì)算,可以根據(jù)自己需要的邏輯來自己定義識(shí)別方灾,可以研究試下GestureDetector與ScaleGestureDetector源碼建蹄,
這里的源碼是別人寫的,我這里只做引用使用迎吵。
4. 其他觸摸計(jì)算輔助類 VelocityTracker
VelocityTracker是用來計(jì)算滑動(dòng)速度的躲撰,通常用戶快速滑動(dòng)后我們會(huì)根據(jù)用戶的滑動(dòng)速度來再加一段自動(dòng)滑動(dòng)(Fling滑動(dòng))。使用方式也簡(jiǎn)單击费。各個(gè)手勢(shì)識(shí)別中一般也都用到它拢蛋。
-
初始化。
VelocityTracker tracker = VelocityTracker.obtain();
-
將觸摸事件添加到計(jì)算數(shù)據(jù)中蔫巩。多次添加谆棱,一般每個(gè)觸摸事件都添加進(jìn)入
tracker.addMovement(motionEvent);
-
獲得滑動(dòng)速度之前快压,先計(jì)算,計(jì)算之前添加的數(shù)據(jù)才有速度結(jié)果
//1000 計(jì)算結(jié)果速度的時(shí)間垃瞧,這里是1000ms多少像素蔫劣, 5f表示想要得到的速度的最大值。 tracker.computeCurrentVelocity(1000, 5f)
-
獲取滑動(dòng)速度
tracker.getXVelocity(); tracker.getYVelocity()
-
清除VelocityTracker中原有的數(shù)據(jù)
tracker.clear(); //相當(dāng)于初始化之后的狀態(tài)
-
用完記得最后回收
tracker.recycler();