VelocityTracker:计算滑动速率
速度追踪,计算在手机屏幕上滑动速度,无论是水平还是垂直的速度。Android已经为我们提供了一个类VelocityTracker,借助VelocityTracker可以很方便的计算触摸屏幕的滑动速度。
获取VelocityTracker,很简单,通过VelocityTracker类的静态方法obtain()获取。
VelocityTracker mVelocityTracker = VelocityTracker.obtain();从源码可以看到是维护了一个VelocityTracker对象池,从这个同步的SynchronizedPool中获取VelocityTracker对象实例(如果没有则创建对象)。
private static final SynchronizedPool<VelocityTracker> sPool = new SynchronizedPool<VelocityTracker>(2);
...
static public VelocityTracker obtain() {
VelocityTracker instance = sPool.acquire();
return (instance != null) ? instance : new VelocityTracker(null);
}设置VelocityTracker,参数是时间单位ms,比如1000ms内的移动速率。
mVelocityTracker.computeCurrentVelocity(1000);还有一个重载的方法,第二个浮点型参数是设定能测量的最大速率。
mVelocityTracker.computeCurrentVelocity(1000, 2000.0f);看源码可以发现这两个方法都调用了同一个JNI底层的接口,只是第一个方法将速度设定默认无限Float.MAX_VALUE。
public void computeCurrentVelocity(int units) {
nativeComputeCurrentVelocity(mPtr, units, Float.MAX_VALUE);
}
//到了native层
private static native void nativeComputeCurrentVelocity(long ptr, int units, float maxVelocity);在触摸事件监听中将event传给VelocityTracker。
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
switch (event.getAction()) {
//滑动event加入计算
case MotionEvent.ACTION_MOVE:
mVelocityTracker.computeCurrentVelocity(1000);
int X = (int) mVelocityTracker.getXVelocity();
int Y = (int) mVelocityTracker.getYVelocity();
break;
//抬起时释放
case MotionEvent.ACTION_UP:
if (null != mVelocityTracker) {
mVelocityTracker.clear();
mVelocityTracker.recycle();
mVelocityTracker = null;
}
break;
default:
break;
}
return super.onTouchEvent(event);
}就可以计算获得触摸过程中的滑动速率。注意get速率的方法有两个一个无参,一个有参,出入的是触摸指针的id,源码说明是Which pointer's velocity to return。因为现在手机是多点触控的,可以同时又很多手指触摸屏幕移动,默认传入-1。

每次都能遇到Android玄学坑,一模一样的代码为什么测不出来速度呢?调试了很长时间,终于找到原因,原来设置时间computeCurrentVelocity()方法必须放在addMovement(event)方法之后调用,否则获得的一直是0.0f!

