Android多点触控故障

时间:2012-11-19 06:39:25

标签: android multi-touch

我刚制作了一个快速系统,有两个操纵杆(一个用于移动,一个用于拍摄),它们可以使用多点触控。

然而,当你同时使用它们时它们互相干扰(你慢下来,变得奇怪等等)并且想知道这是否是我手机的问题(Nexus One,2.3.6)或问题代码:

public void handleEvent(MotionEvent event) {
    final int action = event.getAction();
    switch(action & MotionEvent.ACTION_MASK){
        case MotionEvent.ACTION_DOWN: {
            pointerID = event.getPointerId(0);
            int tx = (int) event.getX(event.findPointerIndex(pointerID));
            int ty = (int) event.getY(event.findPointerIndex(pointerID));
            boolean reset = true;
            if(tx >= (x - radius * 2) && (tx <= (x + radius * 2))) {
                if(ty >= (y - radius * 2) && (ty <= (y + radius * 2))) {
                    dx = (tx - x);
                    dy = (ty - y);
                    reset = false;
                }
            }
            if(reset) pointerID = -1;
            break;
        }
        case MotionEvent.ACTION_POINTER_DOWN: {
            if(pointerID == -1) {
                final int pointerIndex = event.getActionIndex();
                pointerID = event.getPointerId(pointerIndex);
                int tx = (int) event.getX(pointerIndex);
                int ty = (int) event.getY(pointerIndex);
                if(tx >= (x - radius * 2) && (tx <= (x + radius * 2))) {
                    if(ty >= (y - radius * 2) && (ty <= (y + radius * 2))) {
                        dx = (tx - x);
                        dy = (ty - y);
                    }
                }
            }
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            if(pointerID != -1) {
                final int pointerIndex = event.findPointerIndex(pointerID);
                int tx = (int) event.getX(pointerIndex);
                int ty = (int) event.getY(pointerIndex);
                if(tx >= (x - radius * 2) && (tx <= (x + radius * 2))) {
                    if(ty >= (y - radius * 2) && (ty <= (y + radius * 2))) {
                        dx = (tx - x);
                        dy = (ty - y);
                    }
                }
            }
            break;
        }
        case MotionEvent.ACTION_POINTER_UP: {
            final int pointerIndex = event.getActionIndex();
            final int id = event.getPointerId(pointerIndex);
            if(id == pointerID) {
                dy = 0;
                dx = 0;
                pointerID = -1;
            }
            break;
        }
        case MotionEvent.ACTION_UP: {
            if(-1 != pointerID) {
                dy = 0;
                dx = 0;
                pointerID = -1;
            }
            break;
        }

    }
}

重要说明:

每个操纵杆都是一个类,并为每个操纵杆调用handleEvent方法。

pointerID是属于每个操纵杆的int

dydx只是距操纵杆中心的距离。

1 个答案:

答案 0 :(得分:0)

你缺少的是,如果同时发生多次触摸,那么一个MotionEvent全部包含它们(如果其中一个触摸属于ACTION_MOVE类型,它还包含该运动的历史记录)。 / p>

使用循环event.getPointerCount()(如果它是> 1)作为索引来获取每个接触点的ID,然后您可以使用它来跟踪触摸并获取触摸的x / y /其他信息。 / p>

现在要意识到的是,pointerID不仅跟踪触摸......但是如果触摸点消失,它也可以改变(以ACTION_UP事件结束); POINTER_DOWN事件总是会在最后添加带有ID的触摸(因此,如果你有两次触摸它将获得ID 2),但是在POINTER_UP(或POINTER_2_UP,如果它是第二个触摸点)上,向下移动可获得更高的ID更改ID。

因此,如果你有ID 0,1和2的触摸,第二次触摸(ID 1)进入POINTER_UP,你必须意识到指针ID 2将变为ID 1.如果你有两个触摸(0和1) ),如果ID 0上升,所有突然的ID 1都变为ID 0!

诀窍是通过一些全局变量(leftJoyStickID和rightJoyStickID)以及action_down和action_up中的一些代码来跟踪这一点。只需两个接触点,三元运算符就是您的朋友:

if(IDofActionUpEvent == leftJoyStickID) { rightJoyStickID = IDofActionUpEvent == 0? 1:0; }