2012-11-19 100 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