2015-05-18 24 views
8

Rozwijam grę i muszę być w stanie wykryć, że jeden palec wykonuje ruch, podczas gdy inny palec może z łatwością DOTYKAĆ kolejnej części ekranu.Jak wykrywać zdarzenie TOUCH innym palcem podczas działania ACTION_MOVE

z następującego kodu jestem w stanie wykryć zarówno ACTION_MOVE (na określonym obszarze ekranu) i ACTION_DOWN

public boolean onTouch(View v, MotionEvent event) { 
    final int dest_x = (int) event.getX(); 
    final int dest_y = (int) event.getY(); 

    onTrackPad = dbSettings.TRACK_PAD.contains(dest_x, dest_y); 

    switch (event.getAction()) { 
     case MotionEvent.ACTION_MOVE: 
      if (onTrackPad) 
      { 
       //move character 
      }   
      break; 
     case MotionEvent.ACTION_DOWN: 
      // Fire bullets 
      break; 
    } 
    //The event was consumed 
    return true; 
} 

Problem polega na tym, że nie jestem w stanie poruszać i pożar w tym samym czasie (Muszę przestać działać, aby strzelać i odwrotnie)

Mam świadomość, że Android can handle multi-touch events, ale nie rozumiem, jak tego użyć, aby móc przetwarzać te zdarzenia w tym samym czasie, aby gracz mógł się ruszać i strzelać w tym samym czasie

Próbuję też bez żadnego powodzenia używać

+0

czy twój MotionEvent nie przechowuje wszystkich informacji o multytouch? https://developer.android.com/training/gestures/multi.html – eduyayo

+0

@eduayo właśnie zawierałeś ten sam link, co podany przeze mnie, czy mógłbyś podać mi bardziej szczegółową odpowiedź (a nie komentarz). Dziękujemy –

+0

Musisz Wykonaj przesuwanie i uruchamianie w osobnym wątku lub przerwie wątek UI (jeśli nie zrobisz tego już). – Manu

Odpowiedz

2

Po przeczytaniu tego pytanie Android MotionEvent.getActionIndex() and MultiTouch

To jest jak I rozwiązać problem

public boolean onTouch(View v, MotionEvent event) { 
    int dest_x ; 
    int dest_y ; 

    p = event.getActionIndex() ; 

    dest_x = (int) event.getX(p); 
    dest_y = (int) event.getY(p); 

    onTrackPad = dbSettings.TRACK_PAD.contains(dest_x, dest_y); 

    action = event.getActionMasked() ; 

    switch (action) { 
     case MotionEvent.ACTION_MOVE: 
      if (onTrackPad) 
      { 
       //move character 
      }   
      break; 
     case MotionEvent.ACTION_DOWN: 
      // Fire bullets 
      break; 
    } 
    //The event was consumed 
    return true; 
} 
0

MotionEvent ma wszystkie informacje o akcentach, których potrzebujesz. Możesz uzyskać liczbę dotknięć wykonując event.getPointersCount() i spróbuj sprawdzić MotionEvent.ACTION_POINTER_2_DOWN zamiast MotionEvent.ACTION_DOWN. Aby uzyskać współrzędne każdego dotyku, można użyć event.getX(0) i event.getX(1), to samo dotyczy y. Jeśli masz przypadek MotionEvent.ACTION_MOVE z 2 dotknięciami, otrzymasz wszystkie te informacje w swoim zdarzeniu w ruchu.

+0

ACTION_POINTER_2_DOWN został wycofany na poziomie interfejsu API 8. Użyj ACTION_POINTER_INDEX_MASK, aby pobrać indeks danych powiązany z ACTION_POINTER_DOWN. Próbowałem tego podejścia, ale nie działa –

0

Spróbuj poniżej kodu. , gdy na ekranie pojawi się wiele wskaźników, system generuje zdarzenia akcji. Możemy śledzić pojedyncze wskaźniki za pomocą zdarzenia ruchu za pomocą identyfikatora wskaźnika. Identyfikator wskaźnika utrzymuje się w przypadku zdarzeń dotyku, a także umożliwia śledzenie pojedynczego wskaźnika przez cały gest.

 @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      int index = event.getActionIndex(); 

      int pointerID = event.getPointerId(index); 

      int action = event.getActionMasked(); 

      if(event.getPointerCount() > 1) 
      { 
       Log.i("TouchType ", "Multi Touch"); 
       for(int i = 0; i < event.getPointerCount(); i++) 
       { 
        performAction(action); 
       } 
      }else 
      { 
       Log.i("TouchType ", "Single Touch"); 
       performAction(action); 
      } 

     return true; 
     } 


    public void performAction(int action){ 
    switch(action) 
    { 
    case MotionEvent.ACTION_DOWN : 
     Log.i("OnTouch ", "Pressed"); 

     // Fire bullets 
    break; 
    case MotionEvent.ACTION_MOVE : 
     Log.i("OnTiouch", "move"); 
     //move character 
     break; 
    case MotionEvent.ACTION_UP : 
     Log.i("OnTiouch", "Up"); 
    break; 
    default: 
     Log.i("OnTiouch", "None"); 
    } 
} 
+0

Dziękuję za odpowiedź, ale już rozwiązałem ten problem za pomocą kodu podanego w mojej własnej odpowiedzi –

Powiązane problemy