我在使用VelocityTracker类时遇到了问题。如果您测量非移动视图上的触摸事件速度,速度跟踪似乎运行得很好,但一旦视图开始随着手指移动(使用translateY/X或setY/X),速度就会完全随机(我认为速度是使用视图的位置计算的?)。有人有什么建议可以在滑动视图时获取准确的移动速度吗?
注: 我正在使用来自View的onTouchListener的触摸事件进行速度跟踪。
干杯
注: 我正在使用来自View的onTouchListener的触摸事件进行速度跟踪。
干杯
您应该跟踪视图移动的量,并在将其传递给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坐标,因此不受您正在监听的任何视图的移动影响。motionEvent.setLocation(e.getRawX(), e.getRawY());
我认为你在谈论相机运动,比如实时跟踪运动员。
如果是这样,只有一种方法:在捕捉运动过程中,需要一个固定点,比如地上的网球,以减去静态球体速度与运动员“一点”的速度差。
为此,需要获取静态对象初始和最终帧的X、Y坐标,以便将其与移动对象进行差分。
移动对象:Square((X位置最终-X位置初始)^2 + (Y位置最终-Y位置初始)^2 ) 然后将像素转换为米或英里 然后将结果除以秒(还需要从毫秒转换) 您将得到移动对象的公里/小时和英里/小时。
对于静态对象执行所有步骤。 从移动对象中减去静态对象的结果。
缩放操作也适用于同样的方法。 所有操作都是手动的。如果您想要实时的真实速度,您需要自动跟踪,这不适用于Android。在足球比赛中,使用4个摄像头需要至少3000Mhz的四核处理器。我建议使用Matlab。