..
GestureDetector
在 android 開發過程中,經常需要對一些手勢,如:單擊、雙擊、長按、滑動、縮放等,進行監測。
這時也就引出了手勢監測的概念,所謂的手勢監測,也就是GestureDetector 。
一般情況下,我們知道View類有個View.OnTouchListener內部接口,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個方法太過簡單,如果需要處理一些複雜的手勢,用這個接口就會很麻煩。
Android sdk給我們提供了GestureDetector(類,通過這個類我們可以識別很多的手勢,主要是通過他的onTouchEvent(event)方法完成了不同手勢的識別。
雙擊
比如實現雙擊,正常的邏輯是:
- 首先重寫 onTouchEvent 方法
- 當第一次點擊後,咱們先判斷是否爲需要監聽的控件
- 如果是則 new 一個線程,開始倒計時(如 1s)
- 如果在這個倒計時的期間,再次調用了點擊事件
- 判斷成功、發生雙擊事件
這樣閒的邏輯很麻煩。
GestureDetector這個類對外提供了兩個接口和一個外部類
接口:OnGestureListener,OnDoubleTapListener
內部類:SimpleOnGestureListener
這個外部類,其實是兩個接口中所有函數的集成,它包含了這兩個接口裏所有必須要實現的函數而且都已經重寫,但所有方法體都是空的;不同點在於:該類是static class,我們可以在外部繼承這個類,重寫裏面的手勢處理方法。
GestureDetector.OnGestureListener
監聽類中有六個函數要重寫:
- OnDown(MotionEvent e)
用戶按下屏幕就會觸發; - onShowPress(MotionEvent e)
如果是按下的時間超過瞬間,而且在按下的時候沒有鬆開或者是拖動的,那麼onShowPress就會執行。 - onLongPress(MotionEvent e)
長按觸摸屏,超過一定時長,就會觸發這個事件
觸發順序:
onDown->onShowPress->onLongPress - onSingleTapUp(MotionEvent e)
從名子也可以看出,一次單獨的輕擊擡起操作,也就是輕擊一下屏幕,立刻擡起來,纔會有這個觸發,當然,如果除了Down以外還有其它操作,那就不再算是Single操作了,所以也就不會觸發這個事件
觸發順序:
點擊一下非常快的(不滑動)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
點擊一下稍微慢點的(不滑動)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed - onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY)
滑屏,用戶按下觸摸屏、快速移動後鬆開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發
參數解釋:
e1:第1個ACTION_DOWN MotionEvent
e2:最後一個ACTION_MOVE MotionEvent
velocityX:X軸上的移動速度,像素/秒
velocityY:Y軸上的移動速度,像素/秒 - onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY)
在屏幕上拖動事件。無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發,這個方法 在ACTION_MOVE動作發生時就會觸發
滑屏:手指觸動屏幕後,稍微滑動後立即鬆開
onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
拖動
onDown------》onScroll----》onScroll------》onFiling
代碼實例:
private class gesturelistener implements GestureDetector.OnGestureListener{
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
// TODO Auto-generated method stub
return false;
}
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// TODO Auto-generated method stub
return false;
}
}
GestureDetector.OnDoubleTapListener
雙擊監聽,主要實現三個函數:
- onSingleTapConfirmed(MotionEvent e)
單擊事件。用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊爲SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。
觸發順序是:OnDown->OnsingleTapUp->OnsingleTapConfirmed - onDoubleTap(MotionEvent e)
雙擊事件 - onDoubleTapEvent(MotionEvent e)
雙擊間隔中發生的動作。指觸發onDoubleTap以後,在雙擊之間發生的其它動作,包含down、up和move事件.
實例代碼:
private class doubleTapListener implements GestureDetector.OnDoubleTapListener{
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public boolean onDoubleTap(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
}