使用示例:

  1. // 1.创建一个监听回调
  2. SimpleOnGestureListener listener = new SimpleOnGestureListener() {
  3. @Override public boolean onDoubleTap(MotionEvent e) {
  4. Toast.makeText(MainActivity.this, "双击666", Toast.LENGTH_SHORT).show();
  5. return super.onDoubleTap(e);
  6. }
  7. };
  8. // 2.创建一个检测器
  9. final GestureDetector detector = new GestureDetector(this, listener);
  10. // 3.给监听器设置数据源
  11. view.setOnTouchListener(new View.OnTouchListener() {
  12. @Override public boolean onTouch(View v, MotionEvent event) {
  13. return detector.onTouchEvent(event);
  14. }
  15. });

构造方法

构造方法
GestureDetector(Context context, GestureDetector.OnGestureListener listener)
GestureDetector(Context context, GestureDetector.OnGestureListener listener, Handler handler)

第 1 种构造方法中没有传 Handler, 内部会自动构建一个 Handler, Handler 中的 Looper 会从主线程获取
第 2 种构造方法中的 Handler主要是为了提供一个 Looper, 内部会根据提供的 Looper 重新创建Handler

注: 无论是第一种还是第二种构造方法, 在非主线程创建可能会因为无法获取到 Looper 导致创建失败 解决方法: Looper.prepare()

示例代码:

  1. // 无 Handler, 非主线程创建
  2. new Thread(new Runnable() {
  3. @Override public void run() {
  4. Looper.prepare(); // <- 重点在这里
  5. final GestureDetector detector = new GestureDetector(MainActivity.this, new
  6. GestureDetector.SimpleOnGestureListener());
  7. // ... 省略其它代码 ...
  8. }
  9. }).start();
  10. // Handler, 主线程创建
  11. final Handler handler = new Handler();
  12. new Thread(new Runnable() {
  13. @Override public void run() {
  14. final GestureDetector detector = new GestureDetector(MainActivity.this, new
  15. GestureDetector.SimpleOnGestureListener() , handler);
  16. // ... 省略其它代码 ...
  17. }
  18. }).start();
  19. // Handler, 指定 Looper, 子线程创建
  20. new Thread(new Runnable() {
  21. @Override public void run() {
  22. final Handler handler = new Handler(Looper.getMainLooper());
  23. final GestureDetector detector = new GestureDetector(MainActivity.this, new
  24. GestureDetector.SimpleOnGestureListener() , handler);
  25. // ... 省略其它代码 ...
  26. }
  27. }).start();

手势监听

监听类 简介
OnContextClickListener 这个很容易让人联想到ContextMenu,然而它和ContextMenu并没有什么关系,它是在Android6.0(API 23)才添加的一个选项,是用于检测外部设备上的按钮是否按下的,例如蓝牙触控笔上的按钮,一般情况下,忽略即可
由于 OnContextClickListener 主要是用于检测外部设备按钮的,关于它需要注意一点,如果侦听 onContextClick(MotionEvent),则必须在 View 的 onGenericMotionEvent(MotionEvent)中调用 GestureDetector 的 OnGenericMotionEvent(MotionEvent)
OnDoubleTapListener 双击事件,有三个回调类型:双击(DoubleTap)、单击确认(SingleTapConfirmed) 和 双击事件回调(DoubleTapEvent)
OnGestureListener 手势检测,主要有以下类型事件:按下(Down)、 一扔(Fling)、长按(LongPress)、滚动(Scroll)、触摸反馈(ShowPress) 和 单击抬起(SingleTapUp)
SimpleOnGestureListener 这个是上述三个接口的空实现,一般情况下使用这个比较多,也比较方便。

OnContextClickListener

方法名 描述
onContextClick 监听上下文单击

OnDoubleTapListener

方法名 描述
onSingleTapConfirmed 严格的单击行为
关于 onSingleTapConfirmed 原理也非常简单,这一个回调函数在单击事件发生后300ms后触发(注意,不是立即触发的),只有在确定不会有后续的事件后,既当前事件肯定是单击事件才触发 onSingleTapConfirmed,所以在进行点击操作时,onDoubleTap 和 onSingleTapConfirmed 只会有一个被触发,也就不存在冲突了
注: 与 onSingleTapUp() 的区别在于后面不可能再紧跟另一个单击行为, 只可能是单击, 不可能是双击中的一次
onDoubleTap 双击回调
注: 不会与 onSingleTapConfirmed() 共存
onDoubleTapEvent 双击事件监听
ACTION_DOWN/ACTION_MOVE/ACTION_UP 都会触发此回调

OnGestureListener

方法名 描述
onDown 手指触摸屏幕, 由 ACTION_DOWN 触发
onShowPress 手指触摸屏幕, 尚未松开或拖动, 由 ACTION_DOWN 触发
注: 强调的是没有松开或拖动的状态
onSingleTapUp 手指触摸后松开, 由 ACTION_UP 触发
onScroll 手指按压后拖动, 由 一个或多个 ACTION_MOVE 触发
onLongPress 长按
onFling 按下, 快速滑动后松开, 由 ACTION_DOWN 和多个 ACTION_MOVE 与 ACTION_UP 触发

参考链接

http://www.gcssloop.com/customview/gestruedector