Android之GestureDetector使用

..

GestureDetector

在 android 開發過程中,經常需要對一些手勢,如:單擊、雙擊、長按、滑動、縮放等,進行監測。

這時也就引出了手勢監測的概念,所謂的手勢監測,也就是GestureDetector 。

一般情況下,我們知道View類有個View.OnTouchListener內部接口,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個方法太過簡單,如果需要處理一些複雜的手勢,用這個接口就會很麻煩。


Android sdk給我們提供了GestureDetector(類,通過這個類我們可以識別很多的手勢,主要是通過他的onTouchEvent(event)方法完成了不同手勢的識別。

雙擊

比如實現雙擊,正常的邏輯是:

  1. 首先重寫 onTouchEvent 方法
  2. 當第一次點擊後,咱們先判斷是否爲需要監聽的控件
  3. 如果是則 new 一個線程,開始倒計時(如 1s)
  4. 如果在這個倒計時的期間,再次調用了點擊事件
  5. 判斷成功、發生雙擊事件

這樣閒的邏輯很麻煩。

GestureDetector這個類對外提供了兩個接口和一個外部類
接口:OnGestureListener,OnDoubleTapListener
內部類:SimpleOnGestureListener

這個外部類,其實是兩個接口中所有函數的集成,它包含了這兩個接口裏所有必須要實現的函數而且都已經重寫,但所有方法體都是空的;不同點在於:該類是static class,我們可以在外部繼承這個類,重寫裏面的手勢處理方法。

GestureDetector.OnGestureListener

監聽類中有六個函數要重寫:

  1. OnDown(MotionEvent e)
    用戶按下屏幕就會觸發;
  2. onShowPress(MotionEvent e)
    如果是按下的時間超過瞬間,而且在按下的時候沒有鬆開或者是拖動的,那麼onShowPress就會執行。
  3. onLongPress(MotionEvent e)
    長按觸摸屏,超過一定時長,就會觸發這個事件
    觸發順序:
    onDown->onShowPress->onLongPress
  4. onSingleTapUp(MotionEvent e)
    從名子也可以看出,一次單獨的輕擊擡起操作,也就是輕擊一下屏幕,立刻擡起來,纔會有這個觸發,當然,如果除了Down以外還有其它操作,那就不再算是Single操作了,所以也就不會觸發這個事件
    觸發順序:
    點擊一下非常快的(不滑動)Touchup:
    onDown->onSingleTapUp->onSingleTapConfirmed
    點擊一下稍微慢點的(不滑動)Touchup:
    onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
  5. 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軸上的移動速度,像素/秒
  6. 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

雙擊監聽,主要實現三個函數:

  1. onSingleTapConfirmed(MotionEvent e)
    單擊事件。用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊爲SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。
    觸發順序是:OnDown->OnsingleTapUp->OnsingleTapConfirmed
  2. onDoubleTap(MotionEvent e)
    雙擊事件
  3. 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;  
    }  
}  

參考

用戶手勢檢測-GestureDetector使用詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章