VelocityTracker是一个用于跟踪触摸屏事件速率的类,尤其在Android系统中的Gestures中的Fling和Scrolling等手势事件中得到广泛应用。它通过实时跟踪一系列事件来计算当前的速度。
要使用VelocityTracker,首先需要将其与触摸事件关联起来。可以通过调用addMovement(MotionEvent)方法将MotionEvent添加到VelocityTracker实例中。然后,可以使用getXVelocity()或getYVelocity()方法获取横向和竖向的速率。在使用这些方法之前,需要先调用computeCurrentVelocity(int)方法来初始化速率的单位。
以下是一些常用的公共方法:
1. void addMovement(MotionEvent event):将用户的移动添加到跟踪器中。
2. void reset():将速度跟踪器重置为其初始状态。
3. void computeCurrentVelocity(int units, float maxVelocity):根据已收集的点计算当前速度。units表示速率的基本时间单位,unitis值为1表示一毫秒内运动了多少个像素,unitis值为1000表示一秒内运动了多少个像素。maxVelocity表示速率的最大值。
4. abstract T getLastComputedXVelocity();:获取上一次计算的X轴速度。
5. float getLastComputedXVelocity(int id);:获取指定ID的上一次计算的X轴速度。
6. float getLastComputedYVelocity();:获取上一次计算的Y轴速度。
以下是重构后的代码:
```java
// 获取上一次计算的Y速度
float getLastComputedYVelocity() {
// 实现方法
}
// 检索一个新的VelocityTracker对象以监视运动的速度
VelocityTracker obtainVelocityTracker() {
// 实现方法
}
// 将VelocityTracker对象返回给其他对象重复使用
void recycleVelocityTracker(VelocityTracker tracker) {
// 实现方法
}
```
```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);
}
```