簡(jiǎn)述:
? ? ? Android 應(yīng)用中的所有用戶界面元素都是使用View和ViewGroup對(duì)象構(gòu)建而成。View對(duì)象用于在屏幕上繪制可供用戶交互的內(nèi)容堵泽。ViewGroup對(duì)象用于儲(chǔ)存其他View(和ViewGroup)對(duì)象修己,以便定義界面的布局。
視圖的繪制過(guò)程:
? ? ? 通常我們自定義控件時(shí)迎罗,需要繼承View或者ViewGroup或者它們的子類(lèi)睬愤,然后實(shí)現(xiàn)特定的方法即可。如下圖所示纹安,通常我們關(guān)注下面3個(gè)方法即可實(shí)現(xiàn)簡(jiǎn)單的View的繪制尤辱,視圖在加載的時(shí)候就包括了測(cè)量(onMeasure),布局(onLayout)钻蔑,繪畫(huà)(onDraw)這幾個(gè)過(guò)程啥刻。
觸摸事件的分發(fā)機(jī)制:
? ? ? 通常我們需要對(duì)用戶的觸摸事件進(jìn)行相應(yīng)的處理來(lái)實(shí)現(xiàn)特定的效果,下面分析下Android中觸摸事件的分發(fā)機(jī)制咪笑。Android將基本觸摸動(dòng)作都封裝在了MotionEvent類(lèi)里面可帽,用戶在觸摸屏幕時(shí),首先會(huì)觸發(fā)down事件窗怒,根據(jù)down事件的是否消費(fèi)映跟,后續(xù)的事件處理也不盡相同蓄拣。下圖是一個(gè)activity,一個(gè)父布局(ParentViewGroup)中包含了一個(gè)子布局(ChildViewGroup)努隙,子布局中又包含了一個(gè)view的事件處理過(guò)程球恤。
(1)down事件在整個(gè)過(guò)程中都沒(méi)有被消費(fèi)。如上圖第一行荸镊,事件從Activity----->ParentViewGroup----->ChildViewGroup-->View,然后再?gòu)腣iew反向傳遞給了Activity咽斧。既然down傳遞給我這些視圖,而這些視圖沒(méi)有一個(gè)去消費(fèi)躬存,所以對(duì)于UP和MOVE事件就只在Activity中處理张惹,不再向下傳遞。如上圖第一行最后一個(gè)圖岭洲。
(2)down事件在整個(gè)處理過(guò)程中有被消費(fèi)宛逗,則立刻停止向下傳遞,并且以后的MOVE和UP事件和DOWN事件的處理流程一致盾剩。
?(3) 接口返回true是消費(fèi)雷激,返回false是沒(méi)有消費(fèi)繼續(xù)傳遞。在ViewGroup中多了個(gè)攔截器(onInterceptTouchEvent),在View中沒(méi)有告私,因?yàn)閂iewGroup可能有子View屎暇,它是用來(lái)決定是否繼續(xù)傳遞給子View的。
布局及性能優(yōu)化:
? ? ?說(shuō)到布局德挣,我們一般會(huì)想起下面這張圖恭垦。我們布局中的XML文件就是這種結(jié)構(gòu),這張圖越扁平格嗅,布局的層級(jí)越少番挺,布局的性能越好。下圖是一種has-A的關(guān)系屯掖,不是is-A的關(guān)系玄柏。
? ? ? 關(guān)于布局的優(yōu)化網(wǎng)上有很多,我在這里羅列一些贴铜,其實(shí)還是上面的那句話“這張圖越扁平粪摘,布局的層級(jí)越少,布局的性能越好”绍坝。
? ? (1)減少布局的層級(jí)徘意,查看層級(jí)一般有兩種方法。
? ? ? a, 在手機(jī)上開(kāi)發(fā)者選項(xiàng)中打開(kāi)“調(diào)試GPU過(guò)度繪制”開(kāi)關(guān)轩褐,看過(guò)度渲染層級(jí)(藍(lán)色椎咧、淡綠、淡紅、深紅代表了4種不同程度的Overdraw 情況勤讽,我們的目標(biāo)就是盡量減少紅色Overdraw蟋座,看到更多的藍(lán)色區(qū)域)具體方法google。
? ? ? ?b脚牍,使用HierarchyViewer查看布局層次向臀,我們可以在Android的sdk的tools目錄下找到這個(gè)工具。
? ? ?(2)使用<merge\>標(biāo)簽,避免引入多余的層級(jí)
? ? ?(3)使用ViewStub對(duì)一些不常用的標(biāo)簽诸狭,在使用的時(shí)候加載
? ? ?(4)Drawable對(duì)象不要Xml中設(shè)置background券膀,在代碼中動(dòng)態(tài)設(shè)置
? ? ?(5)使用include標(biāo)簽,主要作用是代碼復(fù)用
結(jié)語(yǔ):
本文簡(jiǎn)單記錄了視圖和布局的基礎(chǔ)知識(shí)驯遇。其中細(xì)節(jié)遠(yuǎn)不止于此三娩。