GestureDetector 使用简介

MotionEvent 为我们提供了一系列 ACTION 事件来响应我们的按下、抬起、移动操作,这样我们就可以判断一些动作是否出现,例如是否滑动,是否双击等等。

Android 还为我们提供了一个 GestureDetector 类来帮助我们检测一些常用手势,例如单击、双击、滑动、长按等等。

GestureDetector 可以让我们简单的检测一些常见手势,而不用对单个 ACTION 进行处理。

Android 提供了两个接口:

  • GestureDetector.OnGestureListener

  • GestureDetector.OnDoubleTapListener

这两个接口分别定义了一些常用手势方法:

  • GestureDetector.OnGestureListener

    • onDown:屏幕按下时触发
    • onShowPress:屏幕按下之后并没有立即离开手指,则会触发
    • onSingleTapUp:一次点击抬起手指之后触发(长按抬起不触发)
    • onScroll:在屏幕上滑动会触发
    • onLongPress:长按会触发
    • onFling:滑屏,用户按下触摸屏、快速移动后松开会触发
  • GestureDetector.OnDoubleTapListener

    • onSingleTapConfirmed:单击事件
    • onDoubleTap:双击事件
    • onDoubleTapEvent:在onDoubleTap发生之后,就可以在onDoubleTapEvent中监听到双击事件发生后从按下到弹起的所有触屏事件。

如果你嫌实现那么多方法麻烦,Android 还提供了一个 GestureDetector.SimpleOnGestureListener,我们可以继承该类,然后仅仅实现我们需要的方法即可。

GestureDetector 使用方法

使用 GestureDetector 有三步:

  • 创建 GestureDetector 监听器,方法有两种

    • 实现 GestureDetector.OnGestureListener 或 GestureDetector.OnDoubleTapListener 接口,并重写其方法。
    • 继承 GestureDetector.SimpleOnGestureListener,并重写需要的方法。
  • 创建 GestureDetector 对象

  • 重写 Activity、View 或 ViewGroup 的 onTouchEvent 方法,并且把所有捕获到的事件传递给 detector 实例。

示例:

public class MainActivity extends Activity {

    GestureDetector detector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        detector = new GestureDetector(this, new MyGestureDetectorListener());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        this.detector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}

class MyGestureDetectorListener extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.d("TTT", "~~~~~~~~~~~~~onFling~~~~~~~~~~~~~~~~");

        return super.onFling(e1, e2, velocityX, velocityY);
    }

    @Override
    public void onShowPress(MotionEvent e) {
        Log.d("TTT", "~~~~~~~~~~~~~onShowPress~~~~~~~~~~~~~~~~");
        super.onShowPress(e);
    }
}
Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1