android - 你如何使用 MotionEvent.ACTION_POINTER_INDEX_SHIFT?

标签 android multi-touch

我一直在玩游戏,我正在尝试制作 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 进行 AND 运算可以得到 Action 常量,而将它与 ACTION_POINTER_INDEX_MASK 进行 AND 运算可以得到向上或向下指针的索引

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

int pointerIndex = (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;
}

关于android - 你如何使用 MotionEvent.ACTION_POINTER_INDEX_SHIFT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391818/

相关文章:

iphone - 如何确定多点触控场景中最后一次触摸的x&y?

iPhone 多点触控处理

java - 触摸屏时如何保留onTouchEvent?

java - 将相对布局转换为线性布局

android - 在 Android Studio 版本 3.2 和 Gradle 版本 4.6 中启用缩小时,Gradle 构建因 fabric crashlytics 而失败

android - 如何在 Android 的布局 XML 文件中设置 View 的属性?

c# - 大屏多点触控交互应用设计

c# - WPF inkcanvas 多点触控?

android - 更改 EditText 下划线的颜色

android - 如何启用多点触摸拖动事件