日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Android中View繪制優(yōu)化之一---- 優(yōu)化布局層次

系統(tǒng) 2121 0

本文原創(chuàng), 轉(zhuǎn)載請(qǐng)注明出處 http://blog.csdn.net/qinjuning

前言,竟然是翻譯,當(dāng)然得弄的有板有眼。 照著大作家格式來(lái)咯 , - - 。



譯序



最近一直在做鎖屏界面,之前也寫過(guò)關(guān)于鎖屏界面的一些簡(jiǎn)單原理,未曾想自己真正去深入理解鎖屏?xí)r,才

發(fā)覺(jué)鎖屏框架 真是又大又復(fù)雜,主要體現(xiàn)在如下兩個(gè)方面:

1、界面的組成以及更新機(jī)制;

2、對(duì)電源管理的控制,在鎖屏界面會(huì)禁用系統(tǒng)的電源管理,自己接管屏幕亮度的控制。

當(dāng)然還有更多的邏輯細(xì)節(jié)處理,只能耐著性子去研究了。。

通過(guò)對(duì)本次鎖屏界面的處理,才發(fā)現(xiàn)自己對(duì)View繪制還是不熟透,很多東西也沒(méi)有去潛心研究,導(dǎo)致自己在

真正做 項(xiàng)目時(shí)候才手忙腳亂的。因此,借著這次機(jī)會(huì),也把 Android 4.0 developer 這些先進(jìn)的知識(shí)(山人一直

沉浸在Android 2.2中) 給過(guò)了一下,真是妙處多多。

開(kāi)頭: 為了避免歧義,先將Android “Layout”一次的意思進(jìn)行說(shuō)明,主要有如下三個(gè)方面:

1、統(tǒng)稱,即如何擺放UI,UI呈現(xiàn)效果等;

2、布局文件 ,即/res/layout/xxx.xml ;

3、布局過(guò)程 ,Android繪制過(guò)程中的 layout過(guò)程;

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 及它包含的工具都能幫助你定位在布局過(guò)程中隱藏的問(wèn)題,通過(guò)對(duì)

這些課程的學(xué)習(xí), 你能夠以很小的內(nèi)存代價(jià)去實(shí)現(xiàn)流暢的平滑界面。

課程如下:

1 、優(yōu)化布局層次

同樣地,一個(gè)復(fù)雜的網(wǎng)頁(yè)會(huì)延長(zhǎng)加載時(shí)間,你的布局層次如果太復(fù)雜也能引發(fā)一些效率問(wèn)題。本課程

告知你如何利用 SDK的工具去觀察你的布局以及發(fā)現(xiàn)布局過(guò)程的瓶頸問(wèn)題。

2、使用<include />標(biāo)簽復(fù)用布局文件

如果應(yīng)用程序的UI在多處重復(fù)某些布局結(jié)構(gòu),本課程向你展示如何創(chuàng)建高效、可重用的布局結(jié)構(gòu), 然后

以合適的 UI布局文件包含它們。

3、按需加載View視圖

除了簡(jiǎn)單地在另外的布局文件中包括一個(gè)布局組件,你可能想在需要的時(shí)候才將視圖顯現(xiàn)出來(lái),有的時(shí)候

是在 Activity運(yùn)行之后。本課程告訴你如何改進(jìn)布局初始化行為---- 按需加載布局文件的某個(gè)視圖。

4、如何使ListView流暢滑動(dòng)

如果你構(gòu)建了一個(gè)ListView實(shí)例呈現(xiàn)那些包含復(fù)雜或者大容量數(shù)據(jù)的列表項(xiàng),這可能會(huì)影響ListView的流暢

滑動(dòng)。 本課程提供了一些如何讓滑動(dòng)過(guò)程更加流暢的建議。

譯一 :


優(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)。舉例來(lái)說(shuō): 嵌入一個(gè)LinearLayout會(huì)產(chǎn)生一個(gè)太深的布局層次。更嚴(yán)重的是,嵌入幾個(gè)使

用layout_weight屬性的LinearLayout 將會(huì)導(dǎo)致大量的開(kāi)銷,因?yàn)槊總€(gè)子視圖都需要被測(cè)量?jī)纱巍_@是反復(fù)解析

布局文件時(shí)重要的一點(diǎn),例如在ListView或者 GridView中使用時(shí)。


觀察你的布局

A ndroid SDK 工具箱包括一個(gè)稱作“ Hierarchy Viewer ”的工具,它允許你去在你的應(yīng)用程序運(yùn)行時(shí)分析

布局。 通過(guò)使用這個(gè)工具,能幫助你發(fā)現(xiàn)你的布局效率上的瓶頸問(wèn)題。

Hierarchy Viewer ”工具允許你在已連接的設(shè)備或模擬器中選擇正在運(yùn)行的進(jìn)程,然后呈現(xiàn)出布局層次樹(shù)

(layout tree)。 每個(gè)正方塊下的交通燈(見(jiàn)下圖) --- 紅綠藍(lán)表現(xiàn)出了在測(cè)量(measure)、布局(layout)、以及繪制

(draw)過(guò)程中的效率值,這能 幫助你定位潛在的問(wèn)題。

假設(shè)ListView 中的一項(xiàng)Item 存在如下(見(jiàn)圖 1)布局 :


圖1 :ListView某項(xiàng)Item的布局效果圖


Hierarchy Viewer 工具可以在 <sdk>/tools路徑下找到。當(dāng)打開(kāi)它時(shí),“ Hierarchy Viewer ”工具顯示了

所有可用的 設(shè)備以及運(yùn)行在這些設(shè)備上的進(jìn)程。點(diǎn)擊”Load View Hierarchy”來(lái)顯示某個(gè)你選擇的組件的UI布局

層次。舉例來(lái)說(shuō),圖2 展現(xiàn)了圖1的布局層次樹(shù)。


Android中View繪制優(yōu)化之一---- 優(yōu)化布局層次

圖2:使用LinearLayout的布局樹(shù)


在圖2中,你可以直觀看到這個(gè)三層的布局結(jié)構(gòu)是存在一些問(wèn)題的。點(diǎn)擊項(xiàng)體現(xiàn)出了在每個(gè)測(cè)量(measure)、

布局(layout)、 以及繪制(draw)過(guò)程中的時(shí)間消耗(見(jiàn)圖3)。很明顯,該項(xiàng)(LinearLayout)花費(fèi)了最長(zhǎng)的時(shí)間去

測(cè)量、布局、繪制,你應(yīng)該 花點(diǎn)精力去優(yōu)化它們。


Android中View繪制優(yōu)化之一---- 優(yōu)化布局層次

圖3: 某個(gè)LinearLayout的繪制時(shí)間


完成該布局文件渲染的時(shí)間分別為:

測(cè)量過(guò)程:0.977ms

布局過(guò)程:0.167ms

繪制過(guò)程:2.717ms

修改布局文件

由于上圖中布局效率的低下是因?yàn)橐粋€(gè)內(nèi)嵌的LinearLayout控件,通過(guò) 扁平化布局文件 ----讓布局變得

更淺更寬, 而不是變得更窄更深層次 ,這樣就能提升效率了。 一個(gè)RelativeLayout作為根節(jié)點(diǎn)也能提供如上

的布局效果(即圖1)。 因此, 使用RelativeLayout改變布局的設(shè)計(jì),你可以看到現(xiàn)在我們的布局層次只有2層了。

新的布局層次樹(shù)如下:


Android中View繪制優(yōu)化之一---- 優(yōu)化布局層次

圖4:使用RelativeLayout的布局樹(shù)

現(xiàn)在,完成該布局文件渲染的時(shí)間分別為:

測(cè)量過(guò)程:0.977ms

布局過(guò)程:0.167ms

繪制過(guò)程:2.717ms

也許它只是一點(diǎn)點(diǎn)微小的改進(jìn),但這次它會(huì)被多次調(diào)用,因?yàn)槭荓istView會(huì)布局所有的Item,累積起來(lái),

改進(jìn)后效果 還是非常可觀地。


大部分的時(shí)間差異是由于使用了帶有l(wèi)ayout_weight屬性的LinearLayout,它能減緩測(cè)量過(guò)程的速度。這僅僅

是一個(gè)例子, 即每個(gè)布局都應(yīng)該合適地被使用以及你應(yīng)該認(rèn)真考慮是否有必要采用“l(fā)ayout_weight" 屬性。

使用Lint工具 ( 譯者注: ADT插件更新到最新的16.0后 的工具 )

關(guān)于Lint的使用更多請(qǐng)看: Android Lint(官方代碼優(yōu)化利器)

一個(gè)好的實(shí)踐就是在你的布局文件中使用Lint工具去尋求可能優(yōu)化布局層次的方法。Lint已經(jīng)取代了Layoutopt

工具并且它提供了更強(qiáng)大的功能。一些Lint 規(guī)則 如下:


1、使用組合控件 --- 包含了一個(gè)ImageView以及一個(gè)TextView控件的LinearLayout如果能夠作為一個(gè)

組合控件將會(huì) 被更有效的處理。

關(guān)于這點(diǎn),更多請(qǐng)看 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),而且它沒(méi)有背景圖片

或者padding 等,更有效的方式是使用<merge />標(biāo)簽替換該< Framelayout />標(biāo)簽 。


關(guān)于這點(diǎn),更多請(qǐng)看 : <<android merge之布局>>

<<Android里merge和include標(biāo)簽的使用>>

3、無(wú)用的葉子節(jié)點(diǎn)----- 通常來(lái)說(shuō)如果一個(gè)布局控件沒(méi)有子視圖或者背景圖片,那么該布局控件時(shí)可以被移除

(由于它處于 invisible狀態(tài))。

4、無(wú)用的父節(jié)點(diǎn) ----- 如果一個(gè)父視圖即有子視圖,但沒(méi)有兄弟視圖節(jié)點(diǎn),該視圖不是ScrollView控件或者

根節(jié)點(diǎn),并且它 沒(méi)有背景圖片,也是可以被移除的,移除之后,該父視圖的所有子視圖都直接遷移至之前父視圖

的布局層次。同樣能夠使 解析布局以及布局層次更有效。

5、過(guò)深的布局層次 ---- 內(nèi)嵌過(guò)多的布局總是低效率地。考慮使用一些扁平的布局控件,例如 RelativeLayout、

GridLayout,來(lái)改善布局過(guò)程 。默認(rèn)最大的布局深度為10 。

當(dāng)使用Eclipse環(huán)境開(kāi)發(fā)時(shí),Lint能夠自動(dòng)解決一些問(wèn)題,提供一些建議以及直接跳轉(zhuǎn)到出錯(cuò)的代碼中去核查。

如果你沒(méi)有 使用Eclipse,Lint也可以通過(guò)命令行的方式運(yùn)行。更多關(guān)于Lint的可用信息請(qǐng)參看:《 Android Lint

Hi ~~~



Android中View繪制優(yōu)化之一---- 優(yōu)化布局層次


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 天津市| 鹤山市| 田阳县| 汉沽区| 普洱| 绥江县| 隆林| 甘谷县| 柞水县| 湖州市| 湘潭市| 景宁| 丹阳市| 青田县| 婺源县| 上杭县| 胶州市| 德保县| 江源县| 镇康县| 瑞金市| 固安县| 祁东县| 宁河县| 新乡县| 黄浦区| 武宁县| 龙陵县| 米脂县| 榆社县| 宿松县| 陆丰市| 邵东县| 屏山县| 湖南省| 景宁| 平武县| 尉氏县| 新巴尔虎左旗| 阜新| 德格县|