Как работает метод dispatchTouchEvent()? (2/2)
Decor View – это верхний ViewGroup в иерархии view, ассоциированной с Window.
В классе ViewGroup метод dispatchTouchEvent() переопределен и имеет отличную реализацию от класса View, поэтому рассмотрим их отдельно.
ViewGroup.dispatchTouchEvent() определяет, следует ли отправить ивент в одну из дочерних view или обработать в текущей ViewGroup:
1. Сначала вызывается метод onInterceptTouchEvent(). Если этот метод возвращает false, то ивент пробрасывается вниз по иерархии view, иначе ViewGroup обрабатывает ивент сама;
2. Проверяются координаты каждой дочерней view и координаты объекта MotionEvent. Если MotionEvent входит в границы дочерней view, то на ней вызывается метод dispatchTouchEvent() и объект MotionEvent переходит вниз по иерархии;
3 Если ни одна из дочерних view не подходит для передачи ивента, то текущая ViewGroup считается таргет-view и обрабатывает ивент.
View.dispatchTouchEvent() вызывается только в том случае, когда текущая view уже определена как таргет-view ивента. Этот метод делает следующее:
1. Если view имеет OnTouchListener, то вызывается OnTouchListener.onTouch() с объектом MotionEvent в качестве параметра;
2. Если ивент не обработан листенером, то вызывается метод View.onTouchEvent().
#View
Decor View – это верхний ViewGroup в иерархии view, ассоциированной с Window.
В классе ViewGroup метод dispatchTouchEvent() переопределен и имеет отличную реализацию от класса View, поэтому рассмотрим их отдельно.
ViewGroup.dispatchTouchEvent() определяет, следует ли отправить ивент в одну из дочерних view или обработать в текущей ViewGroup:
1. Сначала вызывается метод onInterceptTouchEvent(). Если этот метод возвращает false, то ивент пробрасывается вниз по иерархии view, иначе ViewGroup обрабатывает ивент сама;
2. Проверяются координаты каждой дочерней view и координаты объекта MotionEvent. Если MotionEvent входит в границы дочерней view, то на ней вызывается метод dispatchTouchEvent() и объект MotionEvent переходит вниз по иерархии;
3 Если ни одна из дочерних view не подходит для передачи ивента, то текущая ViewGroup считается таргет-view и обрабатывает ивент.
View.dispatchTouchEvent() вызывается только в том случае, когда текущая view уже определена как таргет-view ивента. Этот метод делает следующее:
1. Если view имеет OnTouchListener, то вызывается OnTouchListener.onTouch() с объектом MotionEvent в качестве параметра;
2. Если ивент не обработан листенером, то вызывается метод View.onTouchEvent().
#View