作為android應用來講,無論應用本身多麼美觀,功能多麼強大,內容多麼豐富。但如果App本身開啟介面緩慢超過手機16ms重新整理一次頁面的時間,就會產生卡頓。使用者體驗都會變得極差,導致使用者量減少。所以我們在開發過程中同樣要注重佈局優化。
標籤
在Layout佈局中如果有你想要引用的佈局時,若該佈局在不同的佈局是公共佈局,我們會多次使用到。這時可以使用標籤。並且便於統一的修改與檢視。
<-- container為引用佈局的佈局id -->
<include layout="@layout/container"/>
複製程式碼
非常簡單隻要在你所需要放置該佈局的佈局內部使用標籤引入該佈局就可以了。 在標籤當中,我們是可以覆寫所有layout屬性的,即include中指定的layout屬性將會覆蓋掉。如我們想修改它的寬高為wrap_content。
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/container" />
複製程式碼
除了layout_width與layout_height之外,我們還可以覆寫container中的任何一個layout屬性,如layout_gravity、layout_margin等,而非layout屬性則無法在標籤當中進行覆寫。另外需要注意的是,如果我們想要在標籤當中覆寫layout屬性,必須要將layout_width和layout_height這兩個屬性也進行覆寫,否則覆寫效果將不會生效。
標籤
標籤是作為標籤的一種輔助擴充套件來使用的,它的主要作用是為了防止在引用佈局檔案時產生多餘的佈局巢狀。Android解析和展示一個佈局需要消耗時間,佈局巢狀的越多,那麼解析起來也就越耗時,效能也就越差,因此我們在編寫佈局檔案時應該讓巢狀的層數越少越好。
<merge
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<View
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<View
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</merge>
複製程式碼
大家可以見到標籤的使用方法是直接當做該佈局的根佈局節點使用,而當在其他位置需要引用該佈局時,則使用標籤進行引用,同時該節點會同步變成父容器的根節點。比如你使用在LinearLayout中則兩個view線性排列,而在RelativeLayout中則標籤就相當於相對佈局標籤。這樣就可以省略一些不必要的佈局巢狀了。
標籤
標籤實際上是一個輕量級的View,它既沒有尺寸,也不會繪製任何東西,所以將它放置在佈局當中基本可以認為是完全不會影響效能的。只要在需要的時候顯示它,才會進行載入。
<ViewStub
android:id="@+id/stub"
android:inflatedId="@+id/container_layout"
android:layout="@layout/stub_layout"
android:layout_width=",match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
複製程式碼
雖然ViewStub是不佔用任何空間的,但是每個佈局都必須要指定layout_width和layout_height屬性,否則執行就會報錯。且ViewStub所要替代的layout檔案中不能含有標籤,所以使用前需要構思好介面佈局,以免不必要的巢狀。一旦ViewStub被顯示後,則ViewStub將從檢視框架中移除,其id也會失效,此時findViewById()得到的也是空的。
ViewStub使用起來非常簡單,只要在需要的時候findViewById()招到它並呼叫setVisibility(View.VISIBLE)或者inflate()顯示它就可以了。
標籤小結
標籤 | 使用原因 | 優化結果 | 使用舉例 |
---|---|---|---|
提取公共部分,提高佈局複用性 | 減少測量,繪製時間 | App中有多個UI介面需要使用同一佈局或部分佈局時。如頁面標題toolBar複用時使用。 | |
佈局層級減少 | 減少繪製工作量 | 當所需要複用的部分佈局與要合併到的佈局的根標籤一致時使用。(類似加強版include,減少佈局層級,但耦合性更強)。 | |
無需第一時間展示於介面上,在需要時載入 | 減少測量,繪製時間 | 該介面不需要第一時間展示給使用者,如網路報錯介面,或使用者資訊下拉介面,在該介面中,但第一時間不需要顯示給使用者時使用。 |
ConstraintLayout約束佈局
AndroidStudio上有一個神奇的功能,就是在Xml佈局中我們可以在design標籤下進行佈局視覺化操作。但是該功能並不完善,屬於系統自動生成的一個佈局,反而會讓佈局內部凌亂不堪,難以讀懂,同時會造成卡頓,所以以前我們都是用該介面進行預覽檢視;而ConstraintLayout約束佈局這一新佈局,它反而支援佈局視覺化操作,可以把它比喻成一個視覺化檢視操作佈局的RelativeLayout,ConstraintLayout是使用約束的方式來指定各個控制元件的位置和關係的。佈局內部不需要巢狀其他佈局,就可以完成你想要的介面出現。所以它可以有效的避免佈局的巢狀,從而達到優化佈局的效果。因為使用太過複雜,想要深入瞭解使用方法請點選ConstraintLayout。
減少檢視樹層級結構
系統在顯示沒一個檢視的時候,都要經理測量,佈局,繪製的過程。如果我們的佈局巢狀層數太多,會導致額外的測量、佈局等,十分消耗系統資源,使UI卡頓,影響使用者體驗。所以要儘量減少是圖書層級結構,避免不必要的佈局巢狀,使用更少巢狀的佈局方式。
檢視檔案的檢視樹,我們可以使用DDMS來檢視。首先執行專案在真機或虛擬機器上。而後再到tools中開啟DDMS。這裡就不展開介紹了。
其他
- 巢狀的LinearLayout中,儘量不要使用weight,因為weight會重新測量兩次。
- Layout的選擇,以儘量減少View樹的層級為主,去除不必要的巢狀和View節點。比如如果LinearLayout巢狀過多,建議使用RelativeLayout減少佈局巢狀。
- RelativeLayout本身儘量不要巢狀使用。
- View檢視的隱藏與現實,儘量使用invisible。因為gone,不佔用空間,檢視會重新測量繪製;而invisible檢視不會重新繪製,但仍然佔用空間位置。
- 佈局調優工具:hierarchy viewer,Lint tool
連結:https://www.jianshu.com/p/faf57bd030ee
閱讀更多