Android多点触控事件索引

时间:2013-10-22 20:48:13

标签: java android c++ android-ndk

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

我的Java包装器代码粘贴在下面。该函数将activePointer整数传递给C ++函数,该函数使用activePointer值作为数组索引,将up / down状态存储在数组中。向下事件将数组值设置为true,向上事件将数组值设置为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函数,但无法推断出它实际上在做什么模式。

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

2 个答案:

答案 0 :(得分:0)

我对多点触控事件不起作用,但在switch语句中包含默认情况可能有所帮助。

答案 1 :(得分:0)

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

您实际需要的是指针ID。 MotionEvent.ACTION_POINTER_ID_SHIFT名称有点令人困惑,因为它返回指针索引而不是指针ID,因此不推荐使用它,并从API 8重命名为MotionEvent.ACTION_POINTER_INDEX_SHIFT。指针ID唯一标识指针。

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

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