我在使用VelocityTracker类时遇到了问题。如果您正在测量非移动视图上的触摸事件的速度,则速度跟踪似乎效果很好,但只要视图开始随手指移动(使用translateY/X或setY/X),速度就会完全随机(我认为速度是使用视图的位置计算的?)。有没有人有任何建议让您在滑动视图时获得准确的运动速度?跟踪移动视图的速度
说明: 我正在使用View的onTouchListener中的触摸事件进行速度跟踪。
干杯
我在使用VelocityTracker类时遇到了问题。如果您正在测量非移动视图上的触摸事件的速度,则速度跟踪似乎效果很好,但只要视图开始随手指移动(使用translateY/X或setY/X),速度就会完全随机(我认为速度是使用视图的位置计算的?)。有没有人有任何建议让您在滑动视图时获得准确的运动速度?跟踪移动视图的速度
说明: 我正在使用View的onTouchListener中的触摸事件进行速度跟踪。
干杯
假设你不结垢,触摸的速度是你的手指移动的量,除以时间。时间很容易得到 - 只需要在毫秒中对每个事件请求系统时间并进行减法运算。对于翻译的视图,你想确保你使用相同的参照系。基本上通过翻译它来跟踪视图集的x和y偏移量,并将触摸的偏移量添加到它以获得手指相对于原点的总偏移量。只比较这些数字进行速度跟踪。
如果您也在缩放视图,它会变得更加复杂。你需要用缩放因子来做同样的数学运算。基本上,您将所有点转换为相同的参考系统。q
您应该跟踪视图已移动了多少,并在将其传递到VelocityTracker
之前先调用MotionEvent.offsetLocation
以“修复”事件坐标。
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的移动影响。
我想你是在谈论相机运动,就像跟踪运动员的实时。 如果是这样,只有一种方法:在捕捉运动过程中,需要一个固定点,比如地面的网球,以便将静态球的速度减去运动员的“一个关节”。 要做到这一点,需要获取静态物体的初始帧和最终帧中的X,Y坐标,以便与运动物体产生差异。移动物体:方形((X位置最终-X位置初始)^ 2 +(Y位置最终-Y位置初始)^ 2) 然后将像素转换为米或英里 然后将结果除以秒需要从毫秒转换) 你得到运动物体的km/h和mp/h。
执行静态对象的所有步骤。 将静态对象的结果减去运动对象。
这同样适用于缩放操作。 所有的操作都是手动的。如果你想要实时的实时速度,你需要自动跟踪不适合android。在足球方面,使用4台摄像机需要至少3000Mhz的四处理器。我建议使用Matlab。
与绝对坐标的最简单的方式处理写:
motionEvent.setLocation(e.getRawX(), e.getRawY());
如果您希望在其他地方使用MotionEvent,请使用MotionEvent.obtain()首先制作它的副本。 –
确定。这听起来很容易。我希望能够使用VelocityTracker类,并且为我完成了它,但是也许我会像你说的那样自己实现它。 –