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.