Android多点触控和getActionMasked()

我对触摸事件的掩饰有一些小问题。 我已经在这里和其他地方读了很多东西,但是还是有些困惑。

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

Solutions Collecting From Web of "Android多点触控和getActionMasked()"

一些背景 –

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):)