Найкраще місце для демістифікації цього - вихідний код. Документи дуже важко пояснюють це.
dispatchTouchEvent фактично визначений у розділі "Активність", "Перегляд" та "Перегляд групи". Подумайте про це як про контролер, який вирішує, як спрямовувати події дотику.
Наприклад, найпростіший випадок - це View.dispatchTouchEvent, який буде направляти сенсорну подію або на OnTouchListener.onTouch, якщо він визначений, або на метод розширення onTouchEvent .
Для ViewGroup.dispatchTouchEvent речі набагато складніші. Потрібно розібратися, який з його поглядів на дитину повинен отримати подію (зателефонувавши на child.dispatchTouchEvent). Це в основному алгоритм тестування хітів, де ви з'ясували, який обмежуючий прямокутник подання дитини містить координати точки дотику.
Але перш ніж вона зможе направити подію на відповідний дочірній погляд, батько може шпигувати та / або перехоплювати подію всі разом. Саме для цього існує InInceptceptTouchEvent . Тому він спочатку викликає цей метод перед тим, як здійснити тестування звернень, і якщо подія була захоплена (повернувши правду з onInterceptTouchEvent), вона надсилає ACTION_CANCEL дочірнім представленням, щоб вони могли відмовитися від обробки подій сенсорного зв'язку (від попередніх подій торкання), а потім і далі всі події дотику на батьківському рівні надсилаються на onTouchListener.onTouch (якщо визначено) або onTouchEvent (). Також у цьому випадку onInterceptTouchEvent більше ніколи не викликається.
Ви хочете навіть змінити [Activity | ViewGroup | View] .dispatchTouchEvent? Якщо ви не робите власну маршрутизацію, ви, мабуть, не повинні.
Основними методами розширення є ViewGroup.onInterceptTouchEvent, якщо ви хочете шпигувати та / або перехоплювати сенсорні події на батьківському рівні та View.onTouchListener / View.onTouchEvent для обробки основних подій.
Загалом його надмірно складний дизайн imo but android apis більше схиляється до гнучкості, ніж простоти.