Лучшее место для демистификации - это исходный код.Документы крайне неадекватны для объяснения этого.
dispatchTouchEvent фактически определено в Activity, View и ViewGroup. Думайте об этом как о контроллере, который решает, как маршрутизировать события касания.
Например, самый простой случай - это View.dispatchTouchEvent , который будет маршрутизировать касаниесобытие OnTouchListener.onTouch , если оно определено, или метод расширения onTouchEvent .
Для ViewGroup.dispatchTouchEvent все гораздо сложнее.Ему нужно выяснить, какое из его дочерних представлений должно получить событие (вызывая child.dispatchTouchEvent).Это в основном алгоритм тестирования попаданий, в котором вы выясняете, какой ограничительный прямоугольник дочернего представления содержит координаты точки касания.
Но прежде чем он сможет передать событие соответствующему дочернему представлению, родитель может шпионить и / или перехватитьсобытие все вместе.Для этого и существует onInterceptTouchEvent .Таким образом, он вызывает этот метод в первую очередь перед выполнением тестирования на попадание и, если событие было угнано (возвращая true из onInterceptTouchEvent), он отправляет ACTION_CANCEL дочерним представлениям, чтобы они могли отказаться от обработки события касания (от предыдущего касания).события) и с этого момента все сенсорные события на родительском уровне отправляются в onTouchListener.onTouch (если определено) или onTouchEvent ().Также в этом случае onInterceptTouchEvent больше не вызывается.
Хотели бы вы переопределить [Activity | ViewGroup | View] .dispatchTouchEvent?Если вы не делаете какую-то пользовательскую маршрутизацию, вы, вероятно, не должны.
Основными методами расширения являются ViewGroup.onInterceptTouchEvent, если вы хотите шпионить и / или перехватывать событие касания на родительском уровне, и View.onTouchListener / View.onTouchEvent для обработки основного события.
Все ввсе это слишком сложный дизайн, но Android Apis больше склоняется к гибкости, чем к простоте.