Gesture手勢筆記

首先引入網上查到的比較好的資料:

http://wayfarer.javaeye.com/blog/460284

http://goro.javaeye.com/blog/402163

http://www.williamhua.com/2009/04/23/android-touchscreen-gesture-recogniton/

總結一下:

1.onGestureListener得和onTouchListener配合使用,因爲只有onTouchListener纔是實際的監聽到用戶的觸摸,它把它所有監聽到的用戶觸摸通知"手勢識別類"即GestureDetector對象,手勢識別類對象處理後觸發對應的函數,例如onFling, onLongPress等等。

2.若要讓事件不再繼續傳遞下發,返回true,如onFling,onScroll,onSingleTapUp

      3.MotionEvent 中getX是獲取以widget左上角爲座標原點計算的X軸座標值,getRawX 獲取的是以屏幕左上角爲座標原點計算的X軸座標值.

  4.長按後滑動無效,GestureDetector默認是打開LongPress通知的,但是有個問題,長按後,手不離開屏幕且滑動,這個時候發現沒有滑動事件。而在monolith的HomeScreen中,需要的正是長按之後的滑動,長按不需要。

這個問題的解決辦法是設置手勢識別對象,禁止產生長按事件

mGestureDetector.setIsLongpressEnabled(false);

 當然,沒有禁用長按事件,滑動事件還是有效的,只是要確保觸屏後馬上滑動,不要等系統產生了長按。

5.新建一個類繼承SimpleOnGestureListener可以實現以下event事件。
      boolean  onDoubleTap(MotionEvent e)
      解釋:雙擊的第二下Touch down時觸發
     boolean  onDoubleTapEvent(MotionEvent e)
     解釋:雙擊的第二下Touch down和up都會觸發,可用e.getAction()區分。
     boolean  onDown(MotionEvent e)
     解釋:Touch down時觸發
     boolean  onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
     解釋:Touch了滑動一點距離後,up時觸發。
     void  onLongPress(MotionEvent e)
     解釋:Touch了不移動一直Touch down時觸發
    boolean  onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
    解釋:Touch了滑動時觸發。
    void  onShowPress(MotionEvent e)
    解釋:Touch了還沒有滑動時觸發 (與onShowPress,onLongPress比較 onDown只要Touch down一定立刻觸發。而Touchdown後過一會沒有滑動先觸發onShowPress再是onLongPress。所以Touchdown後一直不滑動,onDown->onShowPress->onLongPress這個順序觸發。
    boolean  onSingleTapConfirmed(MotionEvent e)
    boolean  onSingleTapUp(MotionEvent e)
    解釋:上面這兩個函數都是在touch down後又沒有滑動(onScroll),又沒有長按(onLongPress),然後Touchup時觸發。
   點擊一下非常快的(不滑動)Touchup:
   onDown->onSingleTapUp->onSingleTapConfirmed
   點擊一下稍微慢點的(不滑動)Touchup:
   onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
   2)在view的新建一個GestureDetector的對象。
    構造函數裏
    gestureDetector = new GestureDetector(new HahaGestureDetectorListener());
    然後在View的onTouchEvent裏以下這樣用

@Override
public boolean onTouchEvent(MotionEvent event) {
    gestureDetector.onTouchEvent(event);
}


然後就可以在HahaGestureDetectorListener的事件裏寫自己的代碼了。

     注意:SimpleOnGestureListener沒有提供onUp(), 還得在View的 onTouchEvent的 case MotionEvent.ACTION_UP: 裏來寫對應的代碼。

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