你如何使用 MotionEvent.ACTION_POINTER_INDEX_SHIFT? [英] how do you use MotionEvent.ACTION_POINTER_INDEX_SHIFT?

查看:129
本文介绍了你如何使用 MotionEvent.ACTION_POINTER_INDEX_SHIFT?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在玩游戏,我正在尝试制作控制器,不要太复杂,为此我需要跟踪 2 个输入(手指):1 点火按钮和移动键.(向上、向下,左,右)

I've been working in a game and I'm trying to make the controllers, nothing too complicated and to do this I need to track 2 inputs(fingers): 1 the fire button and move keys.(up, down, left, right)

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

This is the problem: finger 1 is down, finger 2 is down, finger 1 goes up thinking it's 2 and then finger 2 goes up thinking it's 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 的代码:

This is the code for the OnTouchEvent which handles the 2 inputs:

@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$ ,我不知道如何使用,因为他们没有示例或其他东西可以使其更容易理解.有关如何执行此操作的任何帮助?

Now, I looked up in the examples, but could not understand them. I looked up MotionEvent in the API and it says to use $ACTION_POINTER_INDEX_SHIFT$ which I have no clue how to use, because they don't have an example or something to make it understood easier. Any help on how to do this?

推荐答案

ACTION_POINTER_DOWN 和 ACTION_POINTER_UP 在二级指针下降或上升时触发.如果屏幕上已经有一个指针并且一个新的指针下降,您将收到 ACTION_POINTER_DOWN 而不是 ACTION_DOWN.如果指针上升但仍有至少一个触摸屏幕,您将收到 ACTION_POINTER_UP 而不是 ACTION_UP.

ACTION_POINTER_DOWN and ACTION_POINTER_UP are fired whenever a secondary pointer goes down or up. If there is already a pointer on the screen and a new one goes down, you will receive ACTION_POINTER_DOWN instead of ACTION_DOWN. If a pointer goes up but there is still at least one touching the screen, you will receive ACTION_POINTER_UP instead of ACTION_UP.

ACTION_POINTER_DOWN 和 ACTION_POINTER_UP 事件在动作值中编码额外信息.与 MotionEvent.ACTION_MASK 进行 AND 运算为我们提供动作常量,而与 ACTION_POINTER_INDEX_MASK 进行 AND 运算为我们提供向上或向下指针的索引

The ACTION_POINTER_DOWN and ACTION_POINTER_UP events encode extra information in the action value. ANDing it with MotionEvent.ACTION_MASK gives us the action constant while ANDing it with ACTION_POINTER_INDEX_MASK gives us the index of the pointer that went up or down

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

The best way to extract the index of the pointer that left the touch sensor.

int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;

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

I would change your code accordingly like below:

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;
}

这篇关于你如何使用 MotionEvent.ACTION_POINTER_INDEX_SHIFT?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆