佈局是一個App很是關鍵的一部分,佈局性能的好壞可直接影響到用戶的體驗。試想下若是一個RecyclerView
滑動時異常卡頓,那用戶估計也沒有心情去住下滑了,可能就直接強制殺掉App了去,而後回過頭去應用商店給個差評「卡的不要不要的」。雖然如今手機內存、CPU等各項性能都上來了看起來很強,實際上仍是卡的不行,因此咱們仍是要多學習下性能優化
方面的知識。java
本文將分三個部分來介紹Android佈局
優化的相關知識:android
優化佈局的層級是很是重要,你們都知道Android的佈局元素主可分爲View和ViewGroup,其餘LinearLayout、FrameLayout都是ViewGroup的子類。每一個View在顯示以前都會有測量(measure)
、佈局(layout)
、繪製(draw)
這三步,佈局層次越深相應的帶來的層級遍歷的消耗就越多。要優化佈局的層級可使用Layout Inspector
來分析某個View的測量、佈局、繪製所消耗的時間,幫助開發時定位佈局性能較差的點。性能優化
使用Layout Inspector
很是方便,只須要簡單的幾步就能使用:bash
Layout Inspector
分析完成就能夠查看各項數據了。以下圖所示Layout Inspector
的主界面可分爲三個部分:佈局
使用Layout Inspector
分析佈局層次後就能夠對佈局的層次作一些改動,如下是一些小技巧你們可參考優化佈局層級:性能
merge
標籤compound drawable
佈局重用是開發過程當中很是重要的一部分,這樣能減小多餘的佈局文件和維護成品。在Android中佈局重用可使用<include>
標籤,它能夠高效重用完整的佈局,好比有多個Activity中都有一個底部的Button
除了文字不一樣之外其他的樣式都基本相同,這樣只須要創建一個底部按鈕佈局文件,而後在Activity的佈局中經過<include>
標籤引用按鈕的佈局就能夠實現一個統一按鈕。學習
根據上面提到的例子新建一個layout_bottom_button.xml
的佈局文件:優化
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools"
android:background="@android:color/white"```
<include
layout="@layout/layout_bottom_button"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
>
<Button
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="5dp"
android:background="#36b7f7"
android:textColor="@android:color/white"
tools:text="下一步"
/>
</FrameLayout>
複製代碼
而後再創建一個新的佈局文件,使用<include>
標籤包含上面的佈局:spa
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<include layout="@layout/layout_bottom_button"/>
</FrameLayout>
複製代碼
只須要簡單幾步就能實現佈局的重用,同時還能夠從新覆蓋佈局參數:code
<include
layout="@layout/layout_bottom_button"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
複製代碼
須要注意的是,覆蓋佈局參數時必須要覆蓋layout_width
和layout_height
這兩個參數。
有些時候佈局會須要一些其它的View
,但它們不是一開始就顯示到界面上,好比進度條、提示消息等元素,它們只會在特色的場景下才會出現,相似這樣的場景可使用<ViewStub>
標籤來處理在須要的時候加載View
。
ViewStub
是一個輕量級的View
,它不會顯示到界面上,它只會在你須要的時候加載將佈局加載到佈局層次中。ViewStub
的使用很是簡單隻須要一個android:layout
屬性來指定須要替換的佈局文件就能夠了:
<ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import" android:layout="@layout/progress_overlay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" />
複製代碼
當你須要加載android:layout
指定的佈局文件時,只須要調用setVisibility(View.VISIBLE)
或inflate()
方法就能將ViewStub
替換成android:layout
指定的佈局:
findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
複製代碼
用setVisibility(View.VISIBLE)
或inflate()
方法後,ViewStub
將再也不是佈局層次中的一部分,它會被android:layout
指定的佈局文件替換掉。