Para crear una vista de superposición, al configurar LayoutParams
, debe establecer el tipo a TYPE_SYSTEM_OVERLAY
y usar la marca FLAG_WATCH_OUTSIDE_TOUCH
. Esto presenta un problema debido a que la documentación Android afirma:
no recibirá la posición totalmente abajo/mover/arriba gesto, sólo la ubicación de la primera hacia abajo como un ACTION_OUTSIDE
.
Para recibir toda la gama de eventos de toque que necesita para utilizar el tipo de TYPE_SYSTEM_ALERT
, pero esto hace que la superposición para hacerse cargo de la pantalla y detener la interacción con otros elementos. La solución es usar ambos TYPE_SYSTEM_OVERLAY
y TYPE_SYSTEM_ALERT
y cambiar entre ellos cambiando el tipo de LayoutParams
según sea necesario.
Esto se logra mediante:
- reloj para el evento
ACTION_OUTSIDE
movimiento.
- Cuando ocurre, prueba si ocurrió dentro de la superposición.
- Si lo hiciera, cambiar el tipo de
LayoutParams
a TYPE_SYSTEM_ALERT
- Una vez que la interacción con la superposición es completa, volver a
TYPE_SYSTEM_OVERLAY
- Repita
La única cosa a tener en cuenta es que el ACTION_OUTSIDE
el evento de movimiento siempre se transmite al resto de los elementos en la pantalla. Entonces, 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.
También asegúrese de agregar el permiso SYSTEM_ALERT_WINDOW
al archivo principal.
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 ajuste el tipo de TYPE_SYSTEM_OVERLAY
.
En su lugar, configúrelo en TYPE_PHONE
.
Usar las siguientes banderas:
FLAG_NOT_TOUCH_MODAL
FLAG_WATCH_OUTSIDE_TOUCH
FLAG_NOT_TOUCH_MODAL
< < Me pareció que éste sea bastante importante. Sin ella, se enfoca en la superposición y las prensas de teclas programables (inicio, menú, etc.) no se pasan a la actividad siguiente.
Además, el enlace anterior (arriba) se ha actualizado para reflejar esta actualización.
Gracias por la actualización Jawsware. Pero con tu lógica también, no puedo ver múltiples eventos táctiles en la superposición. Quiero decir, si mantienes el dedo índice en la pantalla y luego el segundo y luego el tercero (sin levantar los anteriores), deberíamos poder recibir eventos táctiles (es decir, se debe llamar a onTouch()). ¿Es posible de todos modos? – Ravs
No recibirá información multitáctil mientras esté en el estado 'TYPE_SYSTEM_OVERLAY'. Una vez que cambie a 'TYPE_SYSTEM_ALERT' (es decir, levante el dedo después de presionar dentro de la superposición), debe recibir eventos multitáctiles. Anexé '\ nPOINTERS:" + event.getPointerCount() 'a cada una de las llamadas' info.setText' en mi muestra y el conteo del puntero aumentaría \ disminuiría a medida que tocara \ levanté los dedos. Después de la primera abajo, solo recibí eventos de movimiento, pero el conteo del puntero aún cambió. – jawsware
Pero lo que quiero en realidad es tener un toque múltiple con TYPE_SYSTEM_OVERLAY. ¿Es eso posible? – Ravs