【问题标题】:android/java multitouch, whats & in this case and whats >>?android/java 多点触控,在这种情况下是什么 & 什么是 >>?
【发布时间】:2023-03-28 00:40:02
【问题描述】:

我也是 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 行我不知道 '>>' 是做什么用的......所以请解释一下:)

提前致谢!

【问题讨论】:

  • 还有什么理由让 event.getAction 返回的不仅仅是实际触发的操作吗?
  • 谢谢你对它的解释更多:),我仍然觉得很奇怪不直接在 event.getAction 上返回动作:/.. 还是我在这里遗漏了什么?

标签: java android multi-touch masking


【解决方案1】:

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 位,这样1 0000 0000(为演示而添加的空格)变为@987654337 @。 (这个运算符,右移,在 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 变量。

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 2020-04-04
    • 2017-03-28
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多