android / java multitouch,whats&在这种情况下,什么>>?

时间:2013-01-06 20:34:31

标签: java android multi-touch masking

我也是Android世界的新手,也是Java的新手,但几年前作为一个dot-net:呃几年前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行我不知道'>>'是什么用于...所以请解释:)

提前致谢!

1 个答案:

答案 0 :(得分:0)

getAction()过去(在旧版Android中)只返回基本的向上,向下,悬停(等)动作。这使您可以执行event.getAction() == ...之类的操作,以确定它是否是特定类型的操作。然而,随着多点触控的引入,触控事件变得更加复杂。现在,与动作一起,指针信息也存储在“动作”中。在你提出问题之前:是的,他们本可以采用两种不同的方法,但能不能将整个行动的信息放在一个方面更容易吗?

如JavaDocs中的@millimoose's link所示,&只保留匹配的位(a & b == 1,用于两位ab如果a == b == 1)。您可能还想查看the basics of bit flags and fields,它们是使用其位表示各种状态的整数。

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

下一行采用第二组8位(从右侧开始,它们是第8位到第15位,包括第8位),然后将它们右移8,以便1 0000 0000(为演示添加的空格)变为1。 (此操作符,右移,也在JavaDoc链接中进行了解释。)

因此,假设事件为ACTION_UP,指针索引为6,它为我们提供有关事件和指针的信息。这将表示为(6 << ACTION_POINTER_INDEX_SHIFT) | ACTION_UP110 0000 0001。在这种情况下,

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

请注意,在API 8及更高版本上,您可以访问getActionMasked(),它可以获取您在上面使用过的action变量。