第三章 Android控件架構(gòu)與事件攔截機制

Android 群英傳筆記
第一章Android體系與系統(tǒng)架構(gòu)
第二章 Android開發(fā)工具及技巧
第三章 Android控件架構(gòu)與事件攔截機制
第四章 ListView 使用技巧
第五章 Android Scroll 分析
第六章 Android 繪圖機制與屏幕適配
第七章 Android 動畫機制與使用技巧
第八章 Activity與Activity調(diào)用棧分析
第九章 Android 系統(tǒng)信息與安全機制
第十章 Android性能優(yōu)化
本文出自:
http://www.itdecent.cn/u/a1251e598483

Android 控件架構(gòu)

Android的每個控件都是占一塊矩形的區(qū)域,大致的分兩類,繼承View和ViewGroup,ViewGroup相當(dāng)于一個容器,他可以管理多個字View,,整個界面上的控件形成了一個樹形結(jié)構(gòu),也就是我們常說的控件樹,上層控件負(fù)責(zé)下層控件的測量和繪制,并且傳遞交互事件,通過findviewbyid()這個方法來獲取,其實就是遍歷查找,在樹形圖的頂部都有一個ViewParent對象,這就是控制核心,所有的交互管理事件都是由它統(tǒng)一調(diào)度和分配,從而進行整個視圖的控制
通常情況下,我們要顯示一個activity的視圖,需要使用setContentView()方法,那么這個方法到底做了些什么呢?我們先來看看Android界面的架構(gòu)圖

View 樹結(jié)構(gòu)

UI界面架構(gòu)圖

我們可以看到,每個activity都有一個window對象,在Android中,window對象通常由一個phoneWindow去實現(xiàn)的,phoneWindow將一個DecorView設(shè)置為整個窗口的根View,DecorView作為窗口界面的頂層視圖,封裝了一些通用的方法,可以說,DecorView將要顯示的內(nèi)容都給了phoneWindow,這里面所有的View監(jiān)聽,都是通過WindowManagerService來接收的,通過相應(yīng)的回調(diào)來OnClicListener,在顯示上,他將屏幕分成了兩部分,一個title一個content,看到這里,大家應(yīng)該能看到一個熟悉的界面ContentView,它是一個ID為content的FrameLayout,activity_main.xml就是設(shè)置在這個FrameLayout里面

默認(rèn)是有title 的,如果我們想讓頁面全屏顯示,比如: 啟動頁,不要顯示title,就可以通過requestWindowFeature(Window.FEATURE_NO_TITLE)來設(shè)置全屏顯示
這個需要再setContentView()方法調(diào)用之前.
或者通過設(shè)置theme的方式處理全屏的問題,繼承正常的theme 增加一個 <item name="android:windowNoTitle">true</item> 也是可以全屏顯示頁面 同樣的 setTheme(R.style.AppTheme);要在setContentView()方法調(diào)用之前調(diào)用

而在onCreate()調(diào)用setContentView()方法后,ActivityManagerService會直接調(diào)用onResume,這個時候系統(tǒng)會把整個DecorView添加到PhoneWindow,然后顯示出來完成最后的繪制.

自定義View 前面已經(jīng)寫過很詳細(xì)的系列文章了.http://www.itdecent.cn/p/bd153dfc0095

再補充點內(nèi)容:
在View中通常有以下一些比較重要的回調(diào)方法.

  • onFinishInflate(): 從XML 加載組件后回調(diào);
  • onSizeChanged(): 組件大小改變時回調(diào);
  • onMeasure(): 回調(diào)改方法來進行測量;
  • onLayout(); 回調(diào)該方法來確定顯示的位置;
  • onTouchEvent(): 監(jiān)聽到觸摸事件時回調(diào);

自定義View 可以分為三種:

  • 對現(xiàn)有控件進行拓展;
  • 通過組合來實現(xiàn)新的控件;
  • 重寫View 來實現(xiàn)全新的控件

事件攔截機制

想自己敲來著,發(fā)現(xiàn)我按照例子來寫布局, ViewGroupB 和View C怎么都顯示不出來,我再調(diào)調(diào),先借用 吳小龍同學(xué)的 原文 http://wuxiaolong.me/2015/12/19/MotionEvent/ 來說一下理論

image.png

角色:
一個經(jīng)理:MotionEventViewGroupA,最外層的ViewGroupA;
一個組長:MotionEventViewGroupB,中間的ViewGroupB;
一個你:MotionEventViewC,最底層的碼農(nóng)。
模擬:
經(jīng)理分派任務(wù),下屬處理這個任務(wù)的過程。
不做任何修改,點擊MotionEventViewC

MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupB dispatchTouchEventB
MotionEventViewGroupB onInterceptTouchEventB
MotionEventViewC dispatchTouchEventC
MotionEventViewC onTouchEventC
MotionEventViewGroupB onTouchEventB
MotionEventViewGroupA onTouchEventA

log信息看出,正常情況,事件傳遞順序:
經(jīng)理 –> 組長 –> 你,先執(zhí)行dispatchTouchEvent(分發(fā)),再執(zhí)行onInterceptTouchEvent(攔截)

事件處理順序:
你 –> 組長 –> 經(jīng)理,事件處理都是執(zhí)行onTouchEvent(處理)。

事件傳遞返回值:true,攔截,交給自己的onTouchEvent處理;false,不攔截,傳給下屬。

事件處理返回值:true,自己搞定,不用上報上司;false,上報上司處理。

初始返回都是false。

事件傳遞,dispatchTouchEvent一般不太會改寫,只關(guān)心onInterceptTouchEvent。
經(jīng)理覺得這個任務(wù)太簡單,自己處理
即MotionEventViewGroupA里onInterceptTouchEvent返回true,我們看下log信息:

MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupA onTouchEventA

組長覺得這個任務(wù)太簡單,自己處理
即MotionEventViewGroupB里onInterceptTouchEvent返回true,我們看下log信息:

MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupB dispatchTouchEventB
MotionEventViewGroupB onInterceptTouchEventB
MotionEventViewGroupB onTouchEventB
MotionEventViewGroupA onTouchEventA

你迫于壓力,辭職不干了,任務(wù)閑置
即MotionEventViewC里onTouchEvent返回true,我們看下log信息:

MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupB dispatchTouchEventB
MotionEventViewGroupB onInterceptTouchEventB
MotionEventViewC dispatchTouchEventC
MotionEventViewC onTouchEventC

事件處理到你這里就結(jié)束了。

組長覺得你任務(wù)完成太爛,不敢上報
即MotionEventViewB里onTouchEvent返回true,我們看下log信息:

MotionEventViewGroupA dispatchTouchEventA
MotionEventViewGroupA onInterceptTouchEventA
MotionEventViewGroupB dispatchTouchEventB
MotionEventViewGroupB onInterceptTouchEventB
MotionEventViewC dispatchTouchEventC
MotionEventViewC onTouchEventC
MotionEventViewGroupB onTouchEventB

事件處理經(jīng)過你和組長,到組長那里就結(jié)束了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容