studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android multi-touch

para - manual de programacion android pdf



Deshabilitar o prevenir multitouch en actividad (8)

La forma más fácil que encontré para forzar un solo toque en una aplicación completa es 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" >

Tengo varias Vistas en una Actividad que un usuario quiere tocar rápidamente en sucesión y TouchListener estos toques usando un TouchListener y manejando 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, un MotionEvent.ACTION_MOVE se MotionEvent.ACTION_MOVE para la primera vista en lugar del MotionEvent.ACTION_DOWN deseado para la segunda vista.

¿Hay alguna forma de evitar o evitar este comportamiento? He intentado enviar un nuevo evento con MotionEvent.ACTION_UP y también eliminar el detector de eventos, pero ninguno parece funcionar.


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

Esto fue respondido originalmente aquí: Android multitáctil! hackear a alguien?

El código que implementa 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


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 puedes anular onTouchEvent para cualquier vista.


Lo hice funcionar para mí simplemente agregando un código en el método OnTouchEvent ,

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...


Reemplace dispatchTouchEvent e intercepte todos los toques allí, para todos los toques múltiples, el puntero del conteo es más de uno.

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

Esto cancela los toques y borra el estado presionado de los botones sin tomar ninguna otra acción.


Resolví esto usando un método personalizado, que no quería hacer. Si alguien encuentra una manera mejor, me gustaría saberlo. 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); }


Si alguien sigue buscando la mejor solución, ingrese en el código XML el siguiente código:

android:splitMotionEvents = false


int currentapiVersion = android.os.Build.VERSION.SDK_INT; if (currentapiVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { horizentalLinearGridItem.setMotionEventSplittingEnabled(false); }

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