閱讀969 返回首頁    go 阿裏雲 go 技術社區[雲棲]


提高顯示布局文件的性能 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 an ImageView and a TextView 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 or GridLayout to improve performance. The default maximum depth is 10.
  • 【深層次的layout - 盡量減少內嵌的層級,考慮使用更多平級的組件 RelativeLayout or GridLayout來提升布局性能,默認最大的深度是10


Eclipse會自動運行Lint的工具,並給出相應的提醒,不管是在導出APK,編輯,保存XML還是在使用layout編輯器的時候。如果想

強製運行,請參看上麵的圖標,點擊運行

如果沒有安裝ADT 16,需要在命令行中執行。


最後更新:2017-04-04 07:03:06

  上一篇:go 中國互聯網的十二月大災變
  下一篇:go 高效地顯示Bitmap圖片 4 - 使用ViewPager與GridView顯示圖片