android 手勢 GestureDetector

當用戶觸摸屏幕的時候,會產生許多手勢,例如down,up,scroll,filing等等。
一般情況下,我們知道View類有個View.OnTouchListener內部接口,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件.

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

 // 自定義view中重寫onTouchEvent方法
 @Override
  public boolean onTouchEvent(MotionEvent event) {
      return mGestureDetector.onTouchEvent(event);
  }

  private GestureDetector mGestureDetector;

// 實現自定義的手勢方法
     private void initGestureDetector() {
    mGestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            doClickAction((int) e.getX(), (int) e.getY());
            return true;
        }
    });
}

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

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

一、GestureDetector.
OnGestureListener/ OnDoubleTapListener/SimpleOnGestureListener
一般使用SimpleOnGestureListener,可以根據需要重寫以下方法,注意方法使用的場景

 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

可見,無論是滑屏,還是拖動,影響的只是中間OnScroll觸發的數量多少而已,最終都會觸發onFling事件!

雙擊事件:

- onSingleTapConfirmed(MotionEvent e):可以確認(通過單擊DOWN后300ms沒有下一個DOWN事件確認)這不是一個雙擊事件,而是一個單擊事件的時候會回調。 
- onDoubleTap(MotionEvent e):可以確認這是一個雙擊事件的時候回調。 
- onDoubleTapEvent(MotionEvent e):onDoubleTap()回調之后的輸入事件(DOWN、MOVE、UP)都會回調這個方法(這個方法可以實現一些雙擊后的控制,如讓View雙擊后變得可拖動等)

注:上面所有的回調方法的返回值都是boolean類型,和View的事件傳遞機制一樣,返回true表示消耗了事件,flase表示沒有消耗。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone閱讀 998評論 0 1
  • View的事件體系 View的基礎 view位置參數View的位置主要由它的四個頂點來決定,分別對應于View的四...
    MZzF2HC閱讀 539評論 0 2
  • 單位舉行的讀書推薦比賽,我很榮幸地進入了決賽。由于方式由比賽變成了展演,因此選拔出來的選手都要進行專業老師的培訓。...
    儒媛閱讀 238評論 0 0
  • 今天上午和大寶一起制定了寒假計劃,當然中間也穿插了玩的時間,她對寒假計劃非常滿意,熱情很高。今天執行的也不錯(因字...
    經常不在線h閱讀 168評論 0 0
  • 有一個廣為流傳的理論叫“短板效應”,或者叫“木桶理論”,它指的是一只木桶能裝多少水取決于它的短板。對應短板...
    艾小農閱讀 122評論 0 0