2011-12-20 23 views
20

Tengo varias vistas de una actividad que un usuario desea tocar rápidamente en sucesión y capturo estos toques con un TouchListener y manejo MotionEvent.ACTION_DOWN. Sin embargo, si el usuario está usando las dos manos, es muy probable que la próxima Vista sea "Tocada" antes de que el usuario levante el dedo anterior. En este escenario, se dispara un MotionEvent.ACTION_MOVE para la primera vista en lugar del MotionEvent.ACTION_DOWN deseado para la segunda vista.Deshabilitar o evitar multitouch en la actividad

¿Hay alguna manera de evitar este comportamiento o evitarlo? Intenté enviar un nuevo evento con MotionEvent.ACTION_UP y también quité el detector de eventos pero ninguno parece funcionar.

+0

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

Respuesta

4

La mejor manera de solucionar este El escenario es usar un ViewGroup e implementar el método onInterceptTouchEvent para enrutar manualmente los eventos táctiles como mejor le parezca.

Este fue originalmente contestadas aquí: Android multitouch! hack anyone?

Código implementación de esta solución (que se encuentra en la sección de comentarios de la respuesta a la pregunta anterior) se encuentra aquí: http://pastebin.com/hiE1aTCw

2

He resuelto este usando un método personalizado - que yo no quiero hacer Si alguien encuentra una mejor manera que me gustaría oír al respecto Gracias:

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

lo hice así:

@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); 
} 

Creo que puede anular onTouchEvent para cualquier vista.

56

La manera más fácil que he encontrado para forzar un solo toque a través de toda una aplicación es para configurarlo 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> 

Manifiesto:

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

Solo para obtener información, "android: splitMotionEvents" requiere API nivel 11 y superior – gjman2

+0

Esto no funciona en android 5.0 y superior – ThanosFisherman

+3

Working para mí en Android 5.0.1. –

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

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

       horizentalLinearGridItem.setMotionEventSplittingEnabled(false); 

      } 

Aquí horizentalLinearGridItem es vista parentLayout donde insertamos vistas de niños. En mi código es LinearLayout. En este LinearLayout, agregué vistas secundarias. Pero cuando hice clic en dos vistas secundarias simultáneamente, ambas obtuvieron los eventos. Para bloquear eso, utilicé el código anterior.

8

si alguien sigue buscando la mejor solución, puesto en el xml el siguiente código:

android:splitMotionEvents = false 
+0

La solución de trabajo más fácil –

0

lo tengo que trabajar para mí con sólo añadir algo de código en OnTouchEvent método,

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

Anular despachoToqueEvent e interceptar todos los toques allí, para todos los toques múltiples, el número de cuenta es más de uno.

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

Esto cancela los toques y se borra el estado presionado de los botones sin tomar ninguna otra medida.

Cuestiones relacionadas