¿Cómo capturar eventos onTouch en dos vistas superpuestas?
Diseño
! * Container es un diseño relativo que contiene dos vistas personalizadas: OuterView1 e InnerView2 * Outer View1 es una vista personalizada, que coincide con el tamaño del padre (pantalla completa) * Inner View2 también es una vista personalizada, colocada encima de OuterView1 que se superpone.
- Dibujar texto en la parte superior de mapa de bits no
- El desplazamiento y el zoom de MapView es lento después de agregar muchas superposiciones
- Diferentes marcadores con nombre en Google Android Map
- SetFocus (overlayItem) de ItemizedOverlay no funciona
- FragmentTransaction.remove no tiene efecto
- El contenedor es un diseño relativo que contiene dos vistas personalizadas: OuterView1 e InnerView2
- Vista exterior1 es una vista personalizada, que coincide con el tamaño del padre (pantalla completa)
- Inner View2 es también una vista personalizada, situada encima de OuterView1 que se superpone.
Tanto en OuterView1 como en InnerView2, quiero capturar estos eventos táctiles onSingleTapConfirmed () y onFling (). El área donde tanto OuterView1 como InnerView2 se solapan, quiero que el control se pase a los métodos de evento táctil de ambas vistas.
He intentado esto:
Clase contenedor
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { outerView1.onTouchEvent(ev); innerView2.onTouchEvent(ev); return false; }
Clase OuterView1
@Override public boolean onTouchEvent(MotionEvent event) { gesture.onTouchEvent(event); return true; }
Gesture es una instancia de GestureDetector.SimpleOnGestureListener con sentencias de registro para los métodos onDown (), onFling () y onSingleTapConfirmed ()
Clase InnerView2
@Override public boolean onTouchEvent(MotionEvent event) { gesture.onTouchEvent(event); return true; }
Gesture es una instancia de GestureDetector.SimpleOnGestureListener con sentencias de registro para los métodos onDown (), onFling () y onSingleTapConfirmed ()
Con este enfoque, siempre obtener devolución de llamada en métodos onDown () de ambas vistas. Pero no veo un comportamiento consistente en los métodos onSingleTapConfirmed () y onFling ()
Cuando hice tapping en el círculo rojo (en la captura de pantalla) tres veces y tuve tres comportamientos diferentes
-
Primer intento (comportamiento deseado)
10-14 09:03:14.155: I/OuterView1(27776): OuterView1.onDown() 10-14 09:03:14.155: I/InnerView2(27776): InnerView2.onDown() 10-14 09:03:14.155: W/GestureDetector(27776): [pen gesture] isConsideredDoubleTap - timeout 10-14 09:03:14.155: I/InnerView2(27776): InnerView2.onDown() 10-14 09:03:14.460: I/OuterView1(27776): OuterView1.onSingleTapConfirmed() 10-14 09:03:14.460: I/InnerView2(27776): InnerView2.onSingleTapConfirmed()
-
Segundo intento (Sólo una vista obtiene onSingleTapConfirmed ())
10-14 09:04:11.615: I/OuterView1(27776): OuterView1.onDown() 10-14 09:04:11.615: I/InnerView2(27776): InnerView2.onDown() 10-14 09:04:11.615: W/GestureDetector(27776): [pen gesture] isConsideredDoubleTap - timeout 10-14 09:04:11.615: I/InnerView2(27776): InnerView2.onDown() 10-14 09:04:11.915: I/OuterView1(27776): OuterView1.onSingleTapConfirmed()
-
Tercer intento (Una vista obtiene onFling () y otra obtiene onSingleTapConfirmed ())
10-14 09:04:04.180: I/OuterView1(27776): OuterView1.onDown() 10-14 09:04:04.180: I/InnerView2(27776): InnerView2.onDown() 10-14 09:04:04.180: W/GestureDetector(27776): [pen gesture] isConsideredDoubleTap - timeout 10-14 09:04:04.180: I/InnerView2(27776): InnerView2.onDown() 10-14 09:04:04.255: I/InnerView2(27776): InnerView2.onFling() 10-14 09:04:04.480: I/OuterView1(27776): OuterView1.onSingleTapConfirmed()
¿Podría ayudarme a capturar eventos táctiles tanto en OuterView1 como en InnerView2?
- Android: superposición en la ventana sobre las actividades de una tarea
- Superposición transparente GLSurfaceview en la vista existente en android?
- Animación de superposición de Facebook
- Cómo crear un diseño de superposición en una vista de lista
- Detección de la superposición de pantalla: cómo manejar esto en una aplicación de superposición de pantalla
- Superposición de imagen en dos filas en una vista de lista
- Mi mapa no muestra el mapa sólo muestra los elementos de superposición
- Google Maps Android API v2 Superposición de rutas
Por lo tanto, en el caso de las vistas superpuestas – los eventos de toque se envían desde el niño más alto al que está detrás, luego otro detrás del segundo niño y así sucesivamente. Sin embargo, si el niño más alto consumía el evento táctil (es decir, manejarlo al recibirlo), las vistas debajo de esa vista no recibirían los eventos táctiles.
Si el onTouchEvent devuelve 'true', entonces le está diciendo al gestor de vistas que ha manejado el tacto y no quiere que el evento se envíe a otras vistas. Si desea que la vista debajo de esa vista reciba el toque también, entonces desea devolver 'false' desde el onTouchEvent para la primera vista, en su caso el Innerview.
Además, en su código me di cuenta de que está programando el envío de eventos táctiles a las 2 vistas de la clase contenedor. Esto hace que el InnerView reciba el tacto incluso cuando solo se hace clic en el OuterView. Si desea que la funcionalidad, entonces está bien. Si desea InnerView para obtener los eventos sólo cuando se toca, entonces usted no quiere que la clase de contenedores para llamar a onTouchEvent explícitamente en esas 2 vistas. La jerarquía de la vista lo hará por usted.
Acerca de recibir onFling o onSingleTapConfirmado en AMBOS puntos de vista (suponiendo que desea que los eventos táctiles pasen a las vistas de atrás también, devuelve 'false' desde el onTouchEvent para InnerView) el InnerView ya ha pasado el evento a la vista detrás Lo, por lo que no consigue el final del gesto para darse cuenta de que un fling acaba de ocurrir y de forma similar para onSingleTapConfirmed. Si desea obtener todavía esos, puede que tenga que enviar eventos de toque de forma programática al final del gesto como detectado por el OuterView. Lo que significa que si OuterView recibió un gesto de fling, también fue una aventura para el InnerView y, por lo tanto, programáticamente que ese gesto suceda para el InnerView también. Esto es bastante complicado y los toques de despacho hacia atrás en la jerarquía no son algo habitual.
Ojalá no te haya confundido en esto. Siéntase libre de preguntar si no he sido claro y lo intentaré de nuevo.
Esto será útil: Manejo de TouchEvents en un ViewGroup
- Android: concatenar dos videos
- El archivo del manifiesto de error de manifiesto de Android no termina con una nueva línea final