合理的布局能夠在提高性能的同時,簡化邏輯的復雜度。
目標
在滿足需求的情況下,使用最少的層次結構來構建布局,同時避免在過度重繪模式下出現(xiàn)粉紅色和紅色。
方法
布局優(yōu)化的方式有很多,下面我們進行一一介紹:
刪除不必要的背景
對于一款APP而言,UI通常會給出一個UI標準,其中包括頁面默認背景,進入/退出動畫等,所以我們可以在主題中設置Activity的背景,這樣可避免在布局文件中設置背景。
PS:當然,將主題的背景設置為透明,在布局文件中設置背景也可較少重繪次數(shù),但是這種方案在低端機上可能出現(xiàn)頁面切換時可看到桌面的情況。
減少布局的層次結構
多使用RelativeLayout。雖然LinearLayout比較好用,但是局限性也比較大,實現(xiàn)復雜的布局需要嵌套多層結構才可實現(xiàn)。所以對于非線性的布局,都推薦使用RelativeLayout來實現(xiàn),同時應盡可能避免RelativeLayout的嵌套。
使用RelativeLayout的時候需要注意,由于元素之間采用的是相對位置,所以作為被依賴的元素,一定不能在代碼中使用GONE來隱藏處理,而應該使用不常用的INVISIBLE來實現(xiàn)隱藏。INVISIBLE與GONE的區(qū)別是INVISIBLE雖然隱藏了,但依然占據(jù)空間。
當然,還有更強大的布局容器——ConstraintLayout, 這是Google 2016年I/O大會上提出的一個可靈活控制子View的位置和大小的容器,可以說集LinearLayout和RelativeLayout的優(yōu)點于一身,使用一層結構也可實現(xiàn)復雜的布局,真正做到了扁平化。這也是Google推薦的布局容器,Android Studio2.3之后創(chuàng)建的布局默認容器就是它。
簡化動畫
在APP的開發(fā)中,為了提高用戶的體驗,UI通常會要求添加一些動畫,但是有些動畫需要多層布局來實現(xiàn)。這時可和UI協(xié)商是否可簡化動畫,以減少布局層次。在需要動畫的布局中使用FrameLayout是一個不錯的選擇,畢竟Material Design的核心就是層次化的布局結構。
match_parent與wrap_content:
在寫布局文件時,有些情況下match_parent與wrap_content都可實現(xiàn)需求,這時可優(yōu)先使用match_parent,熟悉View的measure就會知道,match_parent的實現(xiàn)邏輯比wrap_content要簡單很多。
使用< merge >標簽
使用標簽合并布局。有幾點需要注意:
標簽必須是根節(jié)點,否則會拋出InflateException異常;
所代替的標簽不需要設置padding,backgound,gravity等屬性,否則合并后無法實現(xiàn)相應的需求;
代替的標簽和包含的標簽應相同,否則布局合并后將會顯示異常。比如標簽代替的是LinearLayout,那么include這個布局的也應該為LinearLayout,這樣布局才能正常顯示。
main.xml
<LinearLayout ...>
<include layout="@layout/item_layout">
</LinearLayout>
item_layout.xml
<LinearLayout ...>
<TextView ...>
<TextView ...>
</LinearLayout>
此時可使用標簽對布局進行簡化:
<merge>
<TextView ...>
<TextView ...>
</merge>
使用標簽
使用ViewStub延遲加載布局。在開發(fā)過程中,有些布局需要在點擊時才出現(xiàn),這時就可采用ViewStub來延遲加載,以提高布局的渲染速度。
使用標簽
標簽只是用于布局復用,從而簡化布局的視覺效果,方便后期維護,對于性能方面幾乎沒什么影響。所以這個標簽只是提一下,復用布局時可使用。
建議
編寫布局文件時多思考,選擇合適的Layout進行布局,以盡可能減少布局層次;
多使用Lint工具進行檢查,Lint工具可對布局提出很多中肯的建議,包括多余的層次,硬編碼等;
布局寫好之后打開開發(fā)者模式下的“顯示過渡重繪區(qū)域”開關,檢查布局的重繪情況,以便于進一步的優(yōu)化;
使用Hierarchy分析布局結構。Android Studio->Tools->Android->Android Device Monitor->Window->Open Perspective->選擇Hierarchy View確定即可打開Hierarchy窗口。需要注意的是:Hierarchy只能在開發(fā)版的手機上使用。
總結
靈活使用上面提到的幾種優(yōu)化方式,在開發(fā)過程中,基本上所有的布局都可在顯示過渡重繪區(qū)域的情況下避免出現(xiàn)紅色,甚至是粉紅色。