1 简介
手势识别在 Android
开发中也是非常常见,我们通过设置监听 View.onTouchListener
接口,重写 onTouch(View v, MotionEvent event)
可以处理一些触摸事件,但是在处理一些复杂事件,诸如双击、滚动、拖动等还有有点难以处理,这时候就需要使用到 GestureDetector
手势识别。GestureDetector
提供了两个接口(onGestureListener
、onDoubleTapListener
)和一个类(SimpleOnGestureListener
),来方便开发人员进行开发,下面我们来一一讲解。
2 使用
2.1 onGestureListener
检测用户如下操作:轻触屏幕、触摸屏幕瞬间、长按、轻击、滑屏、拖动。
//step1: 创建 GestureDetector
//有 3 个构造函数,我们使用第二个
//1.GestureDetector gestureDetector = new GestureDetector(GestureDetector.OnGestureListener listener);
//2.GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
//3.GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener() {
/**
* 1.用户轻触屏幕触发
* @param e 触摸事件
* @return
*/
@Override
public boolean onDown(MotionEvent e) {
return false;
}
/**
* 2.用户轻触屏幕,但是没有松开或者拖动触发
* @param e 触摸事件
*/
@Override
public void onShowPress(MotionEvent e) {
}
/**
* 3.用户轻触屏幕后抬起触发
* @param e 触摸事件
* @return
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
/**
* 4.用户在屏幕上拖动触发
* @param e1 第一个 ACTION_DOWN MotionEvent
* @param e2 最后一个 ACTION_MOVE MotionEvent
* @param distanceX 当前 ACTION_MOVE 和上一个 ACTION_MOVE 在 X 轴上的位移量
* @param distanceY 当前 ACTION_MOVE 和上一个 ACTION_MOVE 在 Y 轴上的位移量
* @return
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
/**
* 5.用户长按屏幕触发
* @param e 触摸事件
*/
@Override
public void onLongPress(MotionEvent e) {
}
/**
* 6.滑屏,用户轻触屏幕、快速移动后松开
* @param e1 第一个 ACTION_DOWN MotionEvent
* @param e2 最后一个 ACTION_MOVE MotionEvent
* @param velocityX X 轴上的移动速度,像素/秒
* @param velocityY Y 轴上的移动速度,像素/秒
* @return
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
});
//step2.1: 让 GestureDetector 接管 View 的触摸事件
tv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event);
//返回 true 拦截事件处理
return true;
}
});
//step2.2: 让 GestureDetector 接管 Activity 的触摸事件
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
2.2 OnDoubleTapListener
检测用户如下操作:单击事件、双击事件。
//step1:先创建gestureDetector 同上
//step2:设置setOnDoubleTapListener 监听
gestureDetector.setOnDoubleTapListener(new GestureDetector.OnDoubleTapListener() {
/**
* 1.单击事件
* @param e
* @return
*/
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
/**
* 双击事件
* @param e 事件
* @return
*/
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
/**
* 3.双击间隔中发生的动作,包括 down、up 和 move 事件
* @param e
* @return
*/
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
});
//step3: 让 GestureDetector 接管 View 的触摸事件
tv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event);
//返回 true 拦截事件处理
return true;
}
});
2.3 SimpleOnGestureListener
通过上面代码,我们发现通过接口的方式,必须全部重写里面的方法,比较麻烦。因此我们可以继承 SimpleOnGestureListener
来实现,SimpleOnGestureListener
主要功能:
- 是一个类,要使用
extends
,或者直接new
- 里面已经实现了
onGestureListener
和OnDoubleTapListener
的方法,不过都是空实现,我们可以选择性的重写某些方法。
//step1: 构造 GestureDetector
GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
//例如我们只需要监听点击事件
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
//具体操作
return true;
}
});
//step2: 让 GestureDetector 接管 View 的触摸事件
tv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event);
//返回 true 拦截事件处理
return true;
}
});
来源:CSDN
作者:soleil雪寂
链接:https://blog.csdn.net/qq_44947117/article/details/104347318