我对触摸事件的屏蔽有一些小问题。我在这里和其他地方看过很多东西,但我仍然对零件感到困惑。
1)event.getActionMasked()
与event.getAction() & MotionEvent.ACTION_MASK
相同(它们似乎出现在三星S2和HTC Desire上)
2)上述两个命令是否会提供所有信息,而不仅仅是event.getAction()
,或者它是不同的。
3)我写了一段简单的代码,说明了触摸的位置和指针的位置,或指针是否未被使用(目前只写了两次触摸)。它似乎在上面提到的设备上正常工作,但是我知道如果没有完全正确的话,某些设备可以采取非常不同的行为。因此,我想知道以下是否正确并且将在所有设备上运行。
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;
}
答案 0 :(得分:16)
一些背景 -
从getAction返回的整数是一个压缩整数,它对动作代码(例如ACTION_DOWN)和指针索引(例如哪个手指)进行编码。
对于单次触摸,由于只涉及一个手指,因此不需要存储指针索引,因此值只是动作代码。因此可以安全地执行getAction() == ACTION_DOWN
对于多点触控,此比较不正确b / c您在打包的整数中有额外的指针索引。您可以通过执行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):)