El mejor lugar para desmitificar esto es el código fuente. Los documentos son lamentablemente inadecuados para explicar esto.
dispatchTouchEvent se define realmente en Activity, View y ViewGroup. Piense en ello como un controlador que decide cómo enrutar los eventos táctiles.
Por ejemplo, el caso más simple es el de View.dispatchTouchEvent que enrutará el evento táctil a OnTouchListener.onTouch si está definido o al método de extensión onTouchEvent .
Para ViewGroup.dispatchTouchEvent las cosas son mucho más complicadas. Necesita averiguar cuál de sus vistas secundarias debería recibir el evento (llamando a child.dispatchTouchEvent). Esto es básicamente un algoritmo de prueba de éxito en el que descubres qué rectángulo delimitador de la vista secundaria contiene las coordenadas del punto de contacto.
Pero antes de que pueda enviar el evento a la vista secundaria apropiada, el padre puede espiar y / o interceptar el evento todos juntos. Para eso está onInterceptTouchEvent . Por lo tanto, llama a este método primero antes de hacer la prueba de impacto y si el evento fue secuestrado (devolviendo true desde onInterceptTouchEvent) envía un ACTION_CANCEL a las vistas secundarias para que puedan abandonar su procesamiento de eventos táctiles (de eventos táctiles anteriores) y de ahí en adelante Todos los eventos táctiles en el nivel primario se envían a onTouchListener.onTouch (si está definido) o onTouchEvent (). También en ese caso, onInterceptTouchEvent nunca se llama de nuevo.
¿Desearía incluso anular [Activity | ViewGroup | View] .dispatchTouchEvent? A menos que esté haciendo un enrutamiento personalizado, probablemente no debería hacerlo.
Los principales métodos de extensión son ViewGroup.onInterceptTouchEvent si desea espiar y / o interceptar eventos táctiles en el nivel primario y View.onTouchListener / View.onTouchEvent para el manejo de eventos principales.
En general, su diseño excesivamente complicado, pero las API de Android se inclinan más hacia la flexibilidad que la simplicidad.