View的位置參數(shù)
- top : 左上角縱坐標
- left: 左上角橫坐標
- right : 右下角橫坐標
- bottom :右下角縱坐標
- x : 左上角的橫坐標
- y : 左上角的縱坐標
- translationX : View左上角相對于父容器的偏移量
- translationY : View左上角相對于父容器的偏移量
PS:View在平移的過程中,top和left表示的是原始左上角的位置信息,其值并不會發(fā)生改變,此時發(fā)生改變的是x、y、translationX和translationY這四個參數(shù)。
x = left + translationX;
y = right + translationY;
MotionEvent
- ACTION_DOWN -- 手指剛接觸屏幕
- ACTION_MOVE -- 手指在屏幕上滑動
- ACTION_UP -- 手指從屏幕上松開的一瞬間
如:點擊屏幕后離開,事件序列為DOWN -> UP
點擊屏幕滑動一會再松開,事件序列為DOWN -> MOVE -> ... -> MOVE -> UP
獲得點擊事件發(fā)生的x和y坐標:
- getX/getY -- 相對于當前View左上角的x和y坐標
- getRawX/getRawY -- 相對于手機屏幕左上角的x和y坐標
TouchSlop
TouchSlop是系統(tǒng)所能識別出的被認為是滑動的最小距離,可通過如下方式獲得
ViewConfiguration.get(getContext()).getScaledTouchSlop();
VelocityTracker
速度追蹤,用于追蹤手指在滑動過程中的速度,包括水平和豎直方向的速度。使用過程如下:
- 在View的onTouchEvent方法中追蹤當前單擊事件的速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
- 獲得當前移動速度
velocityTracker.computeCurrentVelocity(1000); //先根據(jù)時間計算速度
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
- 回收內存
velocityTracker.clear();
velocityTracker.recycle();
GestureDetector
手勢檢測,用于輔助檢測用戶的單擊、滑動、長按和雙擊等行為。
- 創(chuàng)建一個GestureDetector對象并實現(xiàn)OnGestureListener接口或者OnDoubleTapListener
GestureDetector mGestureDetector = new GestureDetector(this);
// 解決長按屏幕后無法拖動的現(xiàn)象
mGestureDetector.setIsLongpressEnabled(false);
- 接管目標View的onTouchEvent方法
boolean consume = mGestureDetector.onTouchEvent(event);
return consume;
表 OnGestureListener和OnDoubleTapListener中的方法介紹:
方法名 | 描述 | 所屬接口 |
---|---|---|
onDown | 手指輕輕觸摸屏幕的一瞬間 | OnGestureListener |
onShowPress | 手指輕輕觸摸屏幕,尚未松開和拖動 | OnGestureListener |
onSingleTapUp | 手指(輕輕觸摸屏幕后)松開 | OnGestureListener |
onScroll | 手指按下屏幕并拖動 | OnGestureListener |
onLongPress | 用戶長久按著屏幕不放 | OnGestureListener |
onFling | 用戶按下觸摸屏,快速滑動后松開 | OnGestureListener |
onDoubleTap | 雙擊,第二下單擊Down觸發(fā) | OnDoubleTapListener |
onSingleTapConfirmed | 嚴格的單擊行為(只能是單擊,不能是雙擊中的一次單擊) | OnDoubleTapListener |
onDoubleTapEvent | 表示發(fā)生了雙擊行為 ,DOWN、MOVE、UP都會觸發(fā) | OnDoubleTapListener |