安卓多点触控及getActionMasked()

9

我有一些关于触摸事件掩码的小问题。我已经在这里和其他地方阅读了许多信息,但仍然对部分内容感到有些困惑。

1)event.getActionMasked() 是否与 event.getAction() & MotionEvent.ACTION_MASK 相同(它们似乎在三星S2和HTC Desire上是相同的)。

2)上述两个命令是否会提供所有信息以及比仅使用event.getAction() 更多的信息,还是不同的。

3)我编写了一段代码,它简单地指出正在触摸哪个位置以及使用哪个pointerId,或者如果该指针未被使用(目前仅编写了两个触摸)。它在上述设备上似乎可以正确工作,但我知道如果不完全正确,某些设备可能会表现出非常不同的行为。因此,我想知道以下内容是否正确并且在所有设备上都能正常运行。

boolean pointer0down=false, pointer1down=false;
String st="", str0 ="", str1 ="";

public boolean onTouchEvent( MotionEvent event )
{

  if (event.getActionMasked()==MotionEvent.ACTION_UP
        ||event.getActionMasked()==MotionEvent.ACTION_POINTER_UP
        ||event.getActionMasked()==MotionEvent.ACTION_CANCEL)
   {
     if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0)
        pointer0down=false;
     if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1)
        pointer1down=false;
   }

  if (event.getActionMasked()==MotionEvent.ACTION_DOWN
    ||event.getActionMasked()==MotionEvent.ACTION_POINTER_DOWN)
  {
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==0)
       pointer0down=true;
    if (event.getPointerId((event.getActionIndex()& MotionEvent.ACTION_MASK))==1)
       pointer1down=true;
   }

 if (pointer0down)
    str0="\tx: " + event.getX(0) + "\ty: "+event.getY(0);
 else
    str0="\tNot down";

 if (pointer1down )
    str1="\tx: " + event.getX(1) + "\ty: "+event.getY(1);
 else
    str1="\tNot down";

 st="pointer0:"+str0+"\npointer1:"+str1;

    return true;
} 
1个回答

17

背景 -

从getAction返回的整数是一个打包的整数,它编码了动作代码(例如 ACTION_DOWN)和指针索引(例如哪个手指)。

对于单点触摸,由于只涉及一个手指,因此不需要存储指针索引,因此该值只是动作代码。因此,像getAction() == ACTION_DOWN这样的操作是安全的。

对于多点触摸,这种比较是不正确的,因为打包的整数中有额外的指针索引。您可以通过执行getAction() & ACTION_MASK提取操作代码,并通过执行getAction() & ACTION_POINTER_INDEX_MASK提取指针索引。

现在回答您的问题 -

1:是的。将getActionMasked视为提取操作代码位的帮助程序方法即可。要提取指针索引,您有等效的getActionIndex帮助程序方法。这两种方法都适用于单点触摸或多点触摸,因此它们是“最稳妥”的。

2:如上所述,对于多点触摸,getAction还编码指针索引。

3:您的代码中存在错误。event.getPointerId((event.getActionIndex() & MotionEvent.ACTION_MASK))在技术上是不正确的。相反,您应该执行event.getPointerId(event.getActionIndex())。您在getActionIndex上使用了错误的逻辑与运算符,非常幸运,它正好是2个字节,掩码本身也是2个字节(0xff):)


要获取指针索引,您还必须将其移位 "motionEvent.action.and(ACTION_POINTER_INDEX_MASK).shr(ACTION_POINTER_INDEX_SHIFT)"。 - Ignacio Tomas Crespo

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