Il posto migliore per demistificare questo è il codice sorgente. I documenti sono dolorosamente inadeguati a spiegarlo.
dispatchTouchEvent è attualmente definito su Activity, View e ViewGroup. Pensalo come un controller che decide come indirizzare gli eventi touch.
Ad esempio, il caso più semplice è quello di View.dispatchTouchEvent che indirizzerà l'evento touch a OnTouchListener.onTouch se è definito o al metodo di estensione onTouchEvent .
Per ViewGroup.dispatchTouchEvent le cose sono molto più complicate. Deve capire quale delle sue viste figlio dovrebbe ottenere l'evento (chiamando child.dispatchTouchEvent). Questo è fondamentalmente un algoritmo di hit testing in cui capisci quale rettangolo di delimitazione della vista figlio contiene le coordinate del punto di contatto.
Ma prima che possa inviare l'evento alla vista figlio appropriata, il genitore può spiare e / o intercettare l'evento tutti insieme. Ecco a cosa serve OnInterceptTouchEvent . Quindi chiama questo metodo prima di eseguire l'hit test e se l'evento è stato dirottato (restituendo true da onInterceptTouchEvent) invia un ACTION_CANCEL alle viste figlio in modo che possano abbandonare l'elaborazione degli eventi di tocco (dai precedenti eventi di tocco) e da allora in poi tutti gli eventi touch a livello padre vengono inviati a onTouchListener.onTouch (se definito) o onTouchEvent (). Anche in quel caso, onInterceptTouchEvent non viene mai più richiamato.
Vorresti addirittura sostituire [Activity | ViewGroup | View] .dispatchTouchEvent? A meno che tu non stia eseguendo un routing personalizzato, probabilmente non dovresti.
I metodi di estensione principali sono ViewGroup.onInterceptTouchEvent se si desidera spiare e / o intercettare l'evento touch a livello padre e View.onTouchListener / View.onTouchEvent per la gestione dell'evento principale.
Tutto sommato, il suo design è troppo complicato, ma le API Android vanno più alla flessibilità che alla semplicità.