https://developer.android.com/training/gestures/movement.html
跟踪移动(Tracking Movement)
当触摸点位置,压力或尺寸发生变化时,会触发一个新的 MotionEvent.ACTION_MOVE 事件。
因为基于手指的触摸并不总是最精确的交互形式,因此检测触摸事件通常更多地基于移动而不是简单的接触。 为了帮助应用程序区分基于移动的手势(例如swipe)和非移动手势(例如single tap),Android包括“touch slop”的概念。 “touch slop”是指用户的触摸可以在手势被解释为基于运动的手势之前漫游的距离(以像素为单位)。 有关此主题的更多讨论,请参阅管理ViewGroup中的触摸事件。
根据您的应用需求,有几种不同的方式来跟踪手势中的移动。 例如:
- 指针的开始和结束位置(例如,将屏幕对象从点A移动到点B)。
- 指针正在行进的方向,由x和y坐标确定。
- 手势历史。
通过调用MotionEvent方法getHistorySize()可以得到手势历史的大小。
然后,可以使用MotionEvent的getHistorical<Value>方法获取每个历史事件的位置,大小,时间和压力。 渲染用户手指的踪迹(例如触摸绘图)时,历史记录非常有用。 有关详细信息,请参阅MotionEvent参考。 - 指针在触摸屏上移动时的速度。
跟踪速度(Track Velocity)
你可以有一个基于运动的手势,它只是基于指针行进的 距离 和/或 方向。
但速度通常是跟踪手势特征或甚至决定手势是否发生的决定性因素。 为了使速度计算更容易,Android在支持库中提供VelocityTracker类和VelocityTrackerCompat类。
VelocityTracker可以帮助您跟踪触摸事件的速度。
这对于速度是手势的标准的一部分的手势(例如fling)是有用的。
以下是一个简单的示例,说明VelocityTracker API中方法的用途:
public class MainActivity extends Activity {
private static final String DEBUG_TAG = "Velocity";
...
private VelocityTracker mVelocityTracker = null;
@Override
public boolean onTouchEvent(MotionEvent event) {
int index = event.getActionIndex();
int action = event.getActionMasked();
int pointerId = event.getPointerId(index);
switch(action) {
case MotionEvent.ACTION_DOWN:
if(mVelocityTracker == null) {
// Retrieve a new VelocityTracker object to watch the velocity of a motion.
mVelocityTracker = VelocityTracker.obtain();
}
else {
// Reset the velocity tracker back to its initial state.
mVelocityTracker.clear();
}
// Add a user's movement to the tracker.
mVelocityTracker.addMovement(event);
break;
case MotionEvent.ACTION_MOVE:
mVelocityTracker.addMovement(event);
// When you want to determine the velocity, call
// computeCurrentVelocity(). Then call getXVelocity()
// and getYVelocity() to retrieve the velocity for each pointer ID.
mVelocityTracker.computeCurrentVelocity(1000);
// Log velocity of pixels per second
// Best practice to use VelocityTrackerCompat where possible.
Log.d("", "X velocity: " + VelocityTrackerCompat.getXVelocity(mVelocityTracker, pointerId));
Log.d("", "Y velocity: " + VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId));
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// Return a VelocityTracker object back to be re-used by others.
mVelocityTracker.recycle();
break;
}
return true;
}
}
注意:在ACTION_UP之后,X和Y速度将为0,您应该在ACTION_MOVE事件之后计算速度。