Zustellungsregeln für die Verteilung von Android-Klickereignissen

Wir haben den Quellcode des Click-Event-Verteilungsmechanismus zuvor analysiert. Verstanden, die Beziehung zwischen drei wichtigen Methoden. Das Folgende ist eine einfache Darstellung mit Pseudocode:

public boolean dispatchTouchEvent(MotionEvent ev) {
	boolean result = false;
	if(onInterceptTouchEvent(ev)) {
		result = onTouchEvent(ev);
	} else {
		result = child.dispatchTouchEvent(ev);
	}
	return result;
}

Sowohl die Methoden „onInterceptTouchEvent“ als auch „onTouchEvent“ werden in der Methode „dispatchTouchEvent“ aufgerufen. Lassen Sie uns nun die Übermittlungsregeln der Klickereignisverteilung basierend auf diesem Pseudocode analysieren.

Lassen Sie uns zunächst über die Top-Down-Übertragungsregeln des Klickereignisses sprechen. Wenn das Klickereignis generiert wird, wird es von der Aktivität verarbeitet, an PhoneWindow übergeben, dann an DecorView übergeben und schließlich an die oberste Ebene übergeben ViewGroup. Im Allgemeinen wird bei der Ereigniszustellung nur die onInterceptTouchEvent-Methode von ViewGroup berücksichtigt, da wir die DispatchTouchEvent-Methode im Allgemeinen nicht neu schreiben. Für die Stamm-ViewGroup wird das Tap-Ereignis zunächst an die Methode „dispatchTouchEvent“ übergeben. Wenn die onInterceptTouchEvent-Methode der ViewGroup „true“ zurückgibt, bedeutet dies, dass das Ereignis abgefangen werden soll und das Ereignis zur Verarbeitung an seine onTouchEvent-Methode übergeben wird. Wenn die onIntercepterTouchEvent-Methode false zurückgibt, bedeutet dies, dass das Ereignis nicht abgefangen wird und das Ereignis zur Verarbeitung an das DispatchTouchEvent seiner untergeordneten Elemente übergeben wird. Und so weiter und so weiter. Wenn es an die untere Ansicht übergeben wird, die keine Unteransichten hat, wird die DispatchTouchEvent-Methode der Ansicht aufgerufen. Unter normalen Umständen wird schließlich die onTouchEvent-Methode der Ansicht aufgerufen.

Liu Wangshu verwendete das Beispiel der Kampfkünste, auf das wir uns beziehen können:

Angenommen, jemand kommt nach Wudang, um Ärger zu machen, wird die Nachricht zunächst dem Chef Zhang Sanfeng gemeldet. Zhang Sanfeng wird nicht persönlich ausgehen, also übergibt er die Aufgabe an Song Yuanqiao, einen der sieben Helden von Wudang Sagen wir, Zhang Sanfengs onInterceptTouchEvent() gibt false zurück, Song Yuanqiao Er hatte das Gefühl, dass er, egal was er war, immer noch die Sieben Helden von Wudang war und es nicht selbst tun musste, also übergab er die Aufgabe an Wudangs Schüler Lied Qingshu. Das heißt, Song Yuanqiaos onInterceptTouchEvent gibt false zurück, Song Qingshu hat keine Männer und er kann nur alleine kämpfen. Hier vergleichen wir Zhang Zhenren mit der ViewGroup der obersten Ebene und Song Yuanqiao, einen der Wudang Seven Heroes, mit der ViewGroup der mittleren Ebene. Song Qingshu, ein Schüler von Wudang, vergleicht die zugrunde liegende Ansicht. Daher kommen wir zu dem Schluss, dass die Regeln für die Weitergabe des Rückgabewerts von Ereignissen von oben nach unten gelten:

Wenn die onInterceptTouchEvent-Methode „true“ zurückgibt, wird sie abfangen und nicht weiter weiterleiten; wenn die onInterceptTouchEvent-Methode „false“ zurückgibt, wird sie nicht abfangen und nicht weiter weiterleiten.

Lassen Sie uns über den Bottom-up-Übertragungsprozess des Klickereignisses sprechen. Wenn das Click-Ereignis an die zugrunde liegende Ansicht übergeben wird und sein onTouchEvent „true“ zurückgibt, wird das Ereignis von der zugrunde liegenden Ansicht konsumiert und verarbeitet. Wenn onTouchEvent false zurückgibt, bedeutet dies, dass die Ansicht nicht verarbeitet wird. Und übergeben Sie es zur Verarbeitung an die onTouchEvent-Methode der übergeordneten Ansicht. Wenn die onTouchEvent-Methode der übergeordneten Ansicht immer noch false zurückgibt, wird sie weiterhin an die View-Verarbeitung der übergeordneten Ansicht übergeben. Und so weiter und so weiter.

Um mit dem klassischen Beispiel der Kampfkünste fortzufahren: Als Song Qingshu herausfand, dass der eindringende Feind Cheng Kun war, war er überhaupt nicht Cheng Kuns Gegner. Er konnte damit nicht umgehen, das heißt, sein onTouchEvent gab false zurück, also rannte er los, um Song Yuanqiao zu finden. Als Song Yuanqiao hörte, dass es Cheng Kun war, wusste er in seinem Herzen, dass er kein Gegner war, das heißt, onTouchEvent gab false zurück, also machte er sich auf die Suche nach Zhang Zhenren, Zhang Zhenren wählte leicht Cheng Kun aus und onTouchEvent gab true zurück. Deshalb , kam er zu dem Schluss, dass, wenn onTouchEvent true zurückgibt, es nicht nach oben weitergeleitet wird, wenn es verarbeitet wird. Wenn die onTouchEvent-Methode false zurückgibt, wird sie nicht verarbeitet und weiter nach oben weitergeleitet.

Supongo que te gusta

Origin blog.csdn.net/howlaa/article/details/128540365
Recomendado
Clasificación