来下面一个一个的介绍其相关使用,先介绍它的接口使用
响应用户的手势操作:按下瞬间、轻击、按压、长按、快速滑屏、拖动
/**
* @author: lybj
* @date: 2020/3/4
* @Description: 实现接口GestureDetector,检测用户操作:按下瞬间、按压、长按、轻击、快速滑屏、拖动
*/
public class MyGestureListener implements GestureDetector.OnGestureListener {
/**
* 用户轻触触摸屏
* */
@Override
public boolean onDown(MotionEvent e) {
Log.i("lybj", "onDown");
return false;
}
/**
* 如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行
* */
@Override
public void onShowPress(MotionEvent e) {
Log.i("lybj", "onShowPress");
}
/**
* 用户只点击屏幕后抬起
* */
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i("lybj", "onSingleTapUp");
return false;
}
/**
* 用户按下触摸屏 / 拖动
* */
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
Log.i("lybj", "onScroll");
return false;
}
/**
* 用户长按触摸屏
*/
@Override
public void onLongPress(MotionEvent e) {
Log.i("lybj", "onLongPress");
}
/**
* 用户按下触摸屏、快速移动后松开
*
* @param e1:第1个ACTION_DOWN MotionEvent
* @param e2:最后一个ACTION_MOVE MotionEvent
* @param velocityX:X轴上的移动速度,像素/秒
* @param velocityY:Y轴上的移动速度,像素/秒
* */
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i("lybj", "onFling");
return false;
}
}
然后看下调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_text = findViewById(R.id.tv_text);
// OnGestureListener接口的实现类,监听:按下瞬间、按压、长按、轻击、快速滑屏、拖动
MyGestureListener myGestureListener = new MyGestureListener();
// 创建GestureDetector实例对象
mGestureDetector = new GestureDetector(this, myGestureListener);
// 监听view的事件
tv_text.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("lybj", "============事件开始了================");
mGestureDetector.onTouchEvent(event);
return true;
}
});
}
轻碰屏幕触发流程:
长按屏幕触发流程:
有没有很奇怪?onSingleTapUp事件为什么没有触发?
因为从名子也可以看出,一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件
快速滑动屏幕触发流程:
强调一下,onFling事件只有在快速滑动后送开才会触发,如果滑动比较慢的话,则不会触发。
快速轻碰屏幕触发流程:
有没有很奇怪onShowPress为什么没有触发?
从定义我们应该明白,如果是按下的时间超过瞬间才会触发,因为点击速度太快,所以没超过瞬间则不会触发,那么从这个特点,我们就能判断出点击速度是否太快等特殊要求。
响应用户的手势操作:用户单击、双击屏幕
/**
* @author: lybj
* @date: 2020/3/4
* @Description: 实现接口OnDoubleTapListener,用户单击、双击屏幕
*/
class MyDoubleTapListener implements GestureDetector.OnDoubleTapListener {
/**
* 单击事件。用来判定该次点击是SingleTap而不是DoubleTap,
* 如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,
* 然后触发SingleTapConfirmed事件。
*
* 触发顺序是:OnDown-> OnsingleTapUp -> OnsingleTapConfirmed
*
* 关于onSingleTapConfirmed 和 onSingleTapUp 二者的区别是:
* onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行。
* */
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Log.i("lybj", "onSingleTapConfirmed");
return false;
}
/**
* 双击事件
* */
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.i("lybj", "onDoubleTap");
return false;
}
/**
* 双击间隔中发生的动作。指触发onDoubleTap以后,在双击之间发生的其它动作,包含down、up和move事件
* */
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
Log.i("lybj", "onDoubleTapEvent");
return false;
}
}
调用方式
// OnGestureListener 接口的实现类,监听:按下瞬间、按压、长按、轻击、快速滑屏、拖动
MyGestureListener myGestureListener = new MyGestureListener();
// OnDoubleTapListener 用户单击、双击屏幕
MyDoubleTapListener myDoubleTapListener = new MyDoubleTapListener();
// 创建GestureDetector实例对象
mGestureDetector = new GestureDetector(this, myGestureListener);
mGestureDetector.setOnDoubleTapListener(myDoubleTapListener);
根据上面解释的,我们知道SingleTapConfirmed事件。当单击抬起后就会触发
从双击来看我们可以区分了 SingleTapConfirmed事件和 onSingleTapUp 的区别了。
onSingleTapUp,只要手抬起就会执行,而对于onSingleTapConfirmed来说,如果双击的话,则onSingleTapConfirmed不会执行。
onDoubleTapEvent代表了在双击事件中发生了其他事件。
集成了两个接口的手势检测功能,OnGestureListener和OnDoubleTapListener接口里的函数都是强制必须重写的
而SimpleOnGestureListener类的函数则可根据需要选择性复写,因为SimpleOnGestureListener类本身已经实现了这两个接口的所有函数,只是里面全是空的而已
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){
...
});