? ? ? ? ? 控件是每個(gè)Android App都必不可少的一部分,無論是使用系統(tǒng)控件,還是使用自定義控件遂鹊。這些控件,組成了每個(gè)精美的界面蔗包,本章向大家講解Android控件架構(gòu)秉扑,以及如何實(shí)現(xiàn)自定義控件。
? ? ? ? ?學(xué)習(xí)本章调限,你講了解到以下內(nèi)容:
? ?1 ?android控件架構(gòu)
? ?2 ?View的測(cè)量與繪制
? ?3 ?ViewGroup的測(cè)量與繪制
? 4 ? 自定義控件的三種方式
? 5 ? 事件的攔截機(jī)制
3.1 Android控件架構(gòu)
? ? ? ? ?Android中的美格空間都會(huì)在界面中占得一塊矩形的區(qū)域舟陆,而在Android中,控件大致被分為兩種旧噪,即ViewGroup控件與View控件吨娜。ViewGroup空間作為父控件可以包含多個(gè)View控件,并管理其包含的View控件淘钟。通過ViewGroup宦赠,整個(gè)界面上的控件形成了樹形結(jié)構(gòu),這也就是我們常說的控件樹,上層控件負(fù)責(zé)下層控件的測(cè)量與繪制勾扭,并傳遞交互事件毡琉。通常在Activity中使用findViewById()方法,就是在空間書中以樹的深度優(yōu)先遍歷來查找對(duì)應(yīng)元素妙色。在每顆控件樹的頂部桅滋,都有一個(gè)ViewParent對(duì)象,這就是整顆樹的核心控制身辨,所有的交互管理實(shí)踐都由她來統(tǒng)一調(diào)度和分配丐谋,從而可以對(duì)整個(gè)視圖進(jìn)行整體控制。
? ? ? ? 通常情況下煌珊,在Acitivity中使用setContentView()方法來設(shè)置一個(gè)布局号俐,在調(diào)用該方法后,布局才真正的顯示出來定庵。那么setContentView()方法具體做了些什么啦吏饿?首先,我們來看一下Android界面的架構(gòu)圖蔬浙,
? ? ? ? 如圖3.2所示猪落,每個(gè)Activity都包含一個(gè)window對(duì)象,在Android中window對(duì)象通常由PhoneWindow來實(shí)現(xiàn)畴博。phoneWindow將一個(gè)DecorView設(shè)置為整個(gè)應(yīng)用窗口的根View笨忌。
DecorView作為窗口界面的頂層視圖,封裝了一些窗口操作的通用方法绎晃∶弁伲可以說DecorView
將要顯示的具體內(nèi)容呈現(xiàn)在了PhoneWindow上杂曲,這里面的所有View的監(jiān)聽事件們都通過WindowMangerService來進(jìn)行接收庶艾,并通過Activity對(duì)象來回調(diào)相應(yīng)的onCkickListener。在顯示上擎勘,它將屏幕分為兩部分咱揍,一個(gè)是TitleView,另一個(gè)是ContentView棚饵∶喝梗看到這里,大家一定看到了一個(gè)非常熟悉的布局-------contentView噪漾。他是一個(gè)ID為content的Framelayout硼砰,,activity_main.xml就是設(shè)置在這樣一個(gè)framelayout里欣硼,通過以上過程题翰,我們就可以建立起這樣一個(gè)標(biāo)準(zhǔn)視圖如圖3.3所示
圖3.3所示的視圖的第二層裝載了一個(gè)LinearLayout,作為ViewGroup,這一層的布局結(jié)構(gòu)會(huì)根據(jù)對(duì)應(yīng)參數(shù)設(shè)置不同布局豹障,如最常用的布局------上面顯示TitleBar下面是Content這樣的布局冯事,也就是圖3.3中所設(shè)置的布局。而如果用戶通過設(shè)置
requsetWindowFeature(Window.FEATURE_NO_TITLE)來試著全屏顯示血公,視圖樹中的布局就只有Content了昵仅,這就解釋了為什么調(diào)用requsetWindowFeature()方法一定要在調(diào)用
之前才能生效的原因。不過這里要注意的是累魔,由于每個(gè)Android班的UI的修改都比較多摔笤,圖3.3只是比較粗略的現(xiàn)實(shí)了視圖樹的結(jié)構(gòu)。
? ? ? ? ? ?而在代碼中垦写,當(dāng)程序在onCreat()方法中調(diào)用了setcontentView()方法后籍茧,ActivityMangerServic會(huì)調(diào)用onResume()方法,此時(shí)系統(tǒng)才會(huì)把整個(gè)DecorView添加到PhoneWindow中梯澜,并讓其顯示出來寞冯,從而最總完成界面的繪制。
http://zhanhao.iteye.com/blog/1174914
http://www.cnblogs.com/zhongbingshu/p/5775824.html