Android中系统触摸相关辅助类总结
Android中的触摸事件,我们可以通过重写View的OnTouchEvent()
等事件,通过事件类型MotionEvent
来进行我们想要实现的逻辑操作,有时候一些简单的需求很容易实现,但是有时候,一些很困难的需求,我们需要编写大量的代码来实现。好在Android官方就给我们提供了很丰富的触摸相关的辅助类,今天,我就把我知道的分享给大家。
1、GestureDetector(手势探测器)
顾名思义,GestureDetector可以很方便的帮我们识别出我们当前在屏幕上的手势操作,比如按下、长按、抬起、双击、滚动、快速滑动(惯性滑动)等,甚至它还能识别出是否是鼠标右键点击的动作,省去了我们大量的手势判断语句,非常的实用。
1.1 相关的方法及接口简介
GestureDetector的手势识别有三个接口来处理我们当前的手势动作,还有一个集成了三个接口的实现类方便我们去处理多种事件。
1.1.1 GestureDetector.OnGestureListener
作用: 用来监听单击、长按、滑动等操作,我们可以在这些操作的回调方法中处理我们自己的逻辑。
具体实现方法:
见下面代码,注释已经写的很清楚了,示例代码中仅仅对滚动进行了处理。
private static class MyGestureDetectorListener implements GestureDetector.OnGestureListener{
private GestureDetectorView mView;
public MyGestureDetectorListener(GestureDetectorView view){
this.mView = view;
}
/**
* 用户按下屏幕的时候回调
* @param motionEvent
* @return
*/
@Override
public boolean onDown(MotionEvent motionEvent) {
Log.e("ll", "MyGestureDetectorListener : onDown");
return true;
}
/**
* 用户按下屏幕100ms后,如果还没有松手或者移动就会回调
* @param motionEvent
*/
@Override
public void onShowPress(MotionEvent motionEvent) {
Log.e("ll", "MyGestureDetectorListener : onShowPress");
}
/**
* 单纯的点击再抬手时调用。用户手指松开(UP事件)的时候如果没有执行onScroll()和onLongPress()这两个回调的话,就会回调
* @param motionEvent
* @return
*/
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
Log.e("ll", "MyGestureDetectorListener : onSingleTapUp");
return false;
}
/**
* 屏幕拖动事件,如果按下的时间过长,调用了onLongPress,再拖动屏幕不会触发onScroll。
* 拖动屏幕会多次触发
* @param motionEvent 开始拖动的第一次按下down操作,也就是第一个ACTION_DOWN
* @param motionEvent1 触发当前onScroll方法的ACTION_MOVE
* @param distanceX 当前的x坐标与最后一次触发scroll方法的x坐标的差值。
* @param distanceY 当前的y坐标与最后一次触发scroll方法的y坐标的差值。
* @return
*/
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float distanceX, float distanceY) {
Log.e("ll", "MyGestureDetectorListener : onScroll : " + distanceY);
mView.scrollBy(0, (int) distanceY);
return false;
}
/**
* 用户长按后(好像不同手机的时间不同,源码里默认是100ms+500ms)触发,触发之后不会触发其他回调,直至松开(UP事件)。
* @param motionEvent
*/
@Override
public void onLongPress(MotionEvent motionEvent) {
Log.e("ll", "MyGestureDetectorListener : onLongPress");
}
/**
* 按下屏幕,在屏幕上快速滑动后松开,由一个down,多个move,一个up触发
* @param motionEvent 开始快速滑动的第一次按下down操作,也就是第一个ACTION_DOWN
* @param motionEvent1 触发当前onFling方法的move操作,也就是最后一个ACTION_MOVE
* @param velocityX X轴上的移动速度,像素/秒
* @param velocityY Y轴上的移动速度,像素/秒
* @return
*/
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float velocityX, float velocityY) {
Log.e("ll", "MyGestureDetectorListener : onFling");
return false;
}
}
注意事项:
1、onDown()
方法返回true
时,onScroll()
和onFling()
方法才能回调。
2、onLongPress()
若触发了,则不会再触发其他回调。
3、事件回调顺序:
- 快速点击:
onDown()
>onSingleTapUp()
- 慢按屏幕:
onDown()
>onShowPress()
>onSingleTapUp()
- 长按屏幕:
onDown()
>onShowPress()
>onLongPress()
- 滑动屏幕:
onDown()
>onShowPress()
>onScroll()
(多个) >onFling()
- 快速拖动屏幕后松手:
onDown()
>onScroll()
(多个) >onFling()
1.1.2 GestureDetector.OnDoubleTapListener
作用: 用来监听双击事件操作,我们可以在这些操作的回调方法中处理我们自己的逻辑。
具体实现方法:
见下面代码,注释已经写的很清楚了。
private static class MyGestureDetectorDoubleTapListener implements GestureDetector.OnDoubleTapListener{
/**
* 单击事件。用来判定该次点击是单纯的SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,
* 如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。
* @param motionEvent
* @return
*/
@Override
public boolean onSingleTapConfirmed(MotionEvent motionEvent) {
Log.e("ll","MyGestureDetectorDoubleTapListener : onSingleTapConfirmed");
return false;
}
/**
* 双击触发
* @param motionEvent
* @return
*/
@Override
public boolean onDoubleTap(MotionEvent motionEvent) {
Log.e("ll","MyGestureDetectorDoubleTapListener : onDoubleTap");
return false;
}
/**
* 双击间隔中发生的动作。指触发onDoubleTap以后,在双击之间发生的其它动作,包含down、up和move事件
* @param motionEvent
* @return
*/
@Override
public boolean onDoubleTapEvent(MotionEvent motionEvent) {
Log.e("ll","MyGestureDetectorDoubleTapListener : onDoubleTapEvent");
return false;
}
}
注意事项:
1、onSingleTapConfirmed()
用来判断是不是单点事件,双击不会执行此方法。
2、事件调用顺序:
- 单击屏幕时:
OnDown()
>OnsingleTapUp()
>OnsingleTapConfirmed()
- 双击屏幕时:
OnDown()
>onSingleTapUp()
>onDoubleTap()
>onDoubleTapEvent()
>onDown()
>onDoubleTapEvent()
1.1.3 GestureDetector.OnContextClickListener
作用: 用来监听鼠标右键按下的事件,我们可以在这些操作的回调方法中处理我们自己的逻辑。
具体实现方法:
见下面代码,注释已经写的很清楚了。
private static class MyGestureDetectorContextClickListener implements GestureDetector.OnContextClickListener{
/**
* 当鼠标/触摸板,右键点击时候的回调。
* @param motionEvent
* @return
*/
@Override
public boolean onContextClick(MotionEvent motionEvent) {
return false;
}
}
注意事项:
1、OnContextClickListener
接口最低支持的API是23。