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;
}