AndrooidVelocityTracker滑动速度跟踪类使用介绍

本文主要介绍滑动速度跟踪类VelocityTracker的使用
它主要用于跟踪触摸事件的速度辅助,实现flinging以及其它类似的手势(如甩等动作)。


VelocityTracker原理

它的原理是把触摸事件 MotionEvent 对象传递给VelocityTracker的addMovement(MotionEvent)方法
然后分析MotionEvent 对象在单位时间类发生的位移来计算速度。
你可以使用getXVelocity() 或getXVelocity()获得横向和竖向的速率到速率时。
但是使用它们之前请先调用computeCurrentVelocity(int)来初始化速率的单位 。

主要函数

返回类型 方法名 作用
void addMovement(MotionEvent event) 将MotionEvent添加到跟踪器
void clear() 将速度跟踪器重置回到其初始状态。
void computeCurrentVelocity(int units) 相当于以computeCurrentVelocity(int, float)最大速度Float.MAX_VALUE 调用。
void computeCurrentVelocity(int units, float maxVelocity) 根据收集的点计算当前速度。units单位毫秒,(返回units毫秒内移动的像素值)
float getXVelocity() 检索最后计算的X速度。
float getXVelocity(int id) 指定指针检索最后计算的X速度。
float getYVelocity() 检索最后计算的Y速度。
float getYVelocity(int id) 指定指针检索最后计算的Y速度。
static VelocityTracker obtain() 检索一个新的VelocityTracker对象来观察运动的速度。
void recycle() 返回一个VelocityTracker对象,被其他人重新使用。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private VelocityTracker mVelocityTracker;//全局生命变量  
/**
* 获取速度追踪器
* @return
*/
private void addMovement(MotionEvent event) {
if (mVelTracker == null) {
mVelTracker = VelocityTracker.obtain();
}
mVelTracker.addMovement(event);
}
/**
* 回收速度追踪器
*/
private void recycleVelocityTracker() {
if (mVelTracker != null) {
mVelTracker.clear();
mVelTracker.recycle();
mVelTracker = null;
}
}

//在onTouchEvent(MotionEvent ev) 或 dispatchTouchEvent(MotionEvent ev) 中
//将事件加入到VelocityTracker类实例中
addMovement(ev);

//判断当ev事件是MotionEvent.ACTION_UP 或 MotionEvent.ACTION_CANCEL时:计算速率

//设置maxVelocity值为100时,速率大于100时,显示的速率都是100,速率小于100时,显示正常
mVelTracker.computeCurrentVelocity(1000,100);
//这里打印出的是最后计算的X速度 范围(-100,100)
Log.i("test","velocityTraker"+velocityTracker.getXVelocity());
//设置units的值为1000,意思为一秒时间内运动了多少个像素
mVelTracker.computeCurrentVelocity(1000);
//这里打印出的是最后计算的X速度 范围(-Float.MAX_VALUE,Float.MAX_VALUE)
Log.i("test","velocityTraker"+velocityTracker.getYVelocity());

总结

当需要获取触摸屏事件的速度时,需要以下步骤:

  • 使用obtain()方法获得VelocityTracker实例
  • 在onTouchEvent 或 dispatchTouchEvent(MotionEvent ev) 回调函数中,使用addMovement(MotionEvent)函数将当前的移动事件传递给VelocityTracker对象
  • 调用computeCurrentVelocity (int units)函数来计算当前的速度
  • 使用 getXVelocity()、 getYVelocity()函数来获得当前的速度