View的位置参数
- top: 左上角的纵坐标
- left: 左上角的横坐标
- right: 右下角的横坐标
- bottom: 右下角的纵坐标
Attention: View在平移过程中,top和left表示的是原始左上角的位置信息,不改变,改变的是x, y, translationX 和 translationY;
View的实现
@UiThread
public class View implements Drawable.Callback, KeyEvent.Callback,
AccessibilityEventSource {
MotionEvent
- ACTION_DOWN 手指刚接触屏幕
- ACTION_MOVE 手指在屏幕上移动
- ACTION_UP 手机从屏幕上 松开的一瞬间
- 点击屏幕离开后松开,时间序列为DOWN->UP;
点击屏幕滑动一会再松开,事件序列为DOWN->MOVE->…>MOVE->UP.
getX/getY返回的是相对于当前View左上角的X和Y坐标
- getRawX/getRawY返回的是相当于手机屏幕左上角的X和Y的坐标。
TouchSlop
系统所能识别出的被认为是滑动的最小的距离。
- 获取
ViewConfiguration.get(getContext()).getScaledTouchSlop().
VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和数值方向的速度。
- 使用过程
在View的onTouchEvent方法中
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000)//根据传入的时间间隔计算相应的速度,单位ms
int xVelocity = (int) velocityTracker.getXVelocity();
int yVelocity = (int) velocityTracker.getYVelocity();
velocityTracker.clear();
velocityTracker.recycle();//使用完成,清空
GestureDetector
手势检测,用于辅助检测,单击,滑动,长按,双击等行为。
在实际的开发中可以不使用GestureDetector,完全可以在自己的View和onTouchEvent方法中实现所需的监听;
双击行为最好使用GestureDetector
Scroller
弹性滑动
Scroller mScroller = new Scroller(this.getContext());
private void smoothScrollTo(int destX, int destY) {
int scrollX = getScrollX();
int delta = destX - scrollX;
mScroller.startScroll(scrollX, 0, delta, 0, 1000);
invalidate();
}
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
}