2011-05-08 11 views
7

He desarrollado una aplicación de Android que maneja multitouch en una vista. Yo, básicamente, un seguimiento de los varios MotionEvents que pueden ocurrir como ACTION_UP, ACTION_MOVE, ... Mi método onTouch sobrescribe en la clase View se ve así:Android multitouch: ¿ACTION_UP no siempre se llama?

public boolean onTouch(View view, MotionEvent event) 
{ 
    int action = event.getAction() & MotionEvent.ACTION_MASK; 

    if (action == MotionEvent.ACTION_DOWN) { 
     float x = event.getX(); 
     handleTouchStart(view, x); 
    } else if (action == MotionEvent.ACTION_UP) { 
     float x = event.getX(); 
     handleTouchEnded(view, x); 
    } else if (action == MotionEvent.ACTION_POINTER_DOWN) { 
     int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
     float x = event.getX(pointer); 
     handleTouchStart(view, x); 
    } else if (action == MotionEvent.ACTION_POINTER_UP) { 
     int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
     float x = event.getX(pointer); 
     handleTouchEnded(view, x); 
    } else if (action == MotionEvent.ACTION_MOVE) { 
     int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; 
     float x = event.getX(pointer); 
     handleTouchMoved(view, x); 
    } 

    return true; 
} 

En mi teléfono (Samsung Galaxy S), esto funciona sin problemas. Para cada handleTouchStart(), se llama al handleTouchEnded() apropiado. Esto es crucial para mi aplicación. Es un desplazamiento lateral en 2D con un área de dirección en la parte inferior izquierda de la pantalla. Si, por algún motivo, no se llama al método handleTouchEnded() cuando el usuario levanta un dedo de la pantalla táctil, el personaje del jugador continúa ejecutándose.

He recibido informes de jugadores en otros dispositivos (como el HTC Desire) que en raras ocasiones, el personaje realmente continúa corriendo en una dirección incluso si levantan el dedo del área de dirección en la pantalla. Llegué a la conclusión de que esto solo puede suceder si handleTouchEnded() no se llama, lo que a su vez significa que no se genera ningún evento ACTION_UP (o ACTION_POINTER_UP).

¿Existen implementaciones específicas del dispositivo de compatibilidad multitouch? ¿No hay garantía de que para cada ACTION_DOWN (o ACTION_POINTER_DOWN) MotionEvent, se llame a un ACTION_UP (o ACTION_POINTER_UP) MotionEvent apropiado? ¿O me estoy perdiendo algo? ¿Mi implementación onTouch es incluso correcta?

Mi pregunta más amplia sería: ¿hay mejores formas de manejar la entrada con pantalla táctil multitáctil para los "juegos" de acción? Básicamente estoy imitando los controles izquierdo y derecho de la cruz de dirección de un gamepad. Descubrí que los botones de IU de Android no ofrecen la flexibilidad suficiente porque no pueden rastrear los eventos de Presionar y Soltar ... ¿o sí?

+0

¿sabe usted con qué frecuencia esto ocurre por casualidad? –

Respuesta

15

Falta algo. ;) Hay un tipo de acción más que debe manejar: ACTION_CANCEL. ACTION_CANCEL se envía cuando el gesto en progreso se cancela en un nivel superior - algún componente de nivel superior puede haber interceptado el gesto y tomado el control, etc.

+1

¡Muchas gracias! No puedo creer que no lo haya visto yo mismo. Sin embargo, parece extraño que estos gestos funcionen de forma diferente en hardware diferente. –

Cuestiones relacionadas