2

我也是 android 世界的新人,Java 也很新,但是几年前作为 dot-net:er 和 Java 的一些学分,我并不完全落后 :)。 .但我仍然没有真正理解'&'和'>>'在以下两行中的实际作用..谁能解释一下..

int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;

如果我理解第一行是正确的,event.getAction() 返回一个带有一堆信息的 int,但由于我们只对触发的动作感兴趣,所以我们添加 '& MotionEvent.ACTION_MASK' 以“解析”出来那一点..我是对的还是完全错的?

2:nd 行我不知道“>>”是做什么用的..所以请解释一下:)

提前致谢!

4

1 回答 1

0

getAction()过去(在旧版本的 Android 中)只返回非常基本的向上、向下、悬停(等)动作。这使您可以做一些事情,例如event.getAction() == ...确定它是否是一种特定的动作。然而,随着多点触控的引入,触控事件变得更加复杂。现在,与动作一起,指针信息也存储在“动作”中。在你问之前:是的,他们本可以使用两种不同的方法,但是将动作的全部信息合二为一不仅更容易吗?

如JavaDocs中@millimoose 的链接&所示,将只保留匹配的位(a & b == 1对于两个位ab当且仅当a == b == 1)。您可能还想查看位标志和字段的基础知识,它们是使用位来表示各种状态的整数。

因此,当您调用 时& MotionEvent.ACTION_MASK,它将仅保留与 的位匹配ACTION_MASK的位(11111111或最右边的 8 位)。这是存储动作的地方(注意所有动作整数值都小于 255——最右边的 8 位)。

下一行取第二组 8 位(从右边开始,它们是第 8 位到第 15 位,包括),然后将它们右移 8 位,这样1 0000 0000(为演示而添加的空格)变为1. (这个运算符,右移,也在 JavaDoc 链接中解释。)

所以假设事件是ACTION_UP并且指针索引是 6,它为我们提供了关于事件和指针的信息。那将表示为(6 << ACTION_POINTER_INDEX_SHIFT) | ACTION_UP, 或110 0000 0001。在这种情况下,

  • 的值event.getAction()等于110 0000 0001;
  • 您的action变量等于0000 0001(当然,您可以忽略前导 0);和
  • 您的pointerIndex变量等于110(或6十进制)。

请记住,在 API 8 及更高版本上,您可以访问getActionMasked(),这将获得您在action上面使用的变量。

于 2013-01-06T23:36:21.773 回答