2012-08-28 6 views
18

Traté de entender cómo Android maneja el evento táctil y me confundí un poco. Por lo que entiendo, el evento táctil se envía a la vista raíz y se transfiere a los niños. Tengo un FrameLayout que es un contenedor para Fragment. La primera vista de fragmento es ScrollView, la segunda es algún tipo de Gallery (HorizontalListView) y la última también es FrameLayout. Solo un fragmento en el diseño cada vez. Lo que quiero hacer es identificar los toques del usuario en la pantalla, para el uso de la aplicación. Quiero contar los golpes y hacer algo después de varios golpes.Capturar evento onTouch por padre, manejarlo y pasarlo a los niños

he intentado poner un OnTouchListener en la parte superior FrameLayout pero no se consiga llamar cuando el niño es el ScrollView o la Gallery. Traté de devolver false y también true al final de onTouch, pero obtengo el mismo resultado, nunca se llama.

¿Cómo puedo hacerlo? Solo quiero manejar "transparentemente" los eventos táctiles y pasarlos como si ni siquiera los hubiera tocado.

Respuesta

22

Mi comprensión es que realmente va en la otra dirección. Las vistas Niño obtienen su evento desencadenado primero (más o menos). La vista de raíz obtiene como llamada a dispatchTouchEvent(), que propaga el evento al onTouchEvent() de los hijos y luego, en función de si devuelven verdadero o falso, se llama al padre onTouchEvent().

La solución normal para interceptar cosas como esta es para anular dispatchTouchEvent(MotionEvent ev) en la actividad de un solo modo:

@Override 
public boolean dispatchTouchEvent (MotionEvent ev) { 
    // Do your calcluations 
    return super.dispatchTouchEvent(ev); 
} 

La documentación de éste es here. Tenga en cuenta que también puede anular ese método en cualquier ViewGroup (como FrameLayout, etc.)

+0

¡Funcionó! Extendí 'FrameLayout', anulé el método que has mencionado y envié el' MotionEvent' a 'GestureDetector'. Todo este tema es un poco confuso. ¡Gracias! – Elad92

+0

@ Elad92 como usted mencionó ¿me pueden ayudar a cambiar este 2º código de desplazamiento? https://gist.github.com/LOG-TAG/0505eedccef9e00821da no obtenía cómo enviar el MotionEvent a un GestureDetector_ –

+0

puede alguien ayudar en este http://stackoverflow.com/questions/26354263/catch-ontouch- event-by-custom-2d-scrollview-parent-handle-it-and-pass-to-childr –

Cuestiones relacionadas