參考:https://github.com/devhuangxin/Blog/blob/master/事件分發(fā)前奏-從sdk源碼到View甸箱、ViewGroup的步驟.md
1、Activity 啟動完成后 ViewRootImpl 在添加 decor 的時候會注冊一個 InputEventReceiver .
它并不是四大組件中的那個廣播接收者, 但是工作形式可以說是類似 .
硬件的輸入事件將會被 InputEventReceiver 接收到并執(zhí)行應(yīng)用層的操作, 具體由 InputStage 的各個子類來執(zhí)行
其中 ViewPostImeInputStage 類用于實現(xiàn)觸摸事件的相關(guān)處理.
2破托、ViewPostImeInputStage 會調(diào)用 mView.dispatchPointerEvent(event); 并接收一個返回值. 如果該方法返回true,那么觸摸事件將會返回一個 FINISH_HANDLED 狀態(tài), 否則將會返回一個 FORWARD 狀態(tài)
其中的 mView 就是 PhoneWindow 中的 DecorView, 也就是最開始我們說的 decor
3查坪、DecorView 中 dispatchPointerEvent 調(diào)用了 Window.Callback 的 dispatchTouchEvent(ev) 方法, 這里的 Callback 就是 Activity 創(chuàng)建 Window(PhoneWindow) 的時候設(shè)置的 Activity 他自己
4寸宏、Activity 中 dispatchTouchEvent 調(diào)用了 window 的 superDispatchTouchEvent(ev) 方法.
找到 window 的具體實現(xiàn) PhoneWindow, PhoneWindow 的 superDispatchTouchEvent(ev) 方法 調(diào)用了 decor 的 superDispatchTouchEvent(event);
5、然后 decor 的 superDispatchTouchEvent(event); 調(diào)用了 super.dispatchTouchEvent(event); .
這里 DecorView 是一個 FrameLayout 的實現(xiàn). 這就是 一個觸摸事件從系統(tǒng)源碼分發(fā)到 View 層的實現(xiàn)
概括:
DecorView [dispatchPointerEvent]
|
Activity [dispatchTouchEvent] decor 的Window.Callback 代理
|
PhoneWindow [superDispatchTouchEvent]
|
DecorView [superDispatchTouchEvent]
|
DecorView [super.dispatchTouchEvent]
|
ViewGroup [dispatchTouchEvent] DecorView 繼承自FrameLayout