Android: Multi toque y TYPE_SYSTEM_OVERLAY

Estoy tratando de obtener varios eventos táctiles en una vista de superposición del sistema, pero solo recibo el evento MotionEvent.ACTION_OUTSIDE .

¿Hay alguna forma posible de obtener varios eventos de toque en una superposición de sistema?

Cualquier ejemplo o vínculo sería muy útil.

Para crear una vista de superposición, al configurar el LayoutParams debe configurar el tipo TYPE_SYSTEM_OVERLAY y utilizar el indicador FLAG_WATCH_OUTSIDE_TOUCH . Esto presenta un problema porque, como indica la documentación de Android:

No recibirá el gesto completo hacia abajo / hacia arriba / hacia arriba, solo la ubicación del primer abajo como ACTION_OUTSIDE .

Para recibir toda la gama de eventos táctiles es necesario utilizar el tipo TYPE_SYSTEM_ALERT , pero esto hace que la superposición se haga cargo de la pantalla y deje de interactuar con otros elementos. La solución es utilizar TYPE_SYSTEM_OVERLAY y TYPE_SYSTEM_ALERT y cambiar entre ellos cambiando el tipo de LayoutParams según sea necesario.

Esto se logra mediante:

  1. Observe el evento de movimiento ACTION_OUTSIDE .
  2. Cuando ocurre, compruebe si ha ocurrido dentro de la superposición.
  3. Si lo hizo, cambie el tipo TYPE_SYSTEM_ALERT a TYPE_SYSTEM_ALERT
  4. Una vez completada la interacción con la superposición, vuelva a TYPE_SYSTEM_OVERLAY
  5. Repetir

La única cosa a tener en cuenta es que el evento de movimiento ACTION_OUTSIDE siempre se transmite al resto de los elementos en la pantalla. Así, por ejemplo, si la superposición está encima de un botón, ese botón también recibirá el evento de movimiento y no hay manera de detenerlo.

Asegúrese también de agregar el permiso SYSTEM_ALERT_WINDOW al archivo mainifest.

He publicado la solución completa aquí:
http://www.jawsware.mobi/code_OverlayView/ (ACTUALIZADO)

Incluye todo el código fuente y un enlace para descargar todo el proyecto de ejemplo.


Actualización para Android 4.0 – 1/3/2013


Para crear una vista de superposición, al configurar el LayoutParams, NO establezca el tipo TYPE_SYSTEM_OVERLAY .

En su lugar, establezca TYPE_PHONE .

Utilice los siguientes indicadores:

FLAG_NOT_TOUCH_MODAL

FLAG_WATCH_OUTSIDE_TOUCH

FLAG_NOT_TOUCH_MODAL << He encontrado este uno muy importante. Sin ella, el enfoque se da a la superposición y la tecla suave (casa, menú, etc.) las prensas no se pasan a la actividad a continuación.

Además, el vínculo anterior (arriba) se ha actualizado para reflejar esta actualización.

A partir de Android 4.x, el equipo de Android del equipo de Android corrigió un posible problema de seguridad añadiendo una nueva función adjustWindowParamsLw () en la que agregará FLAG_NOT_FOCUSABLE, FLAG_NOT_TOUCHABLE y quitará los indicadores FLAG_WATCH_OUTSIDE_TOUCH para la ventana TYPE_SYSTEM_OVERLAY.

Esa es la ventana TYPE_SYSTEM_OVERLAY no recibirá ningún evento táctil en la plataforma ICS.

Actualizado: 2016/5/4 TYPE_TOAST no puede recibir eventos táctiles en Android 4.0 ~ 4.3. Es igual que TYPE_SYSTEM_OVERLAY. En Android 4.4+, TYPE_TOAST se eliminó de la lista de exclusiones, por lo que puede utilizar TYPE_TOAST para recibir eventos táctiles en dispositivos Android 4.4 o superiores.

  • Android - Cómo manejar el toque de dos dedos
  • Consulta el número exacto de punteros compatibles con multitouch
  • Multitouch para Android obteniendo punteros erróneos y / o valores XY
  • La diferencia de utilizar el método MotionEvent.getAction ()
  • Multitouch de Android! Hackear a alguien
  • Grifos multi-touch de dos dedos
  • multitouch androide, el puntero de acción no funciona correctamente
  • ¿Cómo detectar el toque de dos dedos en Android?
  • Android Libraries para la implementación de Multi Touch fácil que incluye Twist / Rotate etc?
  • Programaticamente, descubre cuántos dedos en el dispositivo multitáctil Android soporta
  • Split Motion Events en android 2.3 y posterior
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.