Forståelse av dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent i Android
Understanding Dispatchtouchevent
【Wende】 http://blog.csdn.net/guitk/article/details/7057155
onInterceptTouchEvent wird verwendet, um die Richtung zu ändern, in die Ereignisse übergeben werden. Die Entscheidung, die Richtung zu übergeben, ist der Rückgabewert. Wenn die Rückgabe falsch ist, wird das Ereignis an das untergeordnete Steuerelement übergeben. Wenn der Rückgabewert true ist, wird das Ereignis an onTouchEvent () des aktuellen Steuerelements übergeben, das als Intercept bezeichnet wird.
[tisa ps: Der richtige Weg, dies zu verwenden, besteht darin, nur zu bestimmen, ob das Ereignis innerhalb dieser Methode abgefangen werden muss, und dann zurückzukehren. Selbst wenn Sie abfangen müssen, sollten Sie true direkt zurückgeben und dann von der onTouchEvent-Methode verarbeitet werden. ]]
onTouchEvent wird zum Verarbeiten des Ereignisses verwendet, und der Rückgabewert bestimmt, ob das aktuelle Steuerelement dieses Ereignis verwendet. Insbesondere für das ACTION_DOWN-Ereignis bedeutet die Rückgabe von true, dass ich nachfolgende Ereignisse verarbeiten möchte, die false zurückgeben. Dies bedeutet, dass mir dieses Ereignis egal ist und dass es zur Verarbeitung durch die übergeordnete Klasse zurückgegeben wird.
Vielleicht müssen Sie fragen, ob Sie konsumiert und differenziert haben. Wie auch immer, ich habe einen Verarbeitungscode für das Ereignis geschrieben? Die Antwort ist anders! Beispielsweise tritt ACTION_MOVE oder ACTION_UP unter der Voraussetzung auf, dass ACTION_DOWN aufgetreten sein muss. Wenn Sie ACTION_DOWN nicht verwenden, glaubt das System, dass ACTION_DOWN nicht aufgetreten ist, sodass ACTION_MOVE oder ACTION_UP nicht erfasst werden können.
Wenn onInterceptTouchEvent () und onTouchEvent () nicht überschrieben werden (ihre Rückgabewerte sind alle falsch), ist die Reihenfolge der MotionEvent-Ereignisse für das obige Layout wie folgt:
Wenn onInterceptTouchEvent () eines Steuerelements den Wert true zurückgibt, wird abgeschnitten und das Ereignis an onTouchEvent () des aktuellen Steuerelements übergeben. Wenn wir den Wert von onInterceptTouchEvent () von LayoutView2 auf true zurücksetzen, wird der Übermittlungsprozess wie folgt:
Wenn wir onInterceptTouchEvent () und onTouchEvent () von LayoutView2 gleichzeitig auf true setzen, verwendet LayoutView2 das übergebene Ereignis, und nachfolgende Ereignisse (wie ACTION_MOVE oder ACTION_UP, gefolgt von ACTION_DOWN) werden direkt an onTouchEvent () von LayoutView2 übergeben. Geben Sie einer anderen Steuerung eine beliebige Funktion. Übergeben Sie außerdem ein ACTION_CANCEL-Ereignis an den untergeordneten Bereich. Der Übermittlungsprozess wird (das Ereignis ACTION_CANCEL ist in der Abbildung nicht dargestellt):
[tisa ps: Insgesamt wird onInterceptTouchEvent aus der Root-Ansicht weitergegeben, und onTouchEvent ist genau das Gegenteil. ]]
【Wende】 http://blog.csdn.net/cyp331203/article/details/41039635
Die wichtigsten Dinge bei der Übermittlung von Berührungsereignissen in Android sind die Methoden dispatchTouchEvent (), onInterceptTouchEvent () und onTouchEvent (). Dies ist eines der Probleme, die Anfänger stören, und ich habe auch angefangen. Notieren Sie die Verarbeitung von dispatchTouchEvent (), onInterceptTouchEvent () und onTouchEvent () für den Speicher.
Das dispatchTouchEvent übernimmt die Verteilung von Berührungsereignissen, und das Ereignis beginnt (in den meisten Fällen) mit dem dispatchTouchEvent der Aktivität. durchgeführt
super.dispatchTouchEvent (ev) wird das Ereignis nach unten verteilt.
onInterceptTouchEvent Ist die von ViewGroup bereitgestellte Methode, die standardmäßig false und true abgibt, um abzufangen.
onTouchEvent Wenn die Methode in View bereitgestellt wird, verfügt ViewGroup auch über diese Methode. OnInterceptTouchEvent wird in der Ansicht nicht bereitgestellt. Die Ansicht gibt standardmäßig true zurück und zeigt an, dass dieses Ereignis verwendet wird.
In der Ansicht gibt es zwei Rückruffunktionen:
[Java] Ansichtsebene Kopieren
- Öffentlichkeitboolean dispatchTouchEvent (MotionEvent ev) ;
- Öffentlichkeitboolean onTouchEvent (MotionEvent ev)
In der ViewGroup gibt es drei Rückruffunktionen:
[Java] Ansichtsebene Kopieren
- Öffentlichkeitboolean dispatchTouchEvent (MotionEvent ev) ;
- Öffentlichkeitboolean onInterceptTouchEvent (MotionEvent ev)
- Öffentlichkeitboolean onTouchEvent (MotionEvent ev)
In der Aktivität gibt es zwei Rückruffunktionen:

- Öffentlichkeitboolean dispatchTouchEvent (MotionEvent ev) ;
- Öffentlichkeitboolean onTouchEvent (MotionEvent ev)
Standardmäßig wird die Ereignisübermittlung in Android in der endgültigen Ansicht empfangen. Der Übertragungsprozess erfolgt vom übergeordneten Layout zum untergeordneten Layout, dh von der Aktivität zur Ansichtsgruppe zur Ansicht. Standardmäßig spielt die ViewGroup eine transparente Rolle. Der Ereignisübermittlungsprozess in Android (in Pfeilrichtung) ist wie unten gezeigt, das Bild stammt von [qiushuiqifei] ,Danke [qiushuiqifei] aussortieren.
Berührungsereignisse sind eine Reihe von ACTION_DOWN-, ACTION_MOVE..MOVE ... MOVE-, letzten ACTION_UP-, Berührungsereignissen und ACTION_CANCEL-Ereignissen. Das Ereignis beginnt mit ACTION_DOWN, und dispatchTouchEvent () der Aktivität empfängt zuerst ACTION_DOWN und führt es aus.super.dispatchTouchEvent (ev) wird das Ereignis nach unten verteilt.
dispatchTouchEvent () gibt true zurück, nachfolgende Ereignisse (ACTION_MOVE, ACTION_UP) werden erneut übergeben. Wenn false zurückgegeben wird, erhält dispatchTouchEvent () weder ACTION_UP noch ACTION_MOVE.
Die folgenden Abbildungen beziehen sich auf [EOE]
Abbildung 1. ACTION_DOWN wird nicht verbraucht
Abbildung 2-1. ACTION_DOWN wird von View verwendet
Abbildung 2-2. Nachfolgende ACTION_MOVE und UP gehen zu VIEW, ohne abgefangen zu werden.
Abbildung 3. Nachfolgendes Abfangen
Abbildung 4 ACTION_DOWN wurde von Anfang an abgefangen
Die Berührungsereignisse in Android beginnen bei ACTION_DOWN:
Einfinger-Betrieb: ACTION_DOWN --- ACTION_MOVE ---- ACTION_UP
Mehrfinger-Operation: ACTION_DOWN --- ACTION_POINTER_DOWN --- ACTION_MOVE - ACTION_POINTER_UP --- ACTION_UP.
【Wende】 http://blog.csdn.net/stzy00/article/details/40378533
In der Layoutdatei wird davon ausgegangen, dass es drei Ebenen gibt, eine ist eine Schaltfläche, eine Textansicht und andere allgemeine Komponenten, die zweite Ebene ist ein verschachteltes RelativeLayout, die dritte Ebene ist ein LinearLayout und ein Touchscreen-Ereignis ist nichts anderes als ACTION_DOWN, ACTION_MOVE, ACTION_UP. Drücken Sie, um den Bildschirm freizugeben. Die Übermittlung des Ereignisses hat diese drei Ebenen durchlaufen. Hier, seiner Verarbeitung, ist es auch eine Konsolidierung des Gedächtnisses.
Erstens sind die drei Methoden dispatchHandEvent (), onInterceptTouchEvent () und onTouchEvent () in jeder Ansicht verfügbar, unabhängig von Schaltfläche, Textansicht oder LinearLayout. RelativeLayout erbt schließlich von View, ViewGroup, sodass diese drei Methoden jeweils ihre eigenen haben sind . dispatchTouchEvent () ist für die Verteilung des Touch-Down-Ereignisses verantwortlich (down - move - up), onInterceptTouchEvent () ist für das Abfangen des Ereignisses verantwortlich und onTouchEvent () ist für die Behandlung des Ereignisses verantwortlich.
Lassen Sie uns als nächstes darüber sprechen, wie die drei Methoden in jeder dieser drei Ebenen an diesem Prozess beteiligt sind:
Aus der Aktivität wird das Ereignis empfangen, dass der Finger auf den Bildschirm drückt, dh ACTION_DOWN, der erste kommt zum LinearLayout, das LinearLayout ruft dispatchTouchEvent () auf, dispatchTouchEvent () wird im Allgemeinen nicht zum Umschreiben verwendet, es wird automatisch an onInterceptTouchEvent () verteilt Wenn onInterceptTouchEvent (ACTION_DOWN gibt fasle zurück, was bedeutet, dass es dieses Ereignis nicht behandelt, sondern es an die nächste weitergibt, um es zu verarbeiten, verteilen Sie dieses Ereignis also weiter an die nächste Ebene von RelativeLayout. Ebenso, wenn ACTION_DOWN von onInterceptTouchEvent () Gibt in RelativeLayout immer noch false zurück und erreicht hier die TextView. Wenn onInterceptTouchEvent ()) der TextView true zurückgibt, bedeutet dies, dass das Ereignis von sich aus behandelt wird, was dem Abfangen des Ereignisses entspricht. Wenn es verarbeitet wird, wird durch die Rückgabe von true das Ereignisergebnis umgekehrt. Weisen Sie die Aktivität in der Aktivität an, sie selbst zu bearbeiten. Dann werden die nächsten beiden Ereignisse, ACTION_MOVE und ACTION_UP, weiterhin an die Textansicht übergeben und verarbeitet.
Wenn das ACTION_DOWN am Anfang im RelativeLayout verarbeitet wird (dh das onInterceptTouchEvent () im RelativeLayout gibt true zurück und wird von seinem eigenen onTouchEvent () behandelt, kann die zugrunde liegende TextView nicht an der Übermittlung des Touch-Ereignisses teilnehmen, gefolgt von ACTION_MOVE Und ACTION_UP, TextView kann nicht übergeben werden). Wenn Sie also eine TOUCH-Aktion abfangen möchten, können Sie dies auf onInterceptTouchEvent () tun (hey, lassen Sie uns einige Dinge verstehen.) Solange ACTION_DOWN abgefangen wird, werden die folgenden MOVE- und UP-Ereignisse nicht weitergegeben, sondern nur die MOVE abfangen Ereignis, dann wird das UP-Ereignis nicht weitergegeben. Unabhängig davon, welche Ansicht dieses Berührungsereignis behandelt, muss das Ergebnis der endgültigen Verarbeitung in umgekehrter Reihenfolge an die Aktivität gesendet werden. Auf diese Weise erhält die Aktion des Benutzers auf dem Bildschirm das entsprechende Feedback.
Nachdruck unter: https://www.cnblogs.com/clong2010/p/4541217.html