如何在API级别3上过滤MotionEvent.getAction()(没有ACTION_MASK存在)

5

我正在编写一个 OnTouchListener。我发现可以使用位运算来检查 ActionType,例如:

if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE)

然而在Android 1.5(API级别3)中没有 MotionEvent.ACTION_MASK ,那么它是如何实现的呢?

1个回答

4
ACTION_MASK 用于分离实际的操作和指针标识符(例如,第一只手指触摸,第二只手指触摸等)。在 getAction() 返回的值中,前 8 位是实际操作部分。因此,当您对其进行按位与操作并使用 操作掩码 (= 11111111 = 255 = 0xff)进行运算时,您只剩下操作而没有指针信息。
在 Android 1.5 / API 级别 3 中,MotionEvent 类不支持多个指针(即多点触控)。对于单指事件,指针位未设置。因此,您可以将事件与所需的操作常量进行比较,以检查特定操作。
if ((event.getAction() == MotionEvent.ACTION_MOVE) {...}

在极少数情况下,如果此方法无效,您可以尝试定义自己的操作掩码常量为255,并像以后的API版本中一样按位与该操作。
文档中查看MotionEvent(或任何Android参考页面),都有一个复选框可按API级别进行过滤。如果选择API级别3,则可以查看该类的状态。所有与不同指针相关的方法和常量均已灰显。

非常感谢您的时间和回答。尽管如此,我仍然想知道,因为这个表达式在较新的Android版本上会解析为false。这是否可以在从3到现在的任何设备/级别上“正常工作”?如果是,这是因为我在项目创建时输入的目标/ min_sdk信息吗? - unR
1
该表达式始终适用于单指触摸事件,即使在较高的API级别中也是如此。对于单指,其他(指针)位未设置,因此无需使用掩码。 - antonyt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接