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

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