VelocityTracker类:

这个类的主要作用是用于获取手势在屏幕上滑动的速度。虽然我们可能不太常用,但在这里还是介绍一下如何使用VelocityTracker类。

首先,我们需要获取一个VelocityTracker类的实例mVelocityTracker = VelocityTracker.obtain();。

接下来,我们需要告诉mVelocityTracker对象,我们想要监控哪个MotionEvent(也就是哪个MotionEvent上的运动速度)。可以使用mVelocityTracker.addMovement(ev)方法来指定一个MotionEvent。关于MotionEvent的解释文档是这样描述的:{对象,用于报告运动(鼠标,笔,手指,轨迹球)事件。这个类可能持有绝对或相对运动}。

然后,这一步就相当简单了。我们可以直接使用mVelocityTracker.getXVelocity()方法来获取水平方向上滑动的速度,使用mVelocityTracker.getYVelocity()方法就可以获取垂直方向上滑动的速度了。

最后,我附上一个完整的例子,以便让大家更加明白如何使用VelocityTracker类。

```java

// 创建一个VelocityTracker对象并获取其实例

VelocityTracker mVelocityTracker = VelocityTracker.obtain();

// 向mVelocityTracker对象中添加一个MotionEvent

mVelocityTracker.addMovement(ev);

// 如果事件的动作类型是ACTION_UP(也就是手指抬起的动作)

if (ev.getAction() == MotionEvent.ACTION_UP) {

// 计算当前速度(1000毫秒内的最大速度)

mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);

// 获取水平和垂直方向上的滑动速度

final int velocityX = (int) mVelocityTracker.getXVelocity();

final int velocityY = (int) mVelocityTracker.getYVelocity();

// 如果mListener不为空

if (mListener != null) {

// 定义滑动方向变量Direction

int Direction = FLING_NONE;

// 如果水平方向上的滑动速度大于SNAP_VELOCITY(这里是一个预设值)

if (velocityX > SNAP_VELOCITY) {

// 将滑动方向设置为向左滑动(FLING_LEFT)

Direction = FLING_LEFT;

} else if (velocityX < -SNAP_VELOCITY) {

// 否则,将滑动方向设置为向右滑动(FLING_RIGHT)

Direction = FLING_RIGHT;

} else if (velocityY > SNAP_VELOCITY) {

// 如果垂直方向上的滑动速度大于SNAP_VELOCITY,将滑动方向设置为向下滑动(FLING_DOWN)

Direction = FLING_DOWN;

} else if (velocityY < -SNAP_VELOCITY) {

// 否则,将滑动方向设置为向上滑动(FLING_UP)

Direction = FLING_UP;

}

// 根据滑动方向调用相应的方法处理滑动事件(例如更新UI等)

switch (Direction) {

case FLING_LEFT:

// 实现向左滑动的逻辑

break;

case FLING_RIGHT:

// 实现向右滑动的逻辑

break;

case FLING_DOWN:

// 实现向下滑动的逻辑

break;

case FLING_UP:

// 实现向上滑动的逻辑

break;

default:

// 其他情况,可以在这里处理或不做任何操作(例如恢复初始状态等)

break;

}

}

} else {

// 如果事件的动作类型不是ACTION_UP,可以根据需要进行其他处理(例如继续监听其他手势事件等)

}

```

VelocityTracker类用于追踪触摸事件(例如flinging事件和其他手势事件)的速率。在使用该类时,首先需要调用obtain()函数来获取一个新的实例。然后,将接收到的运动事件添加到VelocityTracker类实例中,可以使用addMovement(MotionEvent)函数实现。当需要确定速率时,可以调用computeCurrentVelocity(int)方法初始化速率的单位,并通过getXVelocity()或getYVelocity()方法获取横向和纵向的速率。

以下是根据提供的内容重构后的代码:

```java

// 获取VelocityTracker实例的方法

private VelocityTracker mVelocityTracker = VelocityTracker.obtain();

@Override

public boolean onTouchEvent(MotionEvent event) {

// 处理触摸事件

int action = event.getActionMasked();

switch (action) {

case MotionEvent.ACTION_DOWN:

// ... 其他操作

break;

case MotionEvent.ACTION_MOVE:

// ... 其他操作

break;

case MotionEvent.ACTION_UP:

// ... 其他操作

break;

}

return true;

}

// 在适当的时机计算当前的速率并获取横竖向的速率

private void calculateVelocityAndGetDirection() {

float velocityX = getXVelocity();

if (Math.abs(velocityX) > SNAP_VELOCITY) {

Direction = velocityX > 0 ? FLING_RIGHT : FLING_LEFT;

} else if (Math.abs(mVelocityTracker.getYVelocity()) > SNAP_VELOCITY) {

Direction = mVelocityTracker.getYVelocity() > 0 ? FLING_DOWN : FLING_UP;

}

}

```

```java

/** * 计算已经发生触摸事件点的当前速率。

* 这个函数只有在你需要得到速率消息的情况下才调用,因为使用它需要消耗很大的性能。

* 通过getXVelocity()和getYVelocity()获得横向和竖向的速率。

*

* @param units 速率单位,如1表示以一毫秒运动了多少个像素的速率,1000表示一秒时间内运动了多少个像素

* @param maxVelocity 方法能计算出事件的最大速率,他的值和上面的units的值具有一样的单位,这个值必须是正数

*/

private void computeVelocity(int units, float maxVelocity) {

// ... 具体实现代码

}

/**

* 在onTouchEvent中使用computeVelocity来计算速度信息

* @param event MotionEvent对象,用于获取触摸事件的信息

*/

private boolean onTouchEvent(MotionEvent event) {

// ... 其他处理触摸事件的代码

if (event.getPointerCount() <= 1) {// 如果只有一个点或者没有点了,就不需要计算速度了

return true;

}

int action = event.getActionMasked();// 获取动作类型,ACTION_POINTER_UP等同于ACTION_UP

int pointerIndex = event.getActionIndex();// 获取哪个手指按下的点的索引

int pointerId = event.getPointerId(pointerIndex);// 获取该手指ID对应的点的ID

long downTime = event.getDownTime();// 获取按下的时间戳

long eventTime = event.getEventTime();// 获取事件发生的时间戳

long motionTime = event.getMotionTime();// 获取移动的时间戳

mVelocityTracker.computeCurrentVelocity(action, pointerIndex);// 根据动作类型和手指索引计算当前速度信息

int xvel = mVelocityTracker.getXVelocity(pointerId);// 根据手指ID获取水平方向上的当前速度

int yvel = mVelocityTracker.getYVelocity(pointerId);// 根据手指ID获取垂直方向上的当前速度

int unit = getUnitsParam();// 获取速率单位参数,如:1表示以像素每毫秒为单位

maxVelocity = getMaxVelocityParam();// 获取最大速率参数,如:1000表示以像素每秒为单位的最大速率

float velocity = (float) Math.hypot(xvel, yvel) * unit;// 根据距离公式计算总的速度大小,并根据速率单位进行转换

int speed = (int) (velocity * maxVelocity);// 根据最大速率进行转换,得到最终的速度大小

int pixelsPerSecond = speed;// 将速度大小转换为像素每秒的大小,作为返回值

return true; // 继续处理后续的触摸事件

}

```

units in which you would like the velocity."(你希望速度以哪种单位表示。)