2015-05-18 9 views
8

Sto sviluppando un gioco e ho bisogno di essere in grado di rilevare che un dito sta eseguendo una SPOSTA mentre posibly altro dito può toccare un'altra parte dello schermo.Come per rilevare un evento di tocco con un altro dito mentre un ACTION_MOVE è in corso

Con questo codice sono in grado di rilevare sia l'ACTION_MOVE (su certa regione dello schermo) e l'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; 
} 

Il problema è che io non sono in grado di muoversi e sparare allo stesso tempo (Devo smettere di muoverti per sparare e viceversa)

Sono consapevole del fatto che Android can handle multi-touch events ma non ho idea di come usarlo per essere in grado di elaborare questi eventi e allo stesso tempo in modo che il giocatore possa muoversi e sparare allo stesso tempo

Ho anche provato a usare lo getActionMasked senza fortuna

+0

non è il tuo MotionEvent che memorizza tutte le informazioni multytouch ?? https://developer.android.com/training/gestures/multi.html – eduyayo

+0

@eduyayo hai appena incluso lo stesso link di quello che ho fornito potresti fornirmi una risposta più dettagliata (non un commento) Grazie –

+0

Hai bisogno di esegui lo spostamento e lo sparo in un thread separato o interromperà il thread dell'interfaccia utente (se non lo fai già). – Manu

risposta

2

Dopo aver letto questa domanda Android MotionEvent.getActionIndex() and MultiTouch

Ecco come ho risolto il problema

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 ha tutte le informazioni sui tocchi di cui hai bisogno. È possibile ottenere il numero di tocchi eseguendo event.getPointersCount() e provare a verificare MotionEvent.ACTION_POINTER_2_DOWN anziché MotionEvent.ACTION_DOWN. Per ottenere le coordinate di ogni tocco è possibile utilizzare event.getX(0) e event.getX(1), lo stesso è per . Se hai un caso di MotionEvent.ACTION_MOVE con 2 tocchi, riceverai tutte queste informazioni nel tuo evento di movimento.

+0

ACTION_POINTER_2_DOWN è stato ritirato al livello API 8. Utilizzare ACTION_POINTER_INDEX_MASK per recuperare l'indice dei dati associato a ACTION_POINTER_DOWN. Ho provato questo approccio ma non funziona –

0

Prova sotto il codice. quando più puntatori tocca lo schermo, il sistema genera gli eventi di azione. Possiamo tenere traccia dei singoli puntatori con l'evento in movimento usando l'id del puntatore. L'identificazione del puntatore persiste attraverso gli eventi di tocco e consente inoltre di tracciare il puntatore individuale attraverso l'intero gesto.

 @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

Grazie per la risposta, ma ho già risolto questo problema con il codice fornito nella mia risposta –

Problemi correlati