【问题标题】:Android - How to distinguish first pointer and second pointer move in onTouchEventAndroid - 如何区分第一个指针和第二个指针在onTouchEvent中移动
【发布时间】:2012-07-23 11:50:43
【问题描述】:

我想在我的活动中处理一个手势。为此,我在我的 Activity 上覆盖了 public boolean onTouchEvent(MotionEvent MEvent) 方法。内容如下:

motionaction = MEvent.getAction();

if(motionaction == MotionEvent.ACTION_DOWN)
{
    ...
    return true;
}

if(motionaction == MotionEvent.ACTION_UP)
{
    ...
    return true;
}

if(motionaction == MotionEvent.ACTION_MOVE)
{ 
    ...
    return true;
}

motionaction = MEvent.getActionMasked();

if(motionaction == MotionEvent.ACTION_POINTER_DOWN)
{
    ...
    return true;
}

if(motionaction == MotionEvent.ACTION_POINTER_UP)
{
    ...
    return true;
}

return true;

手势如下:

-finger1在屏幕上保持它的位置(实际上是因为总是有一点移动)

-finger2 在屏幕上移动。这是我想要抓住的运动。

我可以抓取 5 个动作,但问题是当两根手指在屏幕上时,ACTION_MOVE 会抓取第一根和第二根手指的移动。 MEvent.getActionIndex() 方法不适用于始终返回 0 的 ACTION_MOVE;我唯一能做的就是保存手指 1 的位置并丢弃该点附近的移动。结果确实并不完美,有时手指2 的移动会被小指1 的移动“污染”,因为尽管手指保持在屏幕上的位置,但听众会感觉到每一个最小的移动。

我该如何改进?

【问题讨论】:

    标签: java android touch listener gesture


    【解决方案1】:

    参考Quintin Balsdon的回答:

    我的代码中有类似的东西。我在 ACTION_DOWN 情况下保存了手指 1 的位置,然后当手指 2 移动时,我查看移动的 Y 坐标是否超过了保存的手指 1 Y 坐标。如果是这样,则将其称为finger2的运动,否则称为finger1,我在两指模式下将其丢弃。

    如果我尝试在单指模式下在我的视图上画一个圆圈,我会得到这样的结果: http://img208.imageshack.us/img208/8113/onefingercircle.jpg

    如果我尝试在两指模式下在我的视图上画一个圆圈,我会得到这样的结果: http://img256.imageshack.us/img256/6778/twofingercircle.jpg

    所以在单指模式下它可以完美运行,但在两指模式下就不行了。 我不知道它是否与手机多点触控处理程序或触摸屏有关。它也可能只是硬件相关,或者我对 API 的误解。

    【讨论】:

      【解决方案2】:

      这是由您作为开发人员管理的。您将不得不创建一些布尔变量以在“DOWN”动作发生时设置(为真),然后在“UP”或“MOVE”动作事件发生时取消设置(假)。在下面的代码中,我甚至在“DOWN”发生时维护坐标,并在用户四处移动时进行调整。

      switch (e.Action) //e is a MotionEvent type
      {
          case MotionEvent.ACTION_DOWN:
          {                        
              _prevx = e.getX();
              _prevy = e.getY();
          }
          break;
          case MotionEvent.ACTION_MOVE:
          {
              _xoffset += e.GetX() - _prevx;
              _yoffset += e.GetY() - _prevy;
              Invalidate();
      
              _prevx = e.GetX();
              _prevy = e.GetY();
          }
          break;
      }
      

      如果要进行多指拖动,则需要实现 ScaleGestureDetector.OnScaleGestureListener (http://developer.android.com/reference/android/view/ScaleGestureDetector.OnScaleGestureListener.html)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        相关资源
        最近更新 更多