VelocityTracker,顾名思义,即速度跟踪。在Android中,它主要应用于触摸事件(touch event)。通过跟踪一系列事件的实时计算,VelocityTracker可以得出当前的速度。在Android系统空间中,这样的用法随处可见,例如Gestures中的Fling、Scrolling等。

VelocityTracker主要用于跟踪触摸屏事件(如flinging事件和其他手势事件)的速度。通过调用addMovement(MotionEvent)函数,将MotionEvent添加到VelocityTracker类实例中。要获取横向和竖向的速率,可以使用getXVelocity()或getYVelocity()方法。但在使用它们之前,请先调用computeCurrentVelocity(int)方法来初始化速率的单位。

以下是一些公共方法:

- void addMovement(MotionEvent event):将用户的移动添加到跟踪器中。

- void clear():将速度跟踪器重置为初始状态。

- void computeCurrentVelocity(int units, float maxVelocity):根据已收集的点计算当前速度。units表示速率的基本时间单位,unitis值为1表示一毫秒内运动了多少个像素,unitis值为1000表示一秒(1000毫秒)内运动了多少个像素。floatVelocity表示速率的最大值。

```java

/** * 计算当前速度

* @param units 单位

*/

public void computeCurrentVelocity(int units) {

// 这里可以使用computeCurrentVelocity(int, float)方法,并设置最大速度为Float.MAX_VALUE

}

/**

* 获取最后一个计算的X速度

* @return X速度

*/

public float getXVelocity() {

// 这里返回最后一个计算的X速度

}

/**

* 获取指定ID的最后一个计算的X速度

* @param id ID

* @return X速度

*/

public float getXVelocity(int id) {

// 这里返回指定ID的最后一个计算的X速度

}

/**

* 获取最后一个计算的Y速度

* @return Y速度

*/

public float getYVelocity() {

// 这里返回最后一个计算的Y速度

}

/**

* 获取指定ID的最后一个计算的Y速度

* @param id ID

* @return Y速度

*/

public float getYVelocity(int id) {

// 这里返回指定ID的最后一个计算的Y速度

}

/**

* 获取一个VelocityTracker对象以监视运动的速度,并将其回收供其他人使用。如果需要重用此对象,请将其设置为池化状态。

* @return VelocityTracker对象

*/

public abstract boolean obtain();

/**

* 将VelocityTracker对象返回以供其他人重用。如果不需要重用此对象,请将其设置为非池化状态。

*/

public abstract void recycle();

/**

* 设置此VelocityTracker对象是否为池化状态。如果为true,则在不再需要时将返回给池中;如果为false,则将在不再需要时直接删除。默认值为false。

* @param isPooled 是否为池化状态

*/

public abstract void setPooled(boolean isPooled);

```

```java

@Overridepublic boolean onTouchEvent(MotionEvent ev) {

if (null == mVelocityTracker) {

mVelocityTracker = VelocityTracker.obtain();

}

mVelocityTracker.addMovement(ev);

switch (ev.getAction()) {

case MotionEvent.ACTION_UP:

// 隐藏在左边的宽度

int scrollX = getScrollX();

Loger.e(ObjEarth.TAG, "V= " + mVelocityTracker.getXVelocity());

if (Math.abs(mVelocityTracker.getXVelocity()) > 4000f) {

if (mVelocityTracker.getXVelocity() < 0f) {

//正向逻辑代码

} else {

//反向逻辑代码

}

}

return true;

case MotionEvent.ACTION_MOVE:

mVelocityTracker.computeCurrentVelocity(1000); //设置units的值为1000,意思为一秒时间内运动了多少个像素

}

return super.onTouchEvent(ev);

}

```