androidUI開發之-優化你的佈局層次結構
阿新 • • 發佈:2018-12-23
- 我們可能有一個共同的誤區:那就是認為使用基本的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三個步驟的效能。
Revise Your Layout (校訂你的Layout)
Use Lint (使用Lint)
Lint是一款在ADT 16才出現用來替代layoutopt的新型工具,具有更強大的功能。- 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 - 儘量減少內嵌的層級,考慮使用更多平級的元件】