原理:Android手势识别其实和我们平常对触摸事件的处理是一样的,都是对MotionEvent事件进行计算处理。
Android为我们提供了两个基本的手势识别。
- GestureDetector:单手势识别,可以识别按下,单击,双击,长按,滑动,fling滑动。
- ScaleGestureDetector:缩放手势识别,
1. GestureDetector单手势识别
GestureDetector中有两个重要接口,
- OnGestureListener,识别单次点击,滑动,fling滑动的接口。
- OnDoubleTapListener: 识别双击回调的接口。
Android为了我们使用方便,给我们提供了SimpleOnGestureListener类,该类包含了上述两个接口,我们可以根据需要选择性实现方法。
eg:
GestureDetector gestureDetector = new GestureDetector(requireActivity(), new GestureDetector.SimpleOnGestureListener() {
//按下时触发
public boolean onDown(MotionEvent e) {
return true;
}
//按下onDown很短时间没有离开触发,单纯快速点击不会触发,一般不使用该方法。
public void onShowPress(MotionEvent e) {
}
//触摸抬起时触发,如果只是单纯的单击很快执行顺序为onDown-->onSingleTapUp,长按不会触发该事件
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
//滑动触发
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
//快速滑动后的Fling滑动, velocityX表示x方向速度
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
//长按触发,长按的触发顺序为onDown-->onShowPress->onLongPress
public void onLongPress(MotionEvent e) {
}
//单击确认触发,发生在onSingleTapUp之后,抬起后才能确认是否是单击
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
//双击确认触发,
public boolean onDoubleTap(MotionEvent e) {
return false;
}
//双击过程中发生的事件,一般不用
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
});
上面为单手势实例化,使用时直接将触摸事件传递进GestureDetector即可,
gestureDetector.onTouchEvent(e);
2. ScaleGestureDetector缩放
缩放手势识别使用方式和GestureDetector一样,而且回调接口比较简单
ScaleGestureDetector gestureDetector = new ScaleGestureDetector(requireActivity(), new
ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override //开始缩放
public boolean onScaleBegin(ScaleGestureDetector detector) {
return super.onScaleBegin(detector);
}
@Override //缩放回调
public boolean onScale(ScaleGestureDetector detector) {
return super.onScale(detector);
}
@Override //结束缩放
public void onScaleEnd(ScaleGestureDetector detector) {
super.onScaleEnd(detector);
}
});
3. 自定义手势识别
Android的手势识别都是对触摸的计算,可以根据自己需要的逻辑来自己定义识别,可以研究试下GestureDetector与ScaleGestureDetector源码,
这里的源码是别人写的,我这里只做引用使用。
4. 其他触摸计算辅助类 VelocityTracker
VelocityTracker是用来计算滑动速度的,通常用户快速滑动后我们会根据用户的滑动速度来再加一段自动滑动(Fling滑动)。使用方式也简单。各个手势识别中一般也都用到它。
-
初始化。
VelocityTracker tracker = VelocityTracker.obtain();
-
将触摸事件添加到计算数据中。多次添加,一般每个触摸事件都添加进入
tracker.addMovement(motionEvent);
-
获得滑动速度之前,先计算,计算之前添加的数据才有速度结果
//1000 计算结果速度的时间,这里是1000ms多少像素, 5f表示想要得到的速度的最大值。 tracker.computeCurrentVelocity(1000, 5f)
-
获取滑动速度
tracker.getXVelocity(); tracker.getYVelocity()
-
清除VelocityTracker中原有的数据
tracker.clear(); //相当于初始化之后的状态
-
用完记得最后回收
tracker.recycler();