为什么MotionEvent.ACTION_POINTER_UP没有记录一致?

时间:2014-06-24 03:41:53

标签: android multi-touch motionevent

我认为pinch总会触发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;
    }
    ...
}

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:3)

您可以将代码更改为使用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_ 和 指针索引由ACTION_POINTER_INDEX_SHIFT(8)位左移。

  

返回正在执行的操作类型。考虑使用getActionMasked()和getActionIndex()来检索单独的掩码操作和指针索引。

     

返回   操作,例如ACTION_DOWN或ACTION_POINTER_DOWN与移位指针索引的组合。

getAction()在多点触控情况下使用起来非常困惑。如果您想要获得您最有可能采取的行动(ACTION_DOWN,ACTION_POINTER_DOWN等),则可以使用getActionMasked()代替getAction()

  • getActionMasked()总是返回ACTION_ 无论,没有指针索引位。

  • getAction()返回(getActionIndex() << 8 | ACTION_whatever)(指针索引非常违反直觉,Android试图重新使用可用的最低索引,如果直接使用它们会产生奇怪的行为,但这是另一个故事,这里更好地使用getActionMasked()而不用担心关于指数)。仅当指针具有index = 0时,这在数值上等于getActionMasked(),因此您将看到&#34; random&#34;行为:当你完成每一次捏合时,#34;,

    • 有时您可能先释放指针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。