View的位置参数
- top : 左上角纵坐标
- left: 左上角横坐标
- right : 右下角横坐标
- bottom :右下角纵坐标
- x : 左上角的横坐标
- y : 左上角的纵坐标
- translationX : View左上角相对于父容器的偏移量
- translationY : View左上角相对于父容器的偏移量
PS:View在平移的过程中,top和left表示的是原始左上角的位置信息,其值并不会发生改变,此时发生改变的是x、y、translationX和translationY这四个参数。
x = left + translationX;
y = right + translationY;
MotionEvent
- ACTION_DOWN -- 手指刚接触屏幕
- ACTION_MOVE -- 手指在屏幕上滑动
- ACTION_UP -- 手指从屏幕上松开的一瞬间
如:点击屏幕后离开,事件序列为DOWN -> UP
点击屏幕滑动一会再松开,事件序列为DOWN -> MOVE -> ... -> MOVE -> UP
获得点击事件发生的x和y坐标:
- getX/getY -- 相对于当前View左上角的x和y坐标
- getRawX/getRawY -- 相对于手机屏幕左上角的x和y坐标
TouchSlop
TouchSlop是系统所能识别出的被认为是滑动的最小距离,可通过如下方式获得
ViewConfiguration.get(getContext()).getScaledTouchSlop();
VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。使用过程如下:
- 在View的onTouchEvent方法中追踪当前单击事件的速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
- 获得当前移动速度
velocityTracker.computeCurrentVelocity(1000); //先根据时间计算速度
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
- 回收内存
velocityTracker.clear();
velocityTracker.recycle();
GestureDetector
手势检测,用于辅助检测用户的单击、滑动、长按和双击等行为。
- 创建一个GestureDetector对象并实现OnGestureListener接口或者OnDoubleTapListener
GestureDetector mGestureDetector = new GestureDetector(this);
// 解决长按屏幕后无法拖动的现象
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触发 | OnDoubleTapListener |
onSingleTapConfirmed | 严格的单击行为(只能是单击,不能是双击中的一次单击) | OnDoubleTapListener |
onDoubleTapEvent | 表示发生了双击行为 ,DOWN、MOVE、UP都会触发 | OnDoubleTapListener |
网友评论