我在使用 VelocityTracker 类时遇到了问题。如果您在非移动视图上测量触摸事件的速度,速度跟踪似乎工作得很好,但是一旦视图开始用手指移动(使用 translateY/X 或 setY/X),速度就完全随机(我认为速度是使用视图的位置计算的?)。有没有人对在滑动视图时获得准确的移动速度有任何建议?
注意:我正在使用 View 的 onTouchListener 中的触摸事件进行速度跟踪。
干杯
我在使用 VelocityTracker 类时遇到了问题。如果您在非移动视图上测量触摸事件的速度,速度跟踪似乎工作得很好,但是一旦视图开始用手指移动(使用 translateY/X 或 setY/X),速度就完全随机(我认为速度是使用视图的位置计算的?)。有没有人对在滑动视图时获得准确的移动速度有任何建议?
注意:我正在使用 View 的 onTouchListener 中的触摸事件进行速度跟踪。
干杯
您应该跟踪视图已移动了多少,并在MotionEvent.offsetLocation
将事件坐标传递给VelocityTracker
.
private float mLastX;
private float mTranslationX;
private VelocityTracker mTracker;
@Override
public boolean onTouch(final View view, MotionEvent motionEvent) {
motionEvent.offsetLocation(mTranslationX, 0);
switch (motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
mLastX = motionEvent.getRawX();
mTracker = VelocityTracker.obtain();
mTracker.addMovement(motionEvent);
return true;
case MotionEvent.ACTION_MOVE:
mTranslationX += motionEvent.getRawX() - mLastX;
view.setTranslationX(mTranslationX);
mTracker.addMovement(motionEvent);
return true;
case MotionEvent.ACTION_UP:
// get your correct velocity from mTracker
...
}
}
查看MotionEvent.getRawX
/的文档Y
。
它们返回指针相对于整个屏幕的 X/Y 坐标,因此它们不受您正在收听的任何 View 的移动的影响。
处理绝对坐标的最简单方法是:
motionEvent.setLocation(e.getRawX(), e.getRawY());
假设您不进行缩放,则触摸速度是您的手指移动的量除以时间。时间很容易获得——只需在每个事件和子跟踪上请求系统时间(以毫秒为单位)。对于翻译后的视图,您需要确保使用相同的参考框架。基本上通过平移来跟踪视图集的 x 和 y 偏移,并将触摸的偏移添加到它以获得手指相对于原点的总偏移。仅比较这些数字以进行速度跟踪。
如果你也在缩放视图,它会变得更加复杂。您需要对比例因子进行同样的数学运算。基本上,您将所有点转换为相同的参考 system.q
我认为您是在谈论摄像机运动,例如实时跟踪运动员。如果是这样,那么只有一种方法:在捕捉运动过程中,您需要一个固定点,就像地面上的网球一样,将静态球的速度减去运动员的“一个关节”。为此,需要获取静态对象的初始帧和最终帧中的 X、Y 坐标,以对运动对象产生差异。
移动对象: Square((X position final-X position initial)^2 + (Y position final-Y position initial)^2 ) 然后将像素转换为米或英里,然后将结果除以秒(也需要从毫秒转换)你得到移动物体的km/h和mp/h。
对静态对象执行所有步骤。将静态对象的结果减去移动对象。
这同样适用于缩放操作。所有操作都是手动的。如果你想要实时的真实速度,你需要不适合安卓的自动跟踪。在足球比赛中,使用 4 个摄像头,您需要至少 3000Mhz 的四核处理器。我建议使用 Matlab。