Najlepszym miejscem do odkrycia tego jest kod źródłowy. Dokumenty są bardzo nieodpowiednie w wyjaśnianiu tego.
dispatchTouchEvent jest faktycznie zdefiniowany w Activity, View i ViewGroup. Pomyśl o tym jak o kontrolerze, który decyduje, jak kierować zdarzenia dotykowe.
Na przykład najprostszym przypadkiem jest View.dispatchTouchEvent, który przekieruje zdarzenie touch do OnTouchListener.onTouch, jeśli jest zdefiniowany, lub do metody rozszerzenia onTouchEvent .
W przypadku ViewGroup.dispatchTouchEvent rzeczy są znacznie bardziej skomplikowane. Musi dowiedzieć się, który z jego widoków potomnych powinien otrzymać zdarzenie (wywołując child.dispatchTouchEvent). Jest to w zasadzie algorytm testowania trafień, w którym określa się, który prostokąt obwiedni widoku potomnego zawiera współrzędne punktu styku.
Ale zanim zdoła wywołać zdarzenie do odpowiedniego widoku potomnego, rodzic może szpiegować i / lub przechwytywać zdarzenia razem. Właśnie po to jest onInterceptTouchEvent . Wywołuje więc tę metodę najpierw przed wykonaniem testu trafień, a jeśli zdarzenie zostało przejęte (przez zwrócenie wartości true z onInterceptTouchEvent), wysyła ACTION_CANCEL do widoków potomnych, aby mogły zrezygnować z przetwarzania zdarzenia dotyku (z poprzednich zdarzeń dotyku), a następnie wszystkie zdarzenia dotykowe na poziomie nadrzędnym są wysyłane do onTouchListener.onTouch (jeśli zdefiniowano) lub onTouchEvent (). Również w takim przypadku onInterceptTouchEvent nigdy nie jest wywoływany ponownie.
Czy chciałbyś nawet zastąpić [Aktywność | Grupa widoków | Widok] .dispatchTouchEvent? O ile nie wykonujesz niestandardowego routingu, prawdopodobnie nie powinieneś.
Głównymi metodami rozszerzenia są ViewGroup.onInterceptTouchEvent, jeśli chcesz szpiegować i / lub przechwytywać zdarzenia dotykowe na poziomie nadrzędnym oraz View.onTouchListener / View.onTouchEvent do obsługi zdarzeń głównych.
Podsumowując, jego zbyt skomplikowana konstrukcja imo, ale Android api bardziej skłania się ku elastyczności niż prostocie.