本文原創(chuàng), 轉(zhuǎn)載請注明出處 : http://blog.csdn.net/qinjuning
前言,竟然是翻譯,當(dāng)然得弄的有板有眼。 照著大作家格式來咯 , - - 。
譯序
最近一直在做鎖屏界面,之前也寫過關(guān)于鎖屏界面的一些簡單原理,未曾想自己真正去深入理解鎖屏?xí)r,才
發(fā)覺鎖屏框架 真是又大又復(fù)雜,主要體現(xiàn)在如下兩個(gè)方面:
1、界面的組成以及更新機(jī)制;
2、對電源管理的控制,在鎖屏界面會禁用系統(tǒng)的電源管理,自己接管屏幕亮度的控制。
當(dāng)然還有更多的邏輯細(xì)節(jié)處理,只能耐著性子去研究了。。
通過對本次鎖屏界面的處理,才發(fā)現(xiàn)自己對View繪制還是不熟透,很多東西也沒有去潛心研究,導(dǎo)致自己在
真正做 項(xiàng)目時(shí)候才手忙腳亂的。因此,借著這次機(jī)會,也把 Android 4.0 developer 這些先進(jìn)的知識(山人一直
沉浸在Android 2.2中) 給過了一下,真是妙處多多。
開頭: 為了避免歧義,先將Android “Layout”一次的意思進(jìn)行說明,主要有如下三個(gè)方面:
1、統(tǒng)稱,即如何擺放UI,UI呈現(xiàn)效果等;
2、布局文件 ,即/res/layout/xxx.xml ;
3、布局過程 ,Android繪制過程中的 layout過程;
4、一些布局控件,例如LinearLayout、FrameLayout等 ;
正文:
改善布局效率(Layout Performace)
本文翻譯地址:
http://developer.android.com/training/improving-layouts/index.html
布局是Android應(yīng)用程序重要的一部分,它與用戶體驗(yàn)有著直接聯(lián)系。如果一個(gè)布局是糟糕的,它將產(chǎn)生一個(gè)
消耗內(nèi)存 與低效UI應(yīng)用程序。 Android SDK 及它包含的工具都能幫助你定位在布局過程中隱藏的問題,通過對
這些課程的學(xué)習(xí), 你能夠以很小的內(nèi)存代價(jià)去實(shí)現(xiàn)流暢的平滑界面。
課程如下:
1 、優(yōu)化布局層次
同樣地,一個(gè)復(fù)雜的網(wǎng)頁會延長加載時(shí)間,你的布局層次如果太復(fù)雜也能引發(fā)一些效率問題。本課程
告知你如何利用 SDK的工具去觀察你的布局以及發(fā)現(xiàn)布局過程的瓶頸問題。
2、使用<include />標(biāo)簽復(fù)用布局文件
如果應(yīng)用程序的UI在多處重復(fù)某些布局結(jié)構(gòu),本課程向你展示如何創(chuàng)建高效、可重用的布局結(jié)構(gòu), 然后
以合適的 UI布局文件包含它們。
3、按需加載View視圖
除了簡單地在另外的布局文件中包括一個(gè)布局組件,你可能想在需要的時(shí)候才將視圖顯現(xiàn)出來,有的時(shí)候
是在 Activity運(yùn)行之后。本課程告訴你如何改進(jìn)布局初始化行為---- 按需加載布局文件的某個(gè)視圖。
4、如何使ListView流暢滑動(dòng)
如果你構(gòu)建了一個(gè)ListView實(shí)例呈現(xiàn)那些包含復(fù)雜或者大容量數(shù)據(jù)的列表項(xiàng),這可能會影響ListView的流暢
滑動(dòng)。 本課程提供了一些如何讓滑動(dòng)過程更加流暢的建議。
譯一 :
優(yōu)化布局層次
本文地址: http://developer.android.com/training/improving-layouts/optimizing-layout.html
一個(gè)通常的錯(cuò)誤觀念就是使用基本的布局結(jié)構(gòu)(例如:LinearLayout、FrameLayout等)能夠在大多數(shù)情況下
產(chǎn)生 高效率 的布局。顯然,你的應(yīng)用程序里添加的每一個(gè)控件和每一個(gè)布局都需要初始化、布局(layout)、
繪制 (drawing)。舉例來說: 嵌入一個(gè)LinearLayout會產(chǎn)生一個(gè)太深的布局層次。更嚴(yán)重的是,嵌入幾個(gè)使
用layout_weight屬性的LinearLayout 將會導(dǎo)致大量的開銷,因?yàn)槊總€(gè)子視圖都需要被測量兩次。這是反復(fù)解析
布局文件時(shí)重要的一點(diǎn),例如在ListView或者 GridView中使用時(shí)。
觀察你的布局
A ndroid SDK 工具箱包括一個(gè)稱作“ Hierarchy Viewer ”的工具,它允許你去在你的應(yīng)用程序運(yùn)行時(shí)分析
布局。 通過使用這個(gè)工具,能幫助你發(fā)現(xiàn)你的布局效率上的瓶頸問題。
“ Hierarchy Viewer ”工具允許你在已連接的設(shè)備或模擬器中選擇正在運(yùn)行的進(jìn)程,然后呈現(xiàn)出布局層次樹
(layout tree)。 每個(gè)正方塊下的交通燈(見下圖) --- 紅綠藍(lán)表現(xiàn)出了在測量(measure)、布局(layout)、以及繪制
(draw)過程中的效率值,這能 幫助你定位潛在的問題。
假設(shè)ListView 中的一項(xiàng)Item 存在如下(見圖 1)布局 :
圖1 :ListView某項(xiàng)Item的布局效果圖
“ Hierarchy Viewer ” 工具可以在 <sdk>/tools路徑下找到。當(dāng)打開它時(shí),“ Hierarchy Viewer ”工具顯示了
所有可用的 設(shè)備以及運(yùn)行在這些設(shè)備上的進(jìn)程。點(diǎn)擊”Load View Hierarchy”來顯示某個(gè)你選擇的組件的UI布局
層次。舉例來說,圖2 展現(xiàn)了圖1的布局層次樹。
圖2:使用LinearLayout的布局樹
在圖2中,你可以直觀看到這個(gè)三層的布局結(jié)構(gòu)是存在一些問題的。點(diǎn)擊項(xiàng)體現(xiàn)出了在每個(gè)測量(measure)、
布局(layout)、 以及繪制(draw)過程中的時(shí)間消耗(見圖3)。很明顯,該項(xiàng)(LinearLayout)花費(fèi)了最長的時(shí)間去
測量、布局、繪制,你應(yīng)該 花點(diǎn)精力去優(yōu)化它們。
圖3: 某個(gè)LinearLayout的繪制時(shí)間
完成該布局文件渲染的時(shí)間分別為:
測量過程:0.977ms
布局過程:0.167ms
繪制過程:2.717ms
修改布局文件
由于上圖中布局效率的低下是因?yàn)橐粋€(gè)內(nèi)嵌的LinearLayout控件,通過 扁平化布局文件 ----讓布局變得
更淺更寬, 而不是變得更窄更深層次 ,這樣就能提升效率了。 一個(gè)RelativeLayout作為根節(jié)點(diǎn)也能提供如上
的布局效果(即圖1)。 因此, 使用RelativeLayout改變布局的設(shè)計(jì),你可以看到現(xiàn)在我們的布局層次只有2層了。
新的布局層次樹如下:
圖4:使用RelativeLayout的布局樹
現(xiàn)在,完成該布局文件渲染的時(shí)間分別為:
測量過程:0.977ms
布局過程:0.167ms
繪制過程:2.717ms
也許它只是一點(diǎn)點(diǎn)微小的改進(jìn),但這次它會被多次調(diào)用,因?yàn)槭荓istView會布局所有的Item,累積起來,
改進(jìn)后效果 還是非??捎^地。
大部分的時(shí)間差異是由于使用了帶有l(wèi)ayout_weight屬性的LinearLayout,它能減緩測量過程的速度。這僅僅
是一個(gè)例子, 即每個(gè)布局都應(yīng)該合適地被使用以及你應(yīng)該認(rèn)真考慮是否有必要采用“l(fā)ayout_weight" 屬性。
使用Lint工具 ( 譯者注: ADT插件更新到最新的16.0后 的工具 )
關(guān)于Lint的使用更多請看: 《 Android Lint(官方代碼優(yōu)化利器) 》
一個(gè)好的實(shí)踐就是在你的布局文件中使用Lint工具去尋求可能優(yōu)化布局層次的方法。Lint已經(jīng)取代了Layoutopt
工具并且它提供了更強(qiáng)大的功能。一些Lint 規(guī)則 如下:
1、使用組合控件 --- 包含了一個(gè)ImageView以及一個(gè)TextView控件的LinearLayout如果能夠作為一個(gè)
組合控件將會 被更有效的處理。
關(guān)于這點(diǎn),更多請看 : http://stackoverflow.com/questions/8318765/how-do-i-use-a-compound-drawable-instead-of-a-linearlayout-that-contains-an-imag
2、合并作為根節(jié)點(diǎn)的幀布局(Framelayout) ---- 如果一個(gè)幀布局時(shí)布局文件中的根節(jié)點(diǎn),而且它沒有背景圖片
或者padding 等,更有效的方式是使用<merge />標(biāo)簽替換該< Framelayout />標(biāo)簽 。
關(guān)于這點(diǎn),更多請看 : <<android merge之布局>>
<<Android里merge和include標(biāo)簽的使用>>
3、無用的葉子節(jié)點(diǎn)----- 通常來說如果一個(gè)布局控件沒有子視圖或者背景圖片,那么該布局控件時(shí)可以被移除
(由于它處于 invisible狀態(tài))。
4、無用的父節(jié)點(diǎn) ----- 如果一個(gè)父視圖即有子視圖,但沒有兄弟視圖節(jié)點(diǎn),該視圖不是ScrollView控件或者
根節(jié)點(diǎn),并且它 沒有背景圖片,也是可以被移除的,移除之后,該父視圖的所有子視圖都直接遷移至之前父視圖
的布局層次。同樣能夠使 解析布局以及布局層次更有效。
5、過深的布局層次 ---- 內(nèi)嵌過多的布局總是低效率地。考慮使用一些扁平的布局控件,例如 RelativeLayout、
GridLayout,來改善布局過程 。默認(rèn)最大的布局深度為10 。
當(dāng)使用Eclipse環(huán)境開發(fā)時(shí),Lint能夠自動(dòng)解決一些問題,提供一些建議以及直接跳轉(zhuǎn)到出錯(cuò)的代碼中去核查。
如果你沒有 使用Eclipse,Lint也可以通過命令行的方式運(yùn)行。更多關(guān)于Lint的可用信息請參看:《 Android Lint 》
Hi ~~~
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
