我以为捏总是会触发MotionEvent.ACTION_POINTER_UP,但是对于至少两个经过测试的平板电脑设备上的应用,这种情况只会发生大约50%的时间(变化很大)。它似乎是随机的。我不知道如何捏合它。

该代码非常简单,因为下面是有关活动的重写方法:

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction())
    {
    ...
    case MotionEvent.ACTION_POINTER_UP:

        Log.d("Debug", "ACTION_POINTER_UP triggered");
    default:
        break;
    }
    ...
}


有人能对此有所启示吗?

最佳答案

您可以将代码更改为使用getActionMasked()

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getActionMasked())
    {
    //...
    case MotionEvent.ACTION_POINTER_UP:

        Log.d("Debug", "ACTION_POINTER_UP triggered");
    default:
        break;
    }
    //...
}




MotionEven getAction()报告一个由ACTION_whatever和
指针索引向左移动ACTION_POINTER_INDEX_SHIFT(8)位。


  返回正在执行的操作的类型。考虑使用getActionMasked()和getActionIndex()来检索单独的掩码操作和指针索引。
  
  退货
  该动作,例如ACTION_DOWN或ACTION_POINTER_DOWN与移位的指针索引的组合。


在多点触控情况下,使用getAction()可能会造成混乱。如果您想获得最可能发生的那种操作(ACTION_DOWN,ACTION_POINTER_DOWN等),则可以使用getActionMasked()代替getAction()


getActionMasked()始终返回ACTION_whatever,而没有指针索引位。
getAction()返回(getActionIndex() << 8 | ACTION_whatever)
(指针索引非常违反直觉,Android尝试重新使用可用的最低索引,如果直接使用它们会产生奇怪的行为,但这是另一个故事,这里最好使用getActionMasked()而不用担心索引)。仅当指针的index = 0时,它在数值上等于getActionMasked(),因此您将看到“随机”行为:当您“自然”完成每个捏时,


有时您可能先释放了指针0,然后释放了指针1,
您将获得2个事件,分别由getAction()返回ACTION_POINTER_UP和后跟1<<8 | ACTION_UP,并在第一个事件上命中case ACTION_POINTER_UP标签。
另外一次您可能先释放了指针1,然后释放了指针0,
您将获得2个事件,其中getAction()返回1<<8 | ACTION_POINTER_UP,后跟ACTION_UP。
没有用于这些的标签,所有内容都归于default

如果使用getActionMasked(),则在两种情况下,都将获得ACTION_POINTER_UP,后跟ACTION_UP。

关于android - 为什么MotionEvent.ACTION_POINTER_UP记录不一致?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24377969/

10-12 00:42