我也是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行我不知道'>>'是什么用于...所以请解释:)
提前致谢!
答案 0 :(得分:0)
getAction()
过去(在旧版Android中)只返回基本的向上,向下,悬停(等)动作。这使您可以执行event.getAction() == ...
之类的操作,以确定它是否是特定类型的操作。然而,随着多点触控的引入,触控事件变得更加复杂。现在,与动作一起,指针信息也存储在“动作”中。在你提出问题之前:是的,他们本可以采用两种不同的方法,但能不能将整个行动的信息放在一个方面更容易吗?
如JavaDocs中的@millimoose's link所示,&
只保留匹配的位(a & b == 1
,用于两位a
和b
如果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_UP
或110 0000 0001
。在这种情况下,
event.getAction()
的值等于110 0000 0001
; action
变量等于0000 0001
(当然,您可以忽略前导0);和pointerIndex
变量等于110
(或十进制6
)。请注意,在API 8及更高版本上,您可以访问getActionMasked()
,它可以获取您在上面使用过的action
变量。