Лучшее место для демистификации это исходный код. Документы крайне неадекватны для объяснения этого.
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 больше склоняется к гибкости, чем к простоте.