1. 程式人生 > >androidUI開發之-優化你的佈局層次結構

androidUI開發之-優化你的佈局層次結構

  • 我們可能有一個共同的誤區:那就是認為使用基本的Layout結構是最有效的。但是,每一個新增到系統的元件都需要初始化,進行佈局,繪製的過程。比如,使用在LinearLayout裡面使用子元件會導致一個過於deep的層級結構。而且內嵌使用包含layout_weight屬性的LinearLayout會在繪製時花費昂貴的系統資源,因為每一個子元件都需要被測量兩次。在使用ListView與GridView的時候,這個問題顯的尤其重要,因為子元件會重複被建立

Inspect Your 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.


可以看到這是一個小的優化,可是這帶來的效果是明顯的,因為在ListView裡面會出現很多這樣的佈局。

導致前面的case會出現花費時間比較多的願意是使用了layout_weight在LinearLayout。我們需要仔細評估到底是否需要使用那樣的

佈局,儘量避免使用layout_weight。

Use Lint (使用Lint)

Lint是一款在ADT 16才出現用來替代layoutopt的新型工具,具有更強大的功能。


Lint的使用規則如下:

  • Use compound drawables - A  which contains an  and a  can be more efficientlyhandled as a compound drawable.
  • 【使用compound drawables - 一個包含了ImageView與TextView的LinearLayout可以被當作一個compound drawable來處理】
  • Merge root frame - If a  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  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 efficientlayout hierarchy.
  • 【無用的父控制元件 - 如果一個layout只有子控制元件,沒有兄弟控制元件,並且不是一個ScrollView或者根節點,而且沒有設定背景,那麼我們可以移除這個父控制元件,直接把子控制元件提升為父控制元件】
  • Deep layouts - Layouts with too much nesting are bad for performance. Consider using flatter layouts such as  or  to improve performance. The default maximum depth is 10.
  • 【深層次的layout - 儘量減少內嵌的層級,考慮使用更多平級的元件】

在Eclipse裡面使用lint時候,lint會自動解決一些bug並且對其它一些問題給出相應的建議同時跳轉到程式碼相應的地方讓我們可以查閱程式碼。如果沒有使用eclipse開發,那麼你也可以從命令列裡面去啟動lint。具體情況可以參看“http://tools.android.com/tips/lint”。

原文詳見: http://developer.android.com/training/improving-layouts/optimizing-layout.html