O melhor lugar para desmistificar isso é o código fonte. Os documentos são lamentavelmente inadequados para explicar isso.
dispatchTouchEvent é realmente definido em Activity, View e ViewGroup. Pense nisso como um controlador que decide como rotear os eventos de toque.
Por exemplo, o caso mais simples é o de View.dispatchTouchEvent, que encaminhará o evento de toque para OnTouchListener.onTouch, se estiver definido, ou para o método de extensão onTouchEvent .
Para ViewGroup.dispatchTouchEvent, as coisas são muito mais complicadas. Ele precisa descobrir qual das visualizações filho deve receber o evento (chamando child.dispatchTouchEvent). Esse é basicamente um algoritmo de teste de acerto, no qual você descobre qual retângulo delimitador da visualização filho contém as coordenadas do ponto de contato.
Mas antes que ele possa despachar o evento para a visão filho apropriada, o pai pode espionar e / ou interceptar o evento todos juntos. É para isso que existe o onInterceptTouchEvent . Portanto, ele chama esse método antes de fazer o teste de ocorrência e, se o evento foi seqüestrado (retornando true de onInterceptTouchEvent), ele envia um ACTION_CANCEL para as visualizações filho, para que possam abandonar o processamento de eventos de toque (de eventos de toque anteriores) e a partir de então todos os eventos de toque no nível pai são despachados para onTouchListener.onTouch (se definido) ou onTouchEvent (). Também nesse caso, onInterceptTouchEvent nunca é chamado novamente.
Você gostaria de substituir [Activity | ViewGroup | View] .dispatchTouchEvent? A menos que você esteja fazendo algum roteamento personalizado, provavelmente não deveria.
Os principais métodos de extensão são ViewGroup.onInterceptTouchEvent se você deseja espionar e / ou interceptar o evento de toque no nível pai e View.onTouchListener / View.onTouchEvent para manipulação de eventos principais.
Em suma, seu design excessivamente complicado, mas as APIs do Android inclinam-se mais para a flexibilidade do que para a simplicidade.