View 基础知识
1、 MotionEvent 和 TouchSlop
MotionEvent
这里只需要注意一点,通过MotionEvent 可以获得点击事件发生的x和y坐标,系统提供了两组方法,getX/getY 和 getRawX/getRawY ,他们的区别很简单,前者返回的是相对于当前View的左上角的 x 和 y 坐标,后者返回的是相对于手机屏幕左上角的 x和y 坐标。
TouchSlop
TouchSlop 是系统所能识别出的被认为是滑动的最小距离,小于这个值就不认为是滑动操作。TouchSlop 是一个常量,和设备有关,在不同的设备上这个值可能是不同的。通过如下方式可以获取这个常量:
ViewConfiguration.get(context).getScaledTouchSlop()
2、VelocityTracker、GestureDetector 和 Scroller
VelocityTracker
用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。它的使用过程很简单,首先在 View 的 onTouchEvent 方法中追踪当前单击事件的速度:
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
接着,当我们想知道当前的滑动速度时,可以采用如下方法获得:
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();
这里需要注意的是: 一、获取速度之前必须先计算速度;二、这里的速度是指一段时间内手指所划过的像素数,比如将时间间隔设置为 1000ms,在 1s 内水平从左至右滑过100像素,那么水平速度就是100 。如果将时间间隔设置为100ms,在这100ms 内滑过10像素,则水平速度会变成 10 。此外,这个速度是可以为负值的,当水平方向从右往左滑动时,水平方向的速度即为负值。
GestureDetector
手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。比如要监听双击行为,代码如下:
GestureDetector mGestureDetector = new GestureDetector(listener);
//再加上这行可以解决长按屏幕后无法拖动的现象
mGestureDetector.setIsLongpressEnabled(false);
接着,接管目标View的onTouchEvent方法,在待监听View的 onTouchEvent 方法中如下实现:
boolean consume = mGestureDetector.onTouchEvent(event);
return consume;
OnGestureListener 与 OnDoubleTapListener 里面的方法有很多,常用的有:onSingleTapUp(单击)、onScroll(拖动)、onLongPress(长按)、onFling(快速滑动)、onScroll(拖动)、onDoubleTap(双击)。
Scroller
弹性滑动对象,用于实现View的弹性滑动,我们知道,当使用View的scrollTo/scrollBy方法来进行滑动时,其过程是瞬间完成的,这时候就可以使用 Scroller 来实现有过渡效果的滑动,它需要和View的conputeScroll方法配合使用才能共同完成这个功能,典型的使用如下:
1 | Scroller mScroller = newScroller(context); |
View 的滑动
未完待续。。。