提高顯示布局文件的性能 1 - 優化布局層級
https://blog.csdn.net/kesenhoo/article/details/7378239
Optimizing Layout Hierarchies [優化Layout層級]
- 【Layout是Android程序影響用戶體驗最關鍵的一部分。如果布局文件不好會使得程序比較卡。SDK裏麵包含了一些工具用來幫助我們發現布局文件的性能問題】
- 【這裏有一個共同的誤區:使用基本的Layout結構是最有效的。但是,每一個添加到係統的組件都需要初始化,進行布局,繪製的過程。比如,使用在LinearLayout裏麵使用子組件會導致一個過於deep的層級結構。而且內嵌使用包含layout_weight屬性的LinearLayout會在繪製時花費昂貴的係統資源,因為每一個子組件都需要被測量兩次。在使用ListView與GridView的時候,這個問題顯的尤其重要,因為子組件會重複被創建】
這一課我們會學習使用Hierarchy Viewer andLint 來檢查並最優化布局文件。
Inspect Your Layout[查看Layout]
Android SDK裏麵包含了一個叫做Hierarchy Viewer的工具,在程序運行的時候分析布局文件,從而找住性能瓶頸
連接上設備,打開Hierarchy Viewer(定位到tools/目錄下,直接執行hierarchyviewer的命令,選定需要查看的Process,再點擊Load View Hierarchy會顯示出當前界麵的布局Tree。在每個模塊的Traffic light上有三個燈,分別代表了Measure, Layout and Draw三個步驟的性能。
Figure 1. ListView每個Item的常見布局.
Figure 2. 上麵顯示了對應與圖片1的布局層級信息.可以看到中間LinearLayout的Measure的燈是紅色的,這就是因為上麵說到的:使用內嵌layout_weight的屬性的LinearLayout會導致測量時花費了雙倍的時間。
Figure 3. 點擊某個模塊會顯示具體每個步驟所花費的時間。
Revise Your Layout [修改你的Layout]
【使得Layout寬而淺,而不是窄而深(在Hierarchy Viewer的Tree視圖裏麵體現)】
上麵的布局我們可以使用RelativeLayout來替代LinearLayout,從而實現shallow and wide.
Figure 4. 改用RelativeLayout來實現圖片1的布局。
可以看到這是一個小的優化,可是這帶來的效果是明顯的,因為在ListView裏麵會出現很多這樣的布局。
導致前麵的case會出現花費時間比較多的願意是使用了layout_weight在LinearLayout。我們需要仔細評估到底是否需要使用那樣的
布局,盡量避免使用layout_weight。
Use Lint [使用Lint]
Lint是一款在ADT 16才出現用來替代layoutopt的新型工具,具有更強大的功能。
Lint的使用規則如下:
-
Use compound drawables - A
LinearLayout
which contains anImageView
and aTextView
can be more efficiently handled as a compound drawable. -
【使用compound drawables - 一個包含了ImageView與TextView的LinearLayout可以被當作一個compound drawable來處理】
-
Merge root frame - If a
FrameLayout
is the root of a layout and does not provide background or padding etc, it can be replaced with a merge tag which is slightly more efficient. - 【使用merge根框架 - 如果FramLayout僅僅是一個純粹的(沒有設置背景,間距等)布局根元素,我們可以使用merge標簽來當作根標簽】
- Useless leaf - A layout that has no children or no background can often be removed (since it is invisible) for a flatter and more efficient layout hierarchy.
- 【無用的分支 - 如果一個layout並沒有任何子組件,那麼可以被移除,這樣可以提高效率】
-
Useless parent - A layout with children that has no siblings, is not a
ScrollView
or a root layout, and does not have a background, can be removed and have its children moved directly into the parent for a flatter and more efficient layout hierarchy. - 【無用的父控件 - 如果一個layout隻有子控件,沒有兄弟控件,並且不是一個ScrollView或者根節點,而且沒有設置背景,那麼我們可以移除這個父控件,直接把子控件提升為父控件】
-
Deep layouts - Layouts with too much nesting are bad for performance. Consider using flatter layouts such as
RelativeLayout
orGridLayout
to improve performance. The default maximum depth is 10. -
【深層次的layout - 盡量減少內嵌的層級,考慮使用更多平級的組件
RelativeLayout
orGridLayout來提升布局性能,默認最大的深度是10
】

Eclipse會自動運行Lint的工具,並給出相應的提醒,不管是在導出APK,編輯,保存XML還是在使用layout編輯器的時候。如果想
強製運行,請參看上麵的圖標,點擊運行。
如果沒有安裝ADT 16,需要在命令行中執行。
最後更新:2017-04-04 07:03:06