【问题标题】:Android multitouch event indexesAndroid 多点触控事件索引
【发布时间】:2013-10-22 20:48:13
【问题描述】:

我遇到了一个问题,多点触控事件导致在手指仍然按下时释放触控索引。

我的 Java 包装器代码粘贴在下面。该函数将 activePointer 整数传递给 C++ 函数,该函数将 up/down 状态存储在数组中,使用 activePointer 值作为数组索引。 Down 事件将数组值设置为 true,up 事件将数组值设置为 false。

行为如下:

  • 如果按下一根手指,则触摸索引 0 为真。
  • 如果两根手指按下触摸索引 0 和 1 都为真。
  • 如果随后移除第二根手指,则触摸索引 0 为真,触摸索引 1 为假(如预期的那样)。
  • 如果取而代之的是第一根手指被移开而第二根手指保持触摸,则触摸索引 0 和 1 都是错误的。我希望触摸索引 0 为假,而触摸索引 1 仍然为真。

这是我的 Java 包装代码:

@Override
public boolean onTouchEvent(MotionEvent event) {
    Integer activePointer = (event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT);
    Float x = event.getX(activePointer);
    Float y = event.getY(activePointer);

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_POINTER_DOWN:
        // Log.i("touchtest", "action_down " + activePointer.toString() +
        // "(" + x + "," + y + ")");
        androidRenderer.touch(x, y, activePointer);
        break;
    case MotionEvent.ACTION_MOVE:
        // Log.i("touchtest", "action_move " + activePointer.toString() +
        // "(" + x + "," + y + ")");
        androidRenderer.move(x, y, activePointer);
        break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP:
        // Log.i("touchtest", "action_up " + activePointer.toString() + "("
        // + x + "," + y + ")");
        androidRenderer.up(x, y, activePointer);
        break;
    }
    return true;
}

我已阅读文档here,但不是很清楚。

我搞砸了 event.findPointerIndex 函数,但无法推断出它实际在做什么的任何模式。

我无法想象这是一个罕见的问题。有这方面经验的人可以提供您的建议吗?谢谢。

【问题讨论】:

    标签: java android c++ android-ndk


    【解决方案1】:

    我不怎么处理多点触控事件,但也许在你的 switch 语句中包含一个默认情况会有所帮助。

    【讨论】:

      【解决方案2】:

      (event.getAction() >> MotionEvent.ACTION_POINTER_ID_SHIFT) 只会给你指针索引。在整个多点触控手势期间,指针索引可能会发生变化。

      您真正需要的是一个指针 ID。 MotionEvent.ACTION_POINTER_ID_SHIFT 名称有点令人困惑,因为它返回指针索引而不是指针 ID,因此自 API 8 以来它已被弃用并重命名为 MotionEvent.ACTION_POINTER_INDEX_SHIFT。指针 ID 唯一标识一个指针。

      要获取指针 ID,请使用 getPointerId(activePointer)。

      将指针 ID 传递给 androidRenderer.xxx(x, y, activePointerId);,你应该没问题。

      【讨论】:

        猜你喜欢
        • 2020-10-20
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多