Der beste Ort, um dies zu entmystifizieren, ist der Quellcode. Die Dokumente sind absolut unzureichend, um dies zu erklären.
dispatchTouchEvent ist tatsächlich in Activity, View und ViewGroup definiert. Stellen Sie sich das als einen Controller vor, der entscheidet, wie die Berührungsereignisse weitergeleitet werden.
Der einfachste Fall ist beispielsweise der von View.dispatchTouchEvent, bei dem das Berührungsereignis entweder an OnTouchListener.onTouch weitergeleitet wird, sofern es definiert ist, oder an die Erweiterungsmethode onTouchEvent .
Für ViewGroup.dispatchTouchEvent sind die Dinge viel komplizierter. Es muss herausfinden, welche seiner untergeordneten Ansichten das Ereignis erhalten soll (durch Aufrufen von child.dispatchTouchEvent). Dies ist im Grunde ein Treffer-Test-Algorithmus, bei dem Sie herausfinden, welches Begrenzungsrechteck der untergeordneten Ansicht die Berührungspunktkoordinaten enthält.
Bevor das Ereignis jedoch an die entsprechende untergeordnete Ansicht gesendet werden kann, kann der Elternteil das Ereignis ausspionieren und / oder abfangen. Dafür ist onInterceptTouchEvent da. Daher wird diese Methode zuerst aufgerufen, bevor der Treffer-Test durchgeführt wird. Wenn das Ereignis entführt wurde (indem von onInterceptTouchEvent true zurückgegeben wird), wird ACTION_CANCEL an die untergeordneten Ansichten gesendet , damit diese ihre Verarbeitung von Berührungsereignissen (von früheren Berührungsereignissen) abbrechen können Alle Berührungsereignisse auf übergeordneter Ebene werden an onTouchListener.onTouch (falls definiert) oder onTouchEvent () gesendet . Auch in diesem Fall wird onInterceptTouchEvent nie wieder aufgerufen.
Möchten Sie sogar [Activity | ViewGroup | View] .dispatchTouchEvent überschreiben? Wenn Sie kein benutzerdefiniertes Routing durchführen, sollten Sie dies wahrscheinlich nicht tun.
Die Haupterweiterungsmethoden sind ViewGroup.onInterceptTouchEvent, wenn Sie Berührungsereignisse auf übergeordneter Ebene ausspionieren und / oder abfangen möchten, und View.onTouchListener / View.onTouchEvent für die Behandlung von Hauptereignissen.
Alles in allem ist das Design imo zu kompliziert, aber Android Apis tendieren eher zur Flexibilität als zur Einfachheit.