多点触控游戏控制Android

时间:2011-07-09 14:23:52

标签: android multi-touch

这不是具体的游戏编程内容,这就是我在这里问的原因。基本上,我有这个代码:

for (int i = 0; i < event.getPointerCount(); i++) {
                switch (event.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_POINTER_DOWN:
                    if(event.getPointerId(i) == 0)
                    {
                        Log.d("Game", "Primary Down");
                    }
                    else if(event.getPointerId(i) == 1)
                    {
                        Log.d("Game", "Secondary Down");
                    }
                    break;

                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_POINTER_UP:
                    if(event.getPointerId(i) == 0)
                    {
                        Log.d("Game", "Primary Up");
                    }
                    else if(event.getPointerId(i) == 1)
                    {
                        Log.d("Game", "Secondary Up");
                    }                      
                    break;  
                }
            }

其他人给我说它会解决我的原始问题,即如果我放下主指针它会没问题,对于辅助指针也一样,但无论释放的第一个手指被认为是辅助指针,但它带来了另一个问题,我似乎无法弄清楚出于某种原因。它早在这里,所以有贡献,但仍然。

我遇到这个代码的问题是,如果主指针和辅助指针都已关闭,并且其中任何一个都被释放,它会激活这两种情况,因此输出“Primary Up”和“Secondary Up”,第二个被释放将识别它是哪一个,如果在我到达那里之前两个案件都没有,那么那个时候就没关系了。知道如何解决这样的问题吗?或者为游戏进行多点触控的另一种方式,或者其他任何事情。谢谢!

WWaldo

1 个答案:

答案 0 :(得分:1)

据我所知,对于每个指针,ACTION_UP和ACTION_POINTER_UP(以及XX_DOWN相同......)只被调用一次。所以你不需要做那种特殊的处理,只需使用event.getX()和event.getY()。要获得相应的pointerId,您应该使用

int index = event.getActionIndex();
int pointerId = event.getPointerId(index);

我使用for循环的唯一时间是ACTION_MOVE事件,该事件的调用与指针移动无关(在这种情况下,你确实需要使用pointerId,getX(i)和getY(i))

edit:getActionIndex仅在API 8中添加,因此您可能希望使用

event.getAction() >> MotionEvent.ACTION_POINTER_INDEX_SHIFT

获取动作索引。