我一直在从事游戏工作,我试图制造 Controller ,没有什么太复杂的,为此,我需要跟踪2个输入(手指):1个触发按钮和移动键。(上,下,左,对)

这就是问题所在:手指1朝下,手指2朝下,手指1朝上以为是2,然后手指2朝上以为是1。

D/Controlls(18849): Action Down 1
D/Controlls(18849): Coordinates 267.7908 415.24274
D/Controlls(18849): Action Pointer Down 2
D/Controlls(18849): Coordinates 281.11423 417.23993
D/Controlls(18849): Action Pointer UP 1
D/Controlls(18849): Coordinates 272.7869 419.23718
D/Controlls(18849): Action UP 2
D/Controlls(18849): Coordinates 1148.103 439.20947

这是处理2个输入的OnTouchEvent的代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
    int index = event.getActionIndex();
    int pointerId = event.getPointerId(index);
    int action = event.getActionMasked();

    int oldX, oldY;

    switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
        {
            hero.moveControlls((int)event.getX(), (int)event.getY());
            Log.d("Controlls", "Action Down "+ pointerId);
            Log.d("Controlls", "Coordinates "+ event.getX() + " "+ event.getY());
            break;
        }

        case MotionEvent.ACTION_UP:
        {
            hero.setScreenTouching(false);
            Log.d("Controlls", "Action UP "+ pointerId);
            Log.d("Controlls", "Coordinates "+ event.getX() + " "+ event.getY());
            break;
        }

        case MotionEvent.ACTION_POINTER_DOWN:
        {
            Log.d("Controlls", "Action Pointer Down "+ pointerId);
            Log.d("Controlls", "Coordinates "+ event.getX() + " "+ event.getY());
            break;
        }

        case MotionEvent.ACTION_POINTER_UP:
        {
            Log.d("Controlls", "Action Pointer UP "+ pointerId);
            Log.d("Controlls", "Coordinates "+ event.getX() + " "+  event.getY());
            break;
        }
    }
    return true;
}

现在,我查看了示例,但无法理解它们。我在API中查找了MotionEvent,它说要使用$ ACTION_POINTER_INDEX_SHIFT $,但我不知道如何使用它,因为它们没有示例或使它更容易理解的东西。对如何执行此操作有帮助吗?

最佳答案

每当辅助指针下降或上升时,都会激发ACTION_POINTER_DOWN和ACTION_POINTER_UP。如果屏幕上已经有一个指针,而新的指针下降了,您将收到ACTION_POINTER_DOWN而不是ACTION_DOWN。如果指针上升,但仍至少有一个触摸屏,您将收到ACTION_POINTER_UP而不是ACTION_UP。

ACTION_POINTER_DOWN和ACTION_POINTER_UP事件在操作值中编码额外的信息。将其与MotionEvent.ACTION_MASK进行“与”运算,可将 Action 常数与进行“AND”与ACTION_POINTER_INDEX_MASK进行AND运算。

提取离开触摸传感器的指针索引的最佳方法。

整数指标指标=(event.getAction()和MotionEvent.ACTION_POINTER_INDEX_MASK)>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;

我将相应地更改您的代码,如下所示:

case MotionEvent.ACTION_POINTER_UP:
{
    int index = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
    int pointId = event.getPointerId(index);
    Log.d("Controlls", "Action Pointer UP "+ pointerId);
    Log.d("Controlls", "Coordinates "+ event.getX(index) + " "+  event.getY(index));
    break;
}

10-07 19:22
查看更多