【问题标题】:Why is MotionEvent.ACTION_POINTER_UP not recorded consistently?为什么 MotionEvent.ACTION_POINTER_UP 没有一致地记录?
【发布时间】:2014-06-24 03:41:53
【问题描述】:

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

有人能解释一下吗?

【问题讨论】:

    标签: android multi-touch motionevent


    【解决方案1】:

    您可以更改您的代码以使用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() 报告一个整数,它由 both 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() 而不必担心索引)。这在数字上等于getActionMasked(),仅当指针的 index=0 时,因此您将看到“随机”行为:当您“自然”完成每个捏合时,

      • 有时您可能先释放指针 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。 这些没有case标签,都下到default
    • 如果您使用 getActionMasked(),您会得到 ACTION_POINTER_UP,然后是 ACTION_UP,在这两种情况下都是一致的。

    【讨论】:

    • 非常感谢您的回答和详细说明。采纳您的建议后,该应用会 100% 捕获 ACTION_POINTER_UP。
    • 我之前已经掉入了这个陷阱......方法名称 getAction() 是如此(也许是故意为了保持对非多点触控应用程序的向后“不兼容性”?)误导。跨度>
    • 它确实误导了我。再次感谢。解决了这个问题真是让人松了一口气。
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多