GestureDetector类:手势探测器。
1,onDoubleTap(MotionEvent e):在双击的第二下,Touch down时触发 。
2,onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件,
包含down、up和move事件(这里指的是在双击之间发生的事件,
例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);
双击的第二下Touch down和up都会触发,可用e.getAction()区分。
3,onSingleTapConfirmed(MotionEvent e):用来判定该次点击是SingleTap而不是DoubleTap,
如果连续点击两次就是DoubleTap手势,
如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,
然后触发SingleTapConfirmed事件。这个方法不同于onSingleTapUp,他是在GestureDetector确信用户在第一次触摸屏幕后,
没有紧跟着第二次触摸屏幕,也就是不是“双击”的时候触发
GestureDetector.OnGestureListener接口:用来通知普通的手势事件,该接口有如下六个回调函数:
1. onDown(MotionEvent e):down事件;
2. onSingleTapUp(MotionEvent e):一次点击up事件;在touch down后又没有滑动
(onScroll),又没有长按(onLongPress),然后Touchup时触发。
点击一下非常快的(不滑动)Touchup:
onDown->onSingleTapUp->onSingleTapConfirmed
点击一下稍微慢点的(不滑动)Touchup:
onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
3. onShowPress(MotionEvent e):down事件发生而move或则up还没发生前触发该事件;
Touch了还没有滑动时触发(与onDown,onLongPress)比较onDown只要Touch down一定立刻触发。
而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。
所以Touchdown后一直不滑动按照onDown->onShowPress->onLongPress这个顺序触发。
4. onLongPress(MotionEvent e):长按事件;Touch了不移动一直Touch down时触发
5. onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手
势事件;Touch了滑动一点距离后,在ACTION_UP时才会触发
参数:e1 第1个ACTION_DOWN MotionEvent 并且只有一个;e2 最后一个ACTION_MOVE MotionEvent ;
velocityX X轴上的移动速度,像素/秒 ;velocityY Y轴上的移动速度,像素/秒.
触发条件:X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
6. onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上
拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发
//-------------例子-手指右左滑动切换界面------------------------------------
public abstract class BaseSetupActivity extends Activity {
private static final String TAG = "BaseSetupActivity";
// 1.定义一个手势识别器
private GestureDetector gd;// 手势探测器
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//2.实例化这个手势识别器
gd = new GestureDetector(this, new SimpleOnGestureListener() {
// 快速滑动屏幕 velocityX:x轴的加速度 e1:按下去的第一个点 e2:最后一个点
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if ((e2.getRawX() - e1.getRawX()) > 20) {
// 说明手指滑动的方向是 -------> 进行上一页操作
Log.i(TAG, "说明手指滑动的方向是 -------> 进行上一页操作");
//..................
return true;
}
if ((e1.getRawX() - e2.getRawX()) > 20) {
// 说明手指滑动的方向是 <------- 进行下一页操作
Log.i(TAG, "说明手指滑动的方向是 <------- 进行下一页操作");
//..................
return true;
}
// 禁止上滑操作
if (Math.abs(e1.getRawY() - e2.getRawY()) > 200) {
Log.i(TAG, "这是上下滑的操作");
return true;
}
//屏蔽在X滑动很慢的情形
if(Math.abs(velocityX)<200){
Log.i(TAG, "滑动得太慢了");
return true;
}
return super.onFling(e1, e2, velocityX, velocityY);
}
// 拖动屏幕
public void onScroll(MotionEvent e) {
super.onLongPress(e);
}
// 长按屏幕
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
}
// 双击屏幕
public boolean onDoubleTapEvent(MotionEvent e) {
return super.onDoubleTapEvent(e);
}
// 单击屏幕
public boolean onSingleTapConfirmed(MotionEvent e) {
return super.onSingleTapConfirmed(e);
}
});
}
/**
//3: activity接收到页面传回来的点击事件,然后传给GestureDetector处理
*/
public boolean onTouchEvent(MotionEvent event) {
gd.onTouchEvent(event);
return super.onTouchEvent(event);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。