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;
} 
4

1 回答 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):)

于 2013-03-13T03:11:47.770 回答