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);
}
```