TGViewer
Android under the hood Android under the hood @android_under_the_hood · 1.53K subscribers
Post #20 741
Как вьюшки получают touch события.

1) Android система получает сигналы от сенсорного экрана, переводит их в более простой тип InputEvent и вызывает метод dispatchInputEvent у класса InputEventReceiver, который передаёт события Android приложению.

2) При запуске Android приложения создаётся неявный родитель для иерархии вьюшек ViewRootImpl, который является звеном между WindowManager и View, и в котором определён наследник InputEventReceiver:

final class WindowInputEventReceiver extends InputEventReceiver {

    @Override
    public void onInputEvent(InputEvent event) {
        // добавляет в очередь новое событие InputEvent
        enqueueInputEvent(...)
    }

}


Также в ViewRootImpl реализована очередь событий в виде связанного списка, узлом которого является QueuedInputEvent, обертка над InputEvent.

Для обработки событий используется цепочка обязанностей, реализованная наследниками InputStage: событие передаётся одному из наследников InputStage, если он не может его обработать по каким то причинам, то передаётся другому и тд. Нам интересна только иерархия View, поэтому смотрим следующий код:

final class ViewPostImeInputStage extends InputStage {

    private int processPointerEvent(...) {
        // передаёт touch событие в иерархию вьюшек
        mView.dispatchPointerEvent(event)
    }

}


Механизм обработки событий можно сравнить с Looper/Handler: вместо Message - InputEvent, вместо Handler - цепочка обязанностей InputStage.

3) Корнем иерархии View является DecorView, именно здесь происходит вызов метода dispatchPointerEvent, который под капотом вызывает dispatchTouchEvent для touch события.

Метод DecorView.dispatchTouchEvent сначала пробрасывает событие в Activity.dispatchTouchEvent, вы можете переопределить данный метод, чтобы перехватить все touch события. После обработки события в Activity, оно прокидывается остальной иерархии View, пока не будет обработано.

Важно отметить, что onTouchEvent вызывается в View.dispatchTouchEvent.

Пишите в комментах ваше мнение и всем хорошего кода!
  • 👍 8
More from @android_under_the_hood
  1. Oct 4, 2026Всем привет, хочу поделиться проектом, который запустил 1 октября — ЗдесьЯ. Это цифровая с…
  2. Oct 2, 2026Kotlin lambdas, часть I. До версии Kotlin 2.0 лямбды компилировались в анонимные классы, р…
  3. Sep 27, 2026Делегат свойства в Kotlin. В Kotlin есть конструкция, которой нет в JVM: var name by NameD…
  4. Sep 23, 2026val vs var под капотом. На уровне Kotlin все просто: val x = 10 var y = 20 y = 30 // компи…
  5. Sep 20, 2026Возвращение Прошло уже полгода с последней записи на канале. За это время в моей жизни про…
  6. Feb 5, 2026Пару фактов о Go, часть II. 4) Вместо Kotlin Nullability указатели как в С/C++, то есть об…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →