使用示例:
// 1.创建一个监听回调SimpleOnGestureListener listener = new SimpleOnGestureListener() {@Override public boolean onDoubleTap(MotionEvent e) {Toast.makeText(MainActivity.this, "双击666", Toast.LENGTH_SHORT).show();return super.onDoubleTap(e);}};// 2.创建一个检测器final GestureDetector detector = new GestureDetector(this, listener);// 3.给监听器设置数据源view.setOnTouchListener(new View.OnTouchListener() {@Override public boolean onTouch(View v, MotionEvent event) {return detector.onTouchEvent(event);}});
构造方法
| 构造方法 | ||
|---|---|---|
| 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()
示例代码:
// 无 Handler, 非主线程创建new Thread(new Runnable() {@Override public void run() {Looper.prepare(); // <- 重点在这里final GestureDetector detector = new GestureDetector(MainActivity.this, newGestureDetector.SimpleOnGestureListener());// ... 省略其它代码 ...}}).start();// Handler, 主线程创建final Handler handler = new Handler();new Thread(new Runnable() {@Override public void run() {final GestureDetector detector = new GestureDetector(MainActivity.this, newGestureDetector.SimpleOnGestureListener() , handler);// ... 省略其它代码 ...}}).start();// Handler, 指定 Looper, 子线程创建new Thread(new Runnable() {@Override public void run() {final Handler handler = new Handler(Looper.getMainLooper());final GestureDetector detector = new GestureDetector(MainActivity.this, newGestureDetector.SimpleOnGestureListener() , handler);// ... 省略其它代码 ...}}).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 触发 |
