常用鏈接

          統計

          最新評論

          GestureDetector手勢識別類 (轉)

          View是在onTouchEvent(MotionEvent event)里對用戶的動作做了一定的分析,從而通知我們是發生了點擊還是長按等事件。

          我們需要創建一個GestureDetector的對象,傳入listener對象,view接收到的onTouchEvent中將event傳給GestureDetector進行分析listener會回調給我們相應的動作。其中GestureDetector.SimpleOnGestureListenerFramework幫我們簡化了)是實現了上面提到的OnGestureListenerOnDoubleTapListener兩個接口的類,我們只需要繼承它并重寫其中我們關心的回調即可。

          ,那么,這個類如何使用呢?以下是使用該類的一個范例:

          private GestureDetector mGestureDetector;

          @Override

          public void onCreate(Bundle savedInstanceState) {


            super.onCreate(savedInstanceState);


            mGestureDetector = new GestureDetector(this, new MyGestureListener());


          }


          @Override

          public boolean onTouchEvent(MotionEvent event) {

           return mGestureDetector.onTouchEvent(event); 

          /*  有關上面的 onTouchEvent方法,我們可以直接判斷MotionEvent的類型,

              對于手勢移動僅僅捕獲ACTION_MOVE即可,

              我們通過參數MotionEvent e1, MotionEvent e2,float distanceX, float distanceY可以獲取操作變化。

             比如 distanceX > 0 向右邊移動,distanceX < 0 則向左邊,distanceY > 0 向上滾動, distanceY < 0 向下滾動。

          */

          }


          class MyGestureListener extends GestureDetector.SimpleOnGestureListener{

            @Override

            public boolean onSingleTapUp(MotionEvent ev) {

              Log.d("onSingleTapUp",ev.toString());

              return true;

            }


            @Override

            public void onShowPress(MotionEvent ev) {

              Log.d("onShowPress",ev.toString());

            }


            @Override

            public void onLongPress(MotionEvent ev) {

              Log.d("onLongPress",ev.toString());

            }

          }

           


          更多的回調消息,方便的對用戶的動作進行響應

          public interface OnGestureListener {

                          // Touch down時觸發, edown時的MotionEvent

                          boolean onDown(MotionEvent e);

                          // Touch down之后一定時間(115ms)觸發,edown時的MotionEvent

                          void onShowPress(MotionEvent e);

                          // Touch up時觸發,eup時的MotionEvent

                          boolean onSingleTapUp(MotionEvent e);

                          // 滑動時觸發,e1down時的MotionEvente2move時的MotionEvent

                          boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);

                          // Touch down之后一定時間(500ms)觸發,edown時的MotionEvent

                          void onLongPress(MotionEvent e);

                          // 滑動一段距離,up時觸發,e1down時的MotionEvente2up時的MotionEvent

                          boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);

          } 

          public interface OnDoubleTapListener {

                          // 完成一次單擊,并確定沒有二擊事件后觸發(300ms),edown時的MotionEvent

                          boolean onSingleTapConfirmed(MotionEvent e);

                          // 第二次單擊down時觸發,e為第一次down時的MotionEvent

                          boolean onDoubleTap(MotionEvent e);

                          // 第二次單擊down,moveup時都觸發,e為不同時機下的MotionEvent

                          boolean onDoubleTapEvent(MotionEvent e);

          }

          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了還沒有滑動時觸發
          (與onDown,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


          posted on 2011-02-16 15:03 九寶 閱讀(544) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 南和县| 从江县| 雅安市| 阿拉善左旗| 花垣县| 安塞县| 宁武县| 怀化市| 外汇| 奉贤区| 贵定县| 稷山县| 大同市| 南安市| 辽宁省| 运城市| 新竹县| 加查县| 新乡市| 北安市| 和林格尔县| 淮安市| 平遥县| 叙永县| 林甸县| 通化县| 罗定市| 阿拉善右旗| 衡东县| 泾源县| 武陟县| 名山县| 普兰店市| 新化县| 亚东县| 共和县| 栾城县| 家居| 依兰县| 新野县| 林州市|