GestureDetector简单使用

来源:互联网 发布:组态王软件代理 编辑:程序博客网 时间:2024/05/22 16:57
话说onTouch也可以记录按下抬起等简单的手势,但是太过简单且考虑到生命周期等的原因,故google专门为我们提供了一个手势类(GestureDetector)

  它有两个接口 :
                   1.OnGestureListener 
                                                              2.SimpleOnGestureListener
区别在于第一个是完整的所有手势,第二个顾名思义就是简单的,常用的手势

```
 GestureDetector  gdt=new GestureDetector(mContext, new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
            //用户按下屏幕就会触发;
                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {
          //如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行
            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
            //一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件
                return false;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
  //在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法
        //    velocityX:X轴上的移动速度,像素/秒
        //    velocityY:Y轴上的移动速度,像素/秒  
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {
           //长按
            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
          //       滑屏,用户按下触摸屏、快速移动后松开
         //        velocityX:X轴上的移动速度,像素/秒
        //        velocityY:Y轴上的移动速度,像素/秒   
                return false;
            }

        });
```

定义好上面的代码。最后在Activity中的onTouch中将事件交给GestureDetector就可以了

```
public boolean onTouch(View v, MotionEvent event) {  
    return gdt.onTouchEvent(event);     
}  
```



如何在Fragment中使用GestureDetector?
   思路:在Activity中创建接口,将onTouch的事件传递到接口的方法,调用方在实现接口并传入自己的GestureDetector即可

 1.创建接口:

```
    //在Activity的dispatchTouchEvent方法中将event事件传递给实现接口的那一方
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        for (MyOnTouchListener listener : onTouchListeners) {
            listener.onTouch(ev);
        }
        return super.dispatchTouchEvent(ev);
    }

    //绑定监听
    public void registerMyOnTouchListener(MyOnTouchListener myOnTouchListener) {
        onTouchListeners.add(myOnTouchListener);
    }

    //取消监听
    public void unregisterMyOnTouchListener(MyOnTouchListener myOnTouchListener) {
        onTouchListeners.remove(myOnTouchListener);
    }

    public interface MyOnTouchListener {
        public boolean onTouch(MotionEvent ev);
    }
```

 2.在Fragment中使用手势
```
     /**创建手势*/
        gdt = new GestureDetector(mContext, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public void onLongPress(MotionEvent e) {
                super.onLongPress(e);
                shifoushuaxing = false;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                shifoushuaxing = true;
                return true;
            }
        });
        //实现接口
        MainActivity.MyOnTouchListener myOnTouchListener = new MainActivity.MyOnTouchListener() {
            @Override
            public boolean onTouch(MotionEvent ev) {
                boolean result = gdt.onTouchEvent(ev);
                return result;
            }
        };
        //绑定
        ((MainActivity) getActivity())
                .registerMyOnTouchListener(myOnTouchListener);
```
0 0