Android中佈局優化能讓咱們的界面繪製時間減小,用戶感知到的卡頓時間也短,體驗感天然而然也就上去了,Android中的佈局優化能夠從多個方面來入手,include,merge,ViewStub等等一些方面。php
咱們日常在畫布局的時候常常碰到一些重複的共性佈局,好比說標題欄,導航欄之類的,或者一些按鈕之類的,咱們在使用的時候重複的寫很是麻煩,增長了咱們工做量,使用include標籤咱們就能夠避免去寫那些無聊的共性代碼,其實這個include單獨來說和咱們這一篇文章沒什麼關係,可是他結合merge使用就能夠減小一層ViewGroup的包裹,這一個咱們在merge中去講,下面貼出include的用法。java
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">
<include android:layout_width="match_parent" android:layout_height="50dp" layout="@layout/base_title_bar"/>
</LinearLayout>
複製代碼
merge的存在乎義就是爲告終合include來減小include引用過來的文件的外層ViewGroup,說白了就是用merge替代ViewGroup,雖然咱們使用merge結合include能夠達到減小繪製一層ViewGroup的效果,merge的佈局是取決於父佈局的,父佈局是什麼,他就是什麼,或者咱們能夠這麼理解,下面的代碼咱們就至關於將base_title_bar.xml中的兩個textview直接寫入到LinearLayout中,可是這裏有個問題,咱們的代碼有時候include的xml與父佈局所要的樣式是不同的,就好比咱們當前引入的titlebar是要橫向的,可是父佈局是縱向的,這時候咱們又得去給include外層再加上一層ViewGroup,因此咱們在使用merge與include結合的時候要考慮清楚咱們共性佈局之後可能會使用的場景。android
base_title_bar.xml工具
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="out" android:textSize="18sp" />
<TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Title" android:textSize="18sp" />
</merge>
複製代碼
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">
<include android:layout_width="match_parent" android:layout_height="50dp" layout="@layout/base_title_bar"/>
</LinearLayout>
複製代碼
ViewStub咱們稱之爲懶加載,須要用到的時候就加載它,可是這裏會有一個坑須要注意一下,就是ViewStub在顯示以後就沒法再隱藏了,由於ViewStub在顯示的時候會將本身remove掉,替換成設置的view,這裏咱們只要記住ViewStub的做用就是一次性的按需加載就好了。咱們使用到它的時候再按需加載,達到view在有須要的時候再渲染,以優化性能,下面是使用方法;佈局
坑點:ViewStub中的inflate()只能調用一次,調用屢次會報錯性能
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">
<ViewStub android:id="@+id/viewstub" android:layout_width="match_parent" android:layout_height="50dp" android:layout="@layout/base_title_bar" />
</LinearLayout>
複製代碼
viewStub = (ViewStub) findViewById(R.id.viewstub);
//第一種,直接顯示,不獲取到view
if (viewStub != null) {
viewStub.setVisibility(View.VISIBLE);
}
//第二種,顯示,而且獲取到view
if (viewStub != null) {
View view = viewStub.inflate();//獲取到的是咱們要顯示出來的view
}
複製代碼
一些其餘的優化方式就是一些細節了,須要咱們平時畫界面的時候本身多注意注意,而且養成習慣優化
1.子控件若是和父控件是一樣的背景色時,子控件不須要再設定背景色了,用父控件的(能蹭一點是一點)。spa
2.儘可能減小沒必要要的嵌套,咱們上面的include+merge的方式只是其中一種方式,咱們平時畫界面的時候仍是得多注意一下能減小嵌套就減小嵌套(省着點用有限的資源)code
3.能用LinearLayout與FrameLayout的時候就不用RelativeLayout,畢竟RelativeLayout控件比LinearLayout與FrameLayout等複雜.xml
4.合理的藉助工具來分析界面是否過分繪製,而且進行合理的避免