GestureDetector手势识别

☆樱花仙子☆ 提交于 2020-02-16 22:05:53

1 简介

手势识别在 Android 开发中也是非常常见,我们通过设置监听 View.onTouchListener 接口,重写 onTouch(View v, MotionEvent event) 可以处理一些触摸事件,但是在处理一些复杂事件,诸如双击、滚动、拖动等还有有点难以处理,这时候就需要使用到 GestureDetector 手势识别。GestureDetector 提供了两个接口(onGestureListeneronDoubleTapListener)和一个类(SimpleOnGestureListener),来方便开发人员进行开发,下面我们来一一讲解。

2 使用

2.1 onGestureListener

检测用户如下操作:轻触屏幕、触摸屏幕瞬间、长按、轻击、滑屏、拖动。

//step1: 创建 GestureDetector
//有 3 个构造函数,我们使用第二个
//1.GestureDetector gestureDetector = new GestureDetector(GestureDetector.OnGestureListener listener);
//2.GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
//3.GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener() {
            /**
             * 1.用户轻触屏幕触发
             * @param e 触摸事件
             * @return
             */
            @Override
            public boolean onDown(MotionEvent e) {
                return false;
            }

            /**
             * 2.用户轻触屏幕,但是没有松开或者拖动触发
             * @param e 触摸事件
             */
            @Override
            public void onShowPress(MotionEvent e) {

            }

            /**
             * 3.用户轻触屏幕后抬起触发
             * @param e 触摸事件
             * @return
             */
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return false;
            }


            /**
             * 4.用户在屏幕上拖动触发
             * @param e1  第一个 ACTION_DOWN MotionEvent
             * @param e2  最后一个 ACTION_MOVE MotionEvent
             * @param distanceX 当前 ACTION_MOVE 和上一个 ACTION_MOVE 在 X 轴上的位移量
             * @param distanceY 当前 ACTION_MOVE 和上一个 ACTION_MOVE 在 Y 轴上的位移量
             * @return
             */
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return false;
            }


            /**
             * 5.用户长按屏幕触发
             * @param e 触摸事件
             */
            @Override
            public void onLongPress(MotionEvent e) {

            }


            /**
             * 6.滑屏,用户轻触屏幕、快速移动后松开
             * @param e1 第一个 ACTION_DOWN MotionEvent
             * @param e2 最后一个 ACTION_MOVE MotionEvent
             * @param velocityX  X 轴上的移动速度,像素/秒
             * @param velocityY  Y 轴上的移动速度,像素/秒
             * @return
             */
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                return false;
            }
});
        
//step2.1: 让 GestureDetector 接管 View 的触摸事件
tv.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
       gestureDetector.onTouchEvent(event);
       //返回 true 拦截事件处理
       return true;
   }
});

//step2.2: 让 GestureDetector 接管 Activity 的触摸事件
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
   gestureDetector.onTouchEvent(ev);
   return super.dispatchTouchEvent(ev);
}

2.2 OnDoubleTapListener

检测用户如下操作:单击事件、双击事件。

//step1:先创建gestureDetector 同上

//step2:设置setOnDoubleTapListener 监听
gestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
            /**
             * 1.单击事件
             * @param e
             * @return
             */
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                return false;
            }

            /**
             * 双击事件
             * @param e 事件
             * @return
             */

            @Override
            public boolean onDoubleTap(MotionEvent e) {
                return false;
            }

            /**
             * 3.双击间隔中发生的动作,包括 down、up 和 move 事件
             * @param e
             * @return
             */
            @Override
            public boolean onDoubleTapEvent(MotionEvent e) {
                return false;
            }
});

//step3: 让 GestureDetector 接管 View 的触摸事件
tv.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
       gestureDetector.onTouchEvent(event);
       //返回 true 拦截事件处理
       return true;
   }
});

2.3 SimpleOnGestureListener

通过上面代码,我们发现通过接口的方式,必须全部重写里面的方法,比较麻烦。因此我们可以继承 SimpleOnGestureListener 来实现,SimpleOnGestureListener 主要功能:

  • 是一个类,要使用 extends,或者直接 new
  • 里面已经实现了 onGestureListenerOnDoubleTapListener 的方法,不过都是空实现,我们可以选择性的重写某些方法。
//step1: 构造 GestureDetector
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
         //例如我们只需要监听点击事件
         @Override
         public boolean onDoubleTapEvent(MotionEvent e) {
             //具体操作
             return true;
          }
});

//step2: 让 GestureDetector 接管 View 的触摸事件
tv.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
       gestureDetector.onTouchEvent(event);
       //返回 true 拦截事件处理
       return true;
   }
});
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!