Android:event.getActionIndex()与(event.getAction()和MotionEvent.ACTION_POINTER_INDEX_MASK)>> MotionEvent.ACTION_POINTER_INDEX_SHIFT

时间:2018-07-28 06:26:48

标签: android multi-touch

我与MultiTouch战斗了一段时间,终于找到了我的错误并解决了它,但是一路上出现了一个我真的不明白的问题。

背景

我正在使用Beginning Android Games中的Badlogic框架。 BAG框架将MotionEvent转换为ListArray,因此触摸事件(索引,向下,向上,移动,X和Y)在MotionEvent中断之外是持久的,并且可以在游戏代码中进行处理。

MultiTouchHandler将PointerIndex定义为:

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

我最初是这样的:

int pointerIndex = (event.getActionIndex() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;

现在很清楚,被 POINTER_INDEX_MASK屏蔽的 event.getAction()然后以ACTION_POINTER_INDEX_SHIFT(<正确>获得正确的索引)移位了8位,与 event.getActionIndex完全不同。 ()屏蔽并移位(索引始终为0,因为最高有效位全为0。屏蔽0的第二个最低有效字节然后向右移位几乎是没有用的。)

日志是一个救命稻草,可以帮助人们了解Android对MotionEvent的作用:

Log.d(TAG, "Event: " + event);

这是第四根手指向下触摸的输出:

  

事件:MotionEvent {action = ACTION_POINTER_DOWN(3),id [0] = 0,x [0] = 452.3717,y [0] = 1049.1803,toolType [0] = TOOL_TYPE_FINGER,id [1] = 1,x [1] = 447.37866,y [1] = 692.45905,toolType [1] = TOOL_TYPE_FINGER,id [2] = 2,x [2] = 302.57974,y [2] = 417.4775,toolType [2] = TOOL_TYPE_FINGER,id [ 3] = 3,x [3] = 96.86546,y [3] = 331.7408,toolType [3] = TOOL_TYPE_FINGER,buttonState = 0,metaState = 0,标志= 0x0,edgeFlags = 0x0,pointerCount = 4,historySize = 0, eventTime = 15931660,downTime = 15928534,deviceId = 10,source = 0x1002}

我的问题:

您为什么要使用:

  

(event.getAction()和MotionEvent.ACTION_POINTER_INDEX_SHIFT)>> MotionEvent.ACTION_POINTER_INDEX_SHIFT

在以下情况下从getAction()获取指针索引(上述事件为getAction提供了773 ):

  

event.getActionIndex();

为您提供索引(上面的事件为getActionIndex提供3),而无需掩盖和移位位?

getActionIndex自8(引入多点触摸)以来就已经存在于API中?

我了解对getAction进行屏蔽以查找操作

  

event.getAction()和MotionEvent.ACTION_MASK;

给您“ 5”作为上述事件的动作int ),但是获取索引似乎很“忙碌”。我发现的每个示例都使用getAction(已屏蔽和移位)。我担心通过使用getActionIndex而不是getActon(掩盖并转移)的“隐身”错误。

我想念什么?

0 个答案:

没有答案