跟踪移动视图的速度

8
我在使用VelocityTracker类时遇到了问题。如果您测量非移动视图上的触摸事件速度,速度跟踪似乎运行得很好,但一旦视图开始随着手指移动(使用translateY/X或setY/X),速度就会完全随机(我认为速度是使用视图的位置计算的?)。有人有什么建议可以在滑动视图时获取准确的移动速度吗?
注: 我正在使用来自View的onTouchListener的触摸事件进行速度跟踪。
干杯
4个回答

8

您应该跟踪视图移动的量,并在将其传递给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坐标,因此不受您正在监听的任何视图的移动影响。

2
最简单的处理绝对坐标的方法是写成: motionEvent.setLocation(e.getRawX(), e.getRawY());

如果您希望 MotionEvent 在其他地方使用,请先使用 MotionEvent.obtain() 创建一个副本。 - Peri Hartman

0
假设您没有进行缩放,触摸的速度是指您的手指移动的距离除以时间。获取时间很容易-只需在每个事件上请求系统时间(以毫秒为单位)并将其相减即可。对于已翻译的视图,您需要确保使用相同的参考框架。基本上,通过跟踪平移视图设置的x和y偏移量,并将触摸的偏移量添加到其中,以获取手指相对于原点的总偏移量。仅针对速度跟踪比较这些数字。
如果您也要缩放视图,则会变得更加复杂。您需要使用缩放因子进行相同类型的数学运算。基本上,您正在将所有点转换为相同的参考系。

好的,这听起来非常容易。我希望使用VelocityTracker类并让它为我完成,但也许我会像你说的那样自己实现它。 - Bradley Campbell

-1

我认为你在谈论相机运动,比如实时跟踪运动员。

如果是这样,只有一种方法:在捕捉运动过程中,需要一个固定点,比如地上的网球,以减去静态球体速度与运动员“一点”的速度差。

为此,需要获取静态对象初始和最终帧的X、Y坐标,以便将其与移动对象进行差分。

移动对象:Square((X位置最终-X位置初始)^2 + (Y位置最终-Y位置初始)^2 ) 然后将像素转换为米或英里 然后将结果除以秒(还需要从毫秒转换) 您将得到移动对象的公里/小时和英里/小时。

对于静态对象执行所有步骤。 从移动对象中减去静态对象的结果。

缩放操作也适用于同样的方法。 所有操作都是手动的。如果您想要实时的真实速度,您需要自动跟踪,这不适用于Android。在足球比赛中,使用4个摄像头需要至少3000Mhz的四核处理器。我建议使用Matlab。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接