跟踪移动视图的速度

时间:2013-07-04 03:13:29

标签: android android-view

使用VelocityTracker类时遇到了问题。如果您在非移动视图上测量触摸事件的速度,则速度跟踪似乎非常有效,但是一旦视图开始用手指移动(使用translateY / X或setY / X),速度就完全没有了随机(我认为速度是使用视图的位置计算的?)。有人建议在滑动视图时获得准确的移动速度吗?

注意: 我使用View的onTouchListener中的触摸事件进行速度跟踪。

干杯

4 个答案:

答案 0 :(得分: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坐标,因此它们不受您正在收听的任何View的移动的影响。

答案 1 :(得分:2)

最简单的方法是处理绝对坐标写:

motionEvent.setLocation(e.getRawX(), e.getRawY());

答案 2 :(得分:0)

假设您没有缩放,则触摸的速度是手指移动的量除以时间。时间很容易获得 - 只需要在每个事件和子跟踪上以毫秒为单位请求系统时间。对于已翻译的视图,您需要确保使用相同的参考框架。基本上通过平移来跟踪视图集的x和y偏移,并将触摸的偏移量添加到它以获得手指相对于原点的总偏移量。只比较速度跟踪的数字。

如果您正在缩放视图,它会变得更复杂。您需要使用缩放因子进行相同类型的数学运算。基本上你将所有点都转换成相同的参考系统.q

答案 3 :(得分:-1)

我认为你在谈论相机运动,就像跟踪运动员一样。 如果是这样,只有一种方法:在捕捉运动过程中,你需要一个固定的点,就像地上的网球一样,将静态球的速度减去运动员的“一个关节”。 要做到这一点,必须获取静态对象的初始和最终帧中的X,Y坐标,以便与移动对象产生差异。

移动物体:方形((X位置最终-X位置初始)^ 2 +(Y位置最终-Y位置初始)^ 2) 然后将像素转换为米或英里 然后将结果除以秒(也需要从毫秒转换) 你得到km / h和mp / h的移动物体。

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

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