Android 性能優化之布局優化

一、思路

  • 布局優化的思路簡單來說就是盡量減少布局文件的層級,層級減少了也就意味著 Android 繪制時的工作量少了,那么程序的性能自然也就提高了。

二、優化策略

2.1 選擇性能較高的 ViewGroup
  • RelativeLayout 和 LinearLayout 同時存在的話,優先選擇 LinearLayout ,因為 RelativeLayout 的功能比較復雜,布局過程中需要耗費更過的 CPU 的時間,當然,還得需要根據產品需求來決定,如果需要嵌套好幾個 LinearLayout 來實現效果的話,那還是用 RelativeLayout 來實現,盡量減少層級關系
2.2 <include> 標簽
  • 此標簽主要適用于布局重用,提高效率,并且使代碼看起來更整潔

  • 此標簽只支持 android:layout_ 開頭的屬性

  • 如果此標簽指定了 android:layout_* 屬性,那么必須要有 android:layout_width 和 android:layout_height 屬性,否則其他的 android:layout_ 屬性不生效。

  • 還有個 id 屬性比較特殊,如果此標簽使用了 id 屬性,那么被包含的布局文件的根布局以此 id 屬性為準

2.3 <merge> 標簽
  • 此標簽主要是和 include 標簽配合使用的,主要是為了刪減多余的層級,例如你的主布局文件是垂直布局,引入了一個垂直布局的 include ,這是如果 include 布局使用的 LinearLayout 就沒意義了,使用的話反而減慢你的 UI 表現。這時可以使用 <merge> 來代替 include 布局中的 LinearLayout
2.4 ViewStub
  • ViewStub 繼承自 View ,是一個非常輕量級的控件,寬高都為 0,并且不參與任何布局和繪制過程,往往用于實現View的延遲加載,避免資源的浪費,減少渲染時間。

  • ViewStub 的意義在于按需加載的布局文件,但是使用場景有限,在選擇顯示的時候只能控制一次,而無法做多次的顯示或隱藏操作。因為 ViewStub 只能 Inflate 一次,之后會被置空,所以無法指望后面接著使用 ViewStub 來控制布局。

  • ViewStub 只能通過 findViewById 找到一次,找到之后就會被填充的布局所替代

  • 示例:

<ViewStub
    android:id="@+id/stub_import"
    android:inflatedId="@+id/panel_import"
    android:layout="@layout/progress_overlay"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom" />
  • android:inflatedId="@+id/panel_import" 表示重寫包含的 layout 布局文件的根容器 id

  • android:layout="@layout/progress_overlay" 表示引入的布局

  • 注意,ViewStub 控制的是一個布局,而不是某個控件,關于布局的一些屬性,盡量寫在 ViewStub 標簽下,否則可能會不生效

  • 想要該布局顯示的方式有兩種:

viewStub.setVisible(View.visible)
或者
viewStub.inflate()
  • 另外,ViewStub 不支持 <merge> 標簽
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容