2012-11-19 97 views
0

我刚制作了一个快速系统,有两个游戏杆(一个用于移动,一个用于拍摄),他们使用多点触控。但是,当你同时使用它们时,它们会相互干扰(你放慢速度,变得很奇怪等),并且想知道这是我的手机(Nexus One,2.3.6)还是一个问题问题与代码:Android多点触控故障

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是属于每个操纵杆

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

回答

0

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

使用过event.getPointerCount循环()(如果是> 1)作为指标来获取ID的每一个接触点,然后你就可以用它来追踪触摸并得到触摸的X/Y /其他信息。

现在要认识到的一点是,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中的一些代码。只有两个接触点,三元运算符是你的朋友:

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

+0

我不知道你是否意识到,但每个需要多点触摸的项目都是一个类,所以每个游戏杆都会调用“ACTION_MOVE”,并且只会在具有正确值的那个上运行指针ID。我已经在我的新手机和平板电脑上运行这个(可能稍微调整了..)代码,并且它工作正常;即:我的Nexus One上的多点触控至少部分出现故障。 – javanut13