手势识别器-GestureDetector
常用方法
GestureDetector有两个重要的接口和一个外部类。
- android.view.GestureDetector.OnGestureListener
- android.view.GestureDetector.OnDoubleTapListener
- GestureDetector.SimpleOnGestureListener
其中SimpleOnGestureListener 包含了两个接口的实现
GestureDetector.OnGestureListener
该接口方法讲解:
onDown:用户按下屏幕就会触发该函数
onSingleTapUp:单击事件
onShowPress:用户按下超过瞬时就会触发该函数
onScroll:拖动事件。完成后会调用onFling
onFling:滑屏,用户按下触摸屏,以很快速度滑动。
onLongPress:长按,超过一定时长就会触发该函数
手势触发顺序
-
长按手势触发顺序:
onDown->onShowPress->onLongPress
-
单击事件不滑动,手势触发的顺序
onDown->onSingleTapUp->onSingleTapConfirmed
-
单击事件,稍慢抬起来事件
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
-
滑屏幕事件,稍微滑动
onDown->onScroll->onScroll->。。。。。->onFling
-
滑屏幕事件,拖动
onDown->onScroll->onScroll->onFling
可以看到,滑屏幕和轻微拖动屏幕只会影响onScroll事件数量而已。
使用GestureDetector
1, 创建监听函数。
new android.view.GestureDetector.OnGestureListener()
2.创建GestureDetector
GestureDetector mGestureDetector = new GestureDetector(new MyGestureDetectorListener());
3.在onTouch中拦截,下面方法选其中一个
下面方法需要实现OnTouchListener接口,并调用setOnTouchListener 接口。可以在任意位置设置
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
下面方法不需要实现OnTouchListener接口,在自定义控件中实现。
@Override
public boolean onTouchEvent(MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
4, 绑定事件。
view.setOnTouchListener(this);
view.setFocusable(true);
view.setClickable(true);
view.setLongClickable(true);
OnDoubleTapListener
方法讲解
onSingleTapConfirmed : 单击事件,触发顺序为:onDown->onSingleTapUp->onSingleTapConfirmed
onSingleTapUp于onSingleTapConfirmed区别在于,onSingleTapConfirmed双击不会触发,onSingleTapUp只要抬起手指就会触发
onDoubleTap :双击事件
onDoubleTapEvent:双击中间隔发生的动作
SimpleOnGestureListener实现类
该实现类默认实现了OnDoubleTapListener和OnGestureListener两个接口的空实现。
onFling用法 - 判断向左向右滑动:
基本示例
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 200) {
Log.e("appDebug", "向左");
} else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 200) {
Log.e("appDebug", "向右");
}
return super.onFling(e1, e2, velocityX, velocityY);
}
e1 : 第一个按下位置
e2:最后一个move事件位置
velocity :移动速度,单位为像素/秒