安卓多点触控事件索引

4
我遇到了一个问题,即多点触控事件在手指仍然按下时导致触摸索引被释放。以下是我的Java包装器代码。该函数将activePointer整数传递给C++函数,后者使用activePointer值作为数组索引,在数组中存储上/下状态。按下事件将数组值设置为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;
}

我已经阅读了这里的文档,但它并不是非常清晰。

我尝试使用event.findPointerIndex函数进行操作,但无法推断出它实际上正在执行的任何模式。

我想象不出这是一个罕见的问题。有经验的人能否提供您的建议?谢谢。

2个回答

0

(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);,然后您就可以了。


0

我在工作中很少涉及多点触控事件,但是在你的switch语句中包含一个默认情况可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接