【问题标题】:Track the velocity of a moving view跟踪移动视图的速度
【发布时间】:2013-07-04 03:13:29
【问题描述】:

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

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

干杯

【问题讨论】:

    标签: android android-view


    【解决方案1】:

    您应该跟踪视图移动了多少,并在将事件坐标传递给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 的移动的影响。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果您希望 MotionEvent 在其他地方使用,请先使用 MotionEvent.obtain() 复制它。
      【解决方案3】:

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

      如果您还要缩放视图,它会变得更加复杂。您需要对比例因子进行同样的数学运算。基本上,您将所有点转换为同一个参考系统。q

      【讨论】:

      • 好的。这听起来很容易。我希望使用 VelocityTracker 类并为我完成它,但也许我会像你说的那样自己实现它。
      【解决方案4】:

      我认为您是在谈论摄像机运动,例如实时跟踪运动员。 如果是这样,那么只有一种方法:在捕捉运动过程中,您需要一个固定点,就像地面上的网球一样,将静态球的速度减去运动员的“一个关节”。 为此,需要获取静态对象的初始帧和最终帧中的X、Y坐标,以对运动对象产生差异。

      移动对象:Square((X position final-X position initial)^2 + (Y position final-Y position initial)^2 ) 然后将像素转换为米或英里 然后将结果除以秒(也需要从毫秒转换) 你会得到移动物体的 km/h 和 mp/h。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        • 2011-10-29
        相关资源
        最近更新 更多