一、GestureDetector
-
概述:
主要用于识别一些特定的手势,调用GestureDetector.onTouchEvent()把MotionEvent传递进去即可。对于工作手势回调,可通过GestureDetector中的接口OnGestureDetectorListener来完成。
只需在View.onTouchEvent()中调用GestureDetector的OnTouchEvent()即可
二、GestureDetector常用接口
- OnGestureListener:手势事件监听
1、boolean onDown
GestureDetector的OnTouchEvent()中发生action_down事件时触发。隔一定时间后触发onShowPress()和onLongPress()
2、void onShowPress()
在down事件发生时并不会立即执行,而是会等待一段时间后执行,如果期间发生了action_move,action_up或者ACTION_CANCEL,就会取消执行该方法。
只有在事件是press——按下足够长的时间并且没有大范围移动时才会执行,用于提示用户已经按下,有可能会发展成onLongPress。
3、onLongPress
当press时间过长时就会由onShowPress转化成onLongPress
4、boolean onSingleTapUp
轻触(手指松开)
GestureDetector的OnTouchEvent()中只有在action_up时才会有可能执行该方法。但它并不等价于action_up事件。
5、boolean onScroll
滑动(一次完整事件可能会多次触发该函数)返回值表示事件是否处理。
6、void onLongPress
长按(手指尚未松开也没有达到scroll条件)
7、boolean onFling
滑屏(当用户按下触摸屏、快速滑动后松开,返回值表示事件是否处理)
- onDoubleTapListener:双击事件监听
private GestureDetector.OnDoubleTapListener onDoubleTapListener=new GestureDetector.OnDoubleTapListener() {
/**
* 单击事件
*/
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
/**
* 双击事件(与onSingleTapConfirmed互斥)
*/
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
/**
* 双击事件产生之后手指还没有抬起时的后续事件(action_up,action_down,action_move)
*/
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
};
- OnContextClickListener:外接设备产生的事件
- SimpleOnGestureListener:以上三个接口中所有函数的集成,包含三个接口所有必须实现的函数并且经过重写,但所有方法体都是空的。需要根据情况去重写。
总结:处理事件时,根据需要展示效果
单击:onSingleTapUp;
长按:onLongPress;
按下:onShowPress();
拖动:onScroll
快速滑动:onFling
双击:onDoubleTap
-
具体使用:
在onTouchEvent方法内调用GestureDetector的onTouchEvent,传递事件即可。
三、ScaleGestureDetector
用于处理缩放的工具类,用法与GestureDetector类似,都是通过onTouchEvent关联相应的MotionEvent
ScaleGestureDetector示例:
class MyScaleGestureDetector extends ScaleGestureDetector{
public MyScaleGestureDetector(Context context, OnScaleGestureListener listener) {
super(context, listener);
}
/**
* 缩放是否正在进行中
*/
@Override
public boolean isInProgress() {
return super.isInProgress();
}
/**
* 返回组成缩放手势(两个手指)中点x的位置
*/
@Override
public float getFocusX() {
return super.getFocusX();
}
/**
* 返回组成缩放手势(两个手指)中点y的位置
*/
@Override
public float getFocusY() {
return super.getFocusY();
}
/**
* 返回组成缩放手势的两个触点的跨度(两个触点间的距离)
*/
@Override
public float getCurrentSpan() {
return super.getCurrentSpan();
}
/**
* 返回组成缩放手势的两个触点的跨度(两个触点间的距离)x的位置
*/
@Override
public float getCurrentSpanX() {
return super.getCurrentSpanX();
}
/**
* 返回组成缩放手势的两个触点的跨度(两个触点间的距离)y的位置
*/
@Override
public float getCurrentSpanY() {
return super.getCurrentSpanY();
}
/**
* 返回组成缩放手势的两个触点的前一次缩放的跨度(两个触点间的距离)
*/
@Override
public float getPreviousSpan() {
return super.getPreviousSpan();
}
/**
* 返回组成缩放手势的两个触点的前一次缩放的跨度(两个触点间的距离)x的距离
*/
@Override
public float getPreviousSpanX() {
return super.getPreviousSpanX();
}
/**
* 返回组成缩放手势的两个触点的前一次缩放的跨度(两个触点间的距离)y的距离
*/
@Override
public float getPreviousSpanY() {
return super.getPreviousSpanY();
}
/**
* 获取本次缩放事件的缩放因子,缩放事件以onScale()返回值为基准,一旦该方法返回true,代表本次事件结束,重新开启下次缩放事件
*/
@Override
public float getScaleFactor() {
return super.getScaleFactor();
}
/**
* 返回上次缩放事件结束时到当前时间的间隔
*/
@Override
public long getTimeDelta() {
return super.getTimeDelta();
}
/**
* 获取当前motion事件的时间
*/
@Override
public long getEventTime() {
return super.getEventTime();
}
}
-
OnScaleGestureListener接口
示例:
private ScaleGestureDetector.OnScaleGestureListener scaleGestureListener=new ScaleGestureDetector.OnScaleGestureListener() {
/*
* 正在缩放,返回值表示下次缩放是否需要重置,如果返回true,detector就会重置缩放事件,如果返回false,detector会在之前的缩放上继续进行计算
*/
@Override
public boolean onScale(ScaleGestureDetector detector) {
return false;
}
/**
* 缩放开始,返回值表示是否受理后续的缩放事件
*/
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return false;
}
/**
* 缩放结束
*/
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
};
网友评论