做爲android應用來說,不管應用自己多麼美觀,功能多麼強大,內容多麼豐富。但若是App自己打開界面緩慢超過手機16ms刷新一次頁面的時間,就會產生卡頓。用戶體驗都會變得極差,致使用戶量減小。因此咱們在開發過程當中一樣要注重佈局優化。react
在Layout佈局中若是有你想要引用的佈局時,若該佈局在不一樣的佈局是公共佈局,咱們會屢次使用到。這時可使用標籤。而且便於統一的修改與查看。android
<-- 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解析和展現一個佈局須要消耗時間,佈局嵌套的越多,那麼解析起來也就越耗時,性能也就越差,所以咱們在編寫佈局文件時應該讓嵌套的層數越少越好。react-native
<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中則標籤就至關於相對佈局標籤。這樣就能夠省略一些沒必要要的佈局嵌套了。bash
標籤其實是一個輕量級的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,減小布局層級,但耦合性更強)。 | |
無需第一時間展現於界面上,在須要時加載 | 減小測量,繪製時間 | 該界面不須要第一時間展現給用戶,如網絡報錯界面,或用戶信息下拉界面,在該界面中,但第一時間不須要顯示給用戶時使用。 |
AndroidStudio上有一個神奇的功能,就是在Xml佈局中咱們能夠在design標籤下進行佈局可視化操做。可是該功能並不完善,屬於系統自動生成的一個佈局,反而會讓佈局內部凌亂不堪,難以讀懂,同時會形成卡頓,因此之前咱們都是用該界面進行預覽查看;而ConstraintLayout約束佈局這一新佈局,它反而支持佈局可視化操做,能夠把它比喻成一個可視化視圖操做佈局的RelativeLayout,ConstraintLayout是使用約束的方式來指定各個控件的位置和關係的。佈局內部不須要嵌套其餘佈局,就能夠完成你想要的界面出現。因此它能夠有效的避免佈局的嵌套,從而達到優化佈局的效果。由於使用太過複雜,想要深刻了解使用方法請點擊ConstraintLayout。佈局
系統在顯示沒一個視圖的時候,都要經理測量,佈局,繪製的過程。若是咱們的佈局嵌套層數太多,會致使額外的測量、佈局等,十分消耗系統資源,使UI卡頓,影響用戶體驗。因此要儘可能減小是圖書層級結構,避免沒必要要的佈局嵌套,使用更少嵌套的佈局方式。
查看文件的視圖樹,咱們可使用DDMS來查看。首先運行項目在真機或虛擬機上。然後再到tools中打開DDMS。這裏就不展開介紹了。
連接:https://www.jianshu.com/p/faf57bd030ee
閱讀更多