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?
- Android: ¿cómo puedo verificar, que el dispositivo de apoyo multitouch?
- Soporte multi-touch para Android
- Custom textview con rotar, acercar, alejar y mover en el tacto en android?
- Multitouch para Android y getActionMasked ()
- Obtener MotionEvent.getRawX / getRawY de otros punteros
Cualquier ejemplo o vínculo sería muy útil.
- Pinch zoom in android 2.1
- Interferencia multitáctil para Android
- Detección de pinch en Android
- ¿Cómo habilitar Scale en Android ScrollView de una manera que no impide que se desplace y haga clic en sus elementos secundarios?
- Multitouch para Android
- Deshabilitar o evitar el multitouch en Actividad
- MotionEvent.getPointerCount () siempre es 1
- Manejo multitouch en libgdx
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:
- Observe el evento de movimiento
ACTION_OUTSIDE
. - Cuando ocurre, compruebe si ha ocurrido dentro de la superposición.
- Si lo hizo, cambie el tipo
TYPE_SYSTEM_ALERT
aTYPE_SYSTEM_ALERT
- Una vez completada la interacción con la superposición, vuelva a
TYPE_SYSTEM_OVERLAY
- 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.
- Las imágenes de WebView no se muestran con HTTPS
- Función de Android NDK __android_log_print andLogCat