2011-12-20 1 views
20

Ho diverse visualizzazioni su un'attività che un utente desidera toccare rapidamente in successione e catturo questi tocchi utilizzando un TouchListener e la gestione di MotionEvent.ACTION_DOWN. Tuttavia, se l'utente sta usando due mani, è molto probabile che la prossima vista sia 'Toccata' prima che l'utente tiri il dito precedente verso l'alto. In questo scenario, un MotionEvent.ACTION_MOVE viene generato per la prima vista anziché lo MotionEvent.ACTION_DOWN desiderato per la seconda vista.Disabilita o impedisce il multitouch nell'attività

C'è un modo per aggirare o prevenire questo comportamento? Ho provato a inviare un nuovo evento con MotionEvent.ACTION_UP e anche a rimuovere il listener di eventi, ma nessuno dei due sembra funzionare.

+0

http: // stackoverflow.it/questions/8570982/disable-or-prevent-multitouch-in-activity/36281321 # 36281321 –

risposta

4

Il modo migliore per ovviare a questo Lo scenario prevede l'utilizzo di un ViewGroup e l'implementazione del metodo onInterceptTouchEvent per il routing manuale degli eventi tattili come meglio credi.

Questo è stato originariamente risposta qui: Android multitouch! hack anyone?

codice che implementa questa soluzione (che si trova nella sezione commenti della risposta alla domanda di cui sopra) si trova qui: http://pastebin.com/hiE1aTCw

2

ho risolto questo utilizzando un metodo personalizzato - che non ho voglia di fare se qualcuno trova un modo migliore mi piacerebbe sentir parlare! Grazie:

public static void setViewGroupEnebled(ViewGroup view, boolean enabled) 
{ 
    int childern = view.getChildCount(); 

    for (int i = 0; i< childern ; i++) 
    { 
     View child = view.getChildAt(i); 
     if (child instanceof ViewGroup) 
     { 
      setViewGroupEnebled((ViewGroup) child,enabled); 
     } 
     child.setEnabled(enabled); 
    } 
    view.setEnabled(enabled); 
} 
7

ho fatto in questo modo:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 

    if(event.getPointerCount() > 1) { 
     System.out.println("Multitouch detected!"); 
     return true; 
    } 
    else 
     return super.onTouchEvent(event); 
} 

Penso che sia possibile ignorare onTouchEvent per qualsiasi vista.

56

Il modo più semplice che ho trovato per forza solo tocco su un'intera applicazione è quello di impostarlo usando un tema:

<style name="MyTheme" parent="@android:style/Theme.Holo.Light"> 
    <item name="android:windowEnableSplitTouch">false</item> 
    <item name="android:splitMotionEvents">false</item> 
</style> 

manifesto:

<application 
     android:label="@string/app_name" 
     android:theme="@style/MyTheme" > 
+0

Solo per informazioni, "android: splitMotionEvents" richiede livello API 11 e superiore a – gjman2

+0

Questo non funziona su Android 5.0 e versioni successive – ThanosFisherman

+3

Lavoro per me in Android 5.0.1. –

0
int currentapiVersion = android.os.Build.VERSION.SDK_INT; 

      if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { 

       horizentalLinearGridItem.setMotionEventSplittingEnabled(false); 

      } 

Qui horizentalLinearGridItem è vista parentLayout dove inseriamo viste secondarie. Nel mio codice LinearLayout. In questo LinearLayout ho aggiunto viste secondarie. Ma quando ho fatto clic su due viste figlio contemporaneamente, entrambi stavano ottenendo gli eventi. Per bloccare che ho usato il codice sopra.

8

se qualcuno ancora alla ricerca di migliore soluzione, mettere in xml il seguente codice:

android:splitMotionEvents = false 
+0

La soluzione di lavoro più semplice –

0

ho preso a lavorare per me semplicemente aggiungendo un po 'di codice nel OnTouchEvent metodo,

boolean action_down_required = false; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    int action = event.getAction(); 

    if(event.getPointerCount() > 1){ 
     action_down_required = true; 
     return true; 
    } 

    if(action_down_required){ 
     action = MotionEvent.ACTION_DOWN; 
    } 

    switch (action) { 
     case MotionEvent.ACTION_DOWN: 

      // your code goes here... 

      action_down_required = false; 
      break; 

     // Other events... 
1

Ignora dispatchTouchEvent e intercetta tutti i tocchi lì, per tutti i multi-touch il puntatore è più di uno.

if(ev.getPointerCount() > 1) 
    { 
    Log.d("Multitouch detected!"); 
    ev.setAction(MotionEvent.ACTION_CANCEL); 
    } 

Questo annulla il tocco e cancella lo stato premuto dei pulsanti senza eseguire ulteriori azioni.