Android View樹結(jié)構(gòu)
[圖片上傳失敗...(image-85aaf7-1630895208631)]
[圖片上傳失敗...(image-8c09b-1630895208631)]
[圖片上傳失敗...(image-25abb8-1630895208631)]
日常處理的部分為RootView下面的ViewGroup和View部分,那么上面的PhoneWindow、DecorView和RootView是做什么用的呢?RootView本身可以作為上下溝通的橋梁使用唱矛。
(設(shè)計模式-組合模式)
PhoneWindow是Window的實現(xiàn)類晰骑,Window是抽象類严卖,DecorView是它的一個內(nèi)部類。所以靶端,PhoneWindow的大部分消息建钥,都是PhoneWindow通過DecorView傳遞給下面的View的藤韵,同時下面的View傳遞消息也是通過DecorView回傳給PhoneWindow。
Android 事件分發(fā)流程
事件的傳遞過程中熊经,主要有三種情況:事件分發(fā)(dispatchTouchEvent)泽艘、事件攔截(onInterceptTouchEvent)、事件消費(onTouchEvent)奈搜。這三種情況均有一個boolean型的返回值來控制事件的傳遞流程悉盆。
類型 | 相關(guān)方法 | Activity | VeiwGroup | View |
---|---|---|---|---|
事件分發(fā) | dispatchTouchEvent | √ | √ | √ |
事件攔截 | onInterceptTouchEvent | X | √ | X |
事件消費 | onTouchEvent | √ | √ | √ |
為什么只有ViewGroup有事件攔截:因為Activity作為事件分發(fā)的開始盯荤,攔截了就只能自己處理了馋吗;而View作為事件分發(fā)的最末端,攔不攔截都需要它處理秋秤。中間階段宏粤,攔截可做一些處理。
事件傳遞的順序:
Activity -> PhoneWindow -> DecorView -> ViewGroup -> View -> Activity
如果我們點擊View1灼卢,系統(tǒng)如何傳遞給View1呢绍哎,而不是下面的ViewGroupA或者RootView。很明顯鞋真,我們需要一種機制來執(zhí)行消息的分發(fā)崇堰。而消息分發(fā)的最小單位是View,ViewGroup是View的子類,Activity是根布局.
1.點擊View1區(qū)域但是沒有任何View1消費事件
2.點擊View1區(qū)域并被View1消費事件
3.點擊View1區(qū)域但是事件被ViewGroupA攔截
事件消費與否與具體消費無關(guān)海诲,僅由返回值決定繁莹,true表示消費,false表示不消費特幔。