手势检测(GestureDetector)
使用
- 创建GestureDetector实例。
- 在onTouchEvent方法中,确保调用GestureDetector实例的onTouchEvent方法,回调中定义的方法将在事件发生时执行。
- 如果监听onContextClick,则必须在View的onGenericMotionEvent方法中调用GestureDetector的onGenericMotionEvent方法。
其监听相关的回调方法如下所示:
@Override
public boolean onDoubleTap(MotionEvent e) {
Log.e("tag", "========双击事件=========");
return super.onDoubleTap(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
//点击事件发生300ms后触发
Log.e("tag", "========单击确认=========");
return super.onSingleTapConfirmed(e);
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
//双击事件确定发生时对第二次按下产生的MotionEvent信息进行回调
Log.e("tag", "========双击事件回调=========");
return super.onDoubleTapEvent(e);
}
@Override
public boolean onDown(MotionEvent e) {
Log.e("tag", "========按下=========");
return super.onDown(e);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//e1表示手指按下时的Event,e2表示手指抬起时的Event
// velocityX表示x上的运动速度(像素/s),velocityY表示y方向上的运动速度(像素/s)
Log.e("tag", "========一扔=========");
return super.onFling(e1, e2, velocityX, velocityY);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//e1表示手指按下时的Event,e2表示手指抬起时的Event
// distanceX表示x轴上划过的距离,distanceY表示y轴上划过的距离
Log.e("tag", "========滚动=========");
return super.onScroll(e1, e2, distanceX, distanceY);
}
@Override
public void onLongPress(MotionEvent e) {
Log.e("tag", "========长按=========");
super.onLongPress(e);
}
@Override
public void onShowPress(MotionEvent e) {
//用户按下时的一种回调,用户手指按下后立即抬起或者事件立即被拦截,时间没有超过 180 ms的话,
// 这条消息会被 remove 掉,不会触发这个回调
Log.e("tag", "========触摸反馈=========");
super.onShowPress(e);
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.e("tag", "========单击抬起时=========");
return super.onSingleTapUp(e);
}
缩放手势检测(ScaleGestureDetector)
ScaleGestureDetector的用法及方法回调如下所示:
final ScaleGestureDetector detector
= new ScaleGestureDetector(this, new ScaleGestureDetector.OnScaleGestureListener() {
@Override
public boolean onScale(ScaleGestureDetector detector) {
//缩放被触发,如果返回true则表示当前缩放事件已经被处理
// 检测器会重新积累缩放因子,返回false则会继续积累缩放因子
Log.e("tag", "focusX = " + detector.getFocusX()); // 缩放中心,x坐标
Log.e("tag", "focusY = " + detector.getFocusY()); // 缩放中心y坐标
Log.e("tag", "scale = " + detector.getScaleFactor()); // 缩放因子
return false;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
//缩放手势开始,当两个手指放在屏幕上时会调用此方法(只调用一次)
// 若返回false则表示不使用当前这次手势缩放
Log.e("tag", "======onScaleBegin=======");
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
//缩放手势结束
Log.e("tag", "======onScaleEnd=======");
}
});
findViewById(R.id.tv_gesturedetector).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
detector.onTouchEvent(event);
return true;
}
});
参考资料