¿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.

  • 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?

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: Combina dos vistas de imagen superpuestas en un bmp con la posición correcta
  • Superposición de teclas de teclado de Android
  • Cómo actualizar dinámicamente un elemento de superposición específico
  • Cómo guardar la superposición con vista previa de la cámara en android?
  • ¿Cómo almacenar en caché android.graphics.path o Bitmap cuando se usan Overlays?
  • Convertir la ubicación en GeoPoint
  • Implementación de un mapa interior
  • Dibujo sobre otras aplicaciones en Android
  • Android Map Rendimiento pobre debido a muchas superposiciones?
  • ¿Cómo puedo superponer un archivo de audio sobre otro y guardarlo?
  • Imagen sobre otra imagen Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.