一文了解手势识别GestureDetector

1.简介

来下面一个一个的介绍其相关使用,先介绍它的接口使用


2.接口OnGestureListener的使用

2.1 功能

响应用户的手势操作:按下瞬间、轻击、按压、长按、快速滑屏、拖动

2.2 如何使用

/**
 * @author: lybj
 * @date: 2020/3/4
 * @Description: 实现接口GestureDetector,检测用户操作:按下瞬间、按压、长按、轻击、快速滑屏、拖动
 */
public class MyGestureListener implements GestureDetector.OnGestureListener {

    /**
     * 用户轻触触摸屏
     * */
    @Override
    public boolean onDown(MotionEvent e) {

        Log.i("lybj", "onDown");
        return false;
    }

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

        Log.i("lybj", "onShowPress");
    }

    /**
     * 用户只点击屏幕后抬起
     * */
    @Override
    public boolean onSingleTapUp(MotionEvent e) {

        Log.i("lybj", "onSingleTapUp");
        return false;
    }

    /**
     * 用户按下触摸屏 / 拖动
     * */
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

        Log.i("lybj", "onScroll");
        return false;
    }

    /**
     * 用户长按触摸屏
     */
    @Override
    public void onLongPress(MotionEvent e) {

        Log.i("lybj", "onLongPress");
    }

    /**
     * 用户按下触摸屏、快速移动后松开
     *
     * @param e1:第1个ACTION_DOWN MotionEvent
     * @param e2:最后一个ACTION_MOVE MotionEvent
     * @param velocityX:X轴上的移动速度,像素/秒
     * @param velocityY:Y轴上的移动速度,像素/秒
     * */
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        Log.i("lybj", "onFling");
        return false;
    }
}

然后看下调用

 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);

     tv_text = findViewById(R.id.tv_text);

     // OnGestureListener接口的实现类,监听:按下瞬间、按压、长按、轻击、快速滑屏、拖动
     MyGestureListener myGestureListener = new MyGestureListener();

     // 创建GestureDetector实例对象
     mGestureDetector = new GestureDetector(this, myGestureListener);

     // 监听view的事件
     tv_text.setOnTouchListener(new View.OnTouchListener() {

         @Override
         public boolean onTouch(View v, MotionEvent event) {

             Log.i("lybj", "============事件开始了================");
             mGestureDetector.onTouchEvent(event);
             return true;
         }
     });
}

2.3 需要注意的细节

1.如果轻碰下屏幕会显示

轻碰屏幕触发流程:

  • View.onTouch.down事件 ->
  • 然后触发onDown事件 ->
  • onShowPress(因为手势没有松开) ->
  • View.onTouch.up事件 ->
  • 然后触发onSingleTapUp事件

2.如果长按下屏幕会显示

长按屏幕触发流程:

  • View.onTouch.down事件 ->
  • 然后触发onDown事件 ->
  • onShowPress(因为手势没有松开) ->
  • onLongPress事件(长按) ->
  • View.onTouch.up事件

有没有很奇怪?onSingleTapUp事件为什么没有触发?

因为从名子也可以看出,一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件


3.如果快速滑动屏幕会显示

快速滑动屏幕触发流程:

  • View.onTouch.down事件 ->
  • 然后触发onDown事件 ->
  • onShowPress(因为手势没有松开) ->
  • View.onTouch.move事件 ->
  • onScroll(滑动) ->
  • View.onTouch.up事件 ->
  • onFling事件

强调一下,onFling事件只有在快速滑动后送开才会触发,如果滑动比较慢的话,则不会触发。


4.如果快速点击

快速轻碰屏幕触发流程:

  • View.onTouch.down事件 ->
  • 然后触发onDown事件 ->
  • View.onTouch.up事件 ->
  • 然后触发onSingleTapUp事件

有没有很奇怪onShowPress为什么没有触发?

从定义我们应该明白,如果是按下的时间超过瞬间才会触发,因为点击速度太快,所以没超过瞬间则不会触发,那么从这个特点,我们就能判断出点击速度是否太快等特殊要求。


3.接口OnDoubleTapListener的使用

3.1 功能

响应用户的手势操作:用户单击、双击屏幕

3.2 如何使用

/**
 * @author: lybj
 * @date: 2020/3/4
 * @Description: 实现接口OnDoubleTapListener,用户单击、双击屏幕
 */
class MyDoubleTapListener implements GestureDetector.OnDoubleTapListener {

    /**
     * 单击事件。用来判定该次点击是SingleTap而不是DoubleTap,
     * 如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,
     * 然后触发SingleTapConfirmed事件。
     *
     * 触发顺序是:OnDown-> OnsingleTapUp -> OnsingleTapConfirmed
     *
     * 关于onSingleTapConfirmed 和 onSingleTapUp 二者的区别是:
     * onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行。
     * */
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {

        Log.i("lybj", "onSingleTapConfirmed");
        return false;
    }

    /**
     * 双击事件
     * */
    @Override
    public boolean onDoubleTap(MotionEvent e) {

        Log.i("lybj", "onDoubleTap");
        return false;
    }

    /**
     * 双击间隔中发生的动作。指触发onDoubleTap以后,在双击之间发生的其它动作,包含down、up和move事件
     * */
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {

        Log.i("lybj", "onDoubleTapEvent");
        return false;
    }
}

调用方式

    // OnGestureListener 接口的实现类,监听:按下瞬间、按压、长按、轻击、快速滑屏、拖动
    MyGestureListener myGestureListener = new MyGestureListener();
        
    // OnDoubleTapListener 用户单击、双击屏幕
    MyDoubleTapListener myDoubleTapListener = new MyDoubleTapListener();

    // 创建GestureDetector实例对象
    mGestureDetector = new GestureDetector(this, myGestureListener);
    mGestureDetector.setOnDoubleTapListener(myDoubleTapListener);

3.3 需要注意的细节

1.如果单击下屏幕会显示

根据上面解释的,我们知道SingleTapConfirmed事件。当单击抬起后就会触发


2.如果双击下屏幕会显示

从双击来看我们可以区分了 SingleTapConfirmed事件和 onSingleTapUp 的区别了。

onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行。

onDoubleTapEvent代表了在双击事件中发生了其他事件。


4.类SimpleOnGestureListener的使用

4.1 功能

集成了两个接口的手势检测功能,OnGestureListener和OnDoubleTapListener接口里的函数都是强制必须重写的
而SimpleOnGestureListener类的函数则可根据需要选择性复写,因为SimpleOnGestureListener类本身已经实现了这两个接口的所有函数,只是里面全是空的而已

4.2 如何使用

    mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){
            
            ...
    });
原创文章 34 获赞 89 访问量 19万+

猜你喜欢

转载自blog.csdn.net/u010302765/article/details/104659428