使用示例:
// 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, new
GestureDetector.SimpleOnGestureListener());
// ... 省略其它代码 ...
}
}).start();
// Handler, 主线程创建
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override public void run() {
final GestureDetector detector = new GestureDetector(MainActivity.this, new
GestureDetector.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, new
GestureDetector.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 触发 |