TouchSlop
TouchSlop是系统所能识别出的被认为是滑动的最小距离,当手指在屏幕上的滑动距离小于这个值时,就认为不是滑动操作。该值是一个常量,和设备有关。不用设备上值可能是不同的。获取方式为
int scaledTouchSlop = ViewConfiguration.get(getApplicationContext()).getScaledTouchSlop();
VelocityTracker
用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。
使用方法如下,在View的onTouchEvent方法中追踪当前事件的速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
Log.e(TAG, "onTouchEvent: xVelocity "+xVelocity+" yVelocity"+yVelocity);
释放及关闭
velocityTracker.clear();
velocityTracker.recycle();
GestureDetector
手势检测,用于辅助检测用户的单机、长按、滑动、双击等行为。
GestureDetector.OnGestureListener
@Override
public boolean onDown(MotionEvent e) {
//手指按下屏幕的瞬间触发 MotionEvent.ACTION_DOWN
return false;
}
@Override
public void onShowPress(MotionEvent e) {
//手指按下屏幕,没有拖动和松开的状态下 MotionEvent.ACTION_DOWN
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
//手指按下屏幕后松开,即触发MotionEvent.ACTION_UP
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//手指按下屏幕并拖动,触发一个MotionEvent.ACTION_DOWN 和多个MotionEvent.ACTION_MOVE
return false;
}
@Override
public void onLongPress(MotionEvent e) {
//手指长按屏幕,并没有松开的状态
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//手指按下屏幕,快速滑动后松开,触发一个MotionEvent.ACTION_DOWN 和多个MotionEvent.ACTION_MOVE,
//一个MotionEvent.ACTION_UP,即快速滑动行为
return false;
}
GestureDetector.OnDoubleTapListener
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
//严格的单机行为
Log.e(TAG, "onSingleTapConfirmed: ");
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
//双击,由两次连续的单机组成
Log.e(TAG, "onDoubleTap: ");
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
//表示发生了双击行为
Log.e(TAG, "onDoubleTapEvent: ");
return false;
}