2011-11-10 19 views
9

Estoy tratando de obtener múltiples eventos táctiles en una vista de superposición del sistema, pero solo estoy recibiendo el evento MotionEvent.ACTION_OUTSIDE.Android: toque múltiple y TYPE_SYSTEM_OVERLAY

¿Hay alguna manera posible de obtener múltiples eventos táctiles en una superposición del sistema?

Cualquier ejemplo o enlace sería muy útil.

Respuesta

24

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:

  1. reloj para el evento ACTION_OUTSIDE movimiento.
  2. Cuando ocurre, prueba si ocurrió dentro de la superposición.
  3. Si lo hiciera, cambiar el tipo de LayoutParams a TYPE_SYSTEM_ALERT
  4. Una vez que la interacción con la superposición es completa, volver a TYPE_SYSTEM_OVERLAY
  5. 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.

+1

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

+0

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

+1

Pero lo que quiero en realidad es tener un toque múltiple con TYPE_SYSTEM_OVERLAY. ¿Es eso posible? – Ravs

9

A partir de Android 4.x, equipo de Android equipo de Android fijado un potencial problema de seguridad mediante la adición de un nuevo adjustWindowParamsLw() en la que se sumará FLAG_NOT_FOCUSABLE, FLAG_NOT_TOUCHABLE y quitar banderas FLAG_WATCH_OUTSIDE_TOUCH para la ventana TYPE_SYSTEM_OVERLAY.

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 lo mismo que TYPE_SYSTEM_OVERLAY. En Android 4.4+, TYPE_TOAST se eliminó de la lista de excluidos, por lo que puede usar TYPE_TOAST para recibir eventos táctiles en dispositivos Android 4.4+.

+1

¡Esto es útil! Entonces, ¿qué está sugiriendo que use en lugar de FLAG_WATCH_OUTSIDE_TOUCH para lograr la misma funcionalidad antes de Android 4.0? ¿Hay otra bandera que debería implementarse en su lugar? – Brian

Cuestiones relacionadas