android應用程式最佳化之布局最佳化
在我們開發APP時不僅要在代碼實現上,做到對App的最佳化,而在我們的介面布局也有許多要最佳化的地方,如果布局寫的很low的話,系統載入布局的速度會十分的慢,使得使用者的體驗非常的不好,這篇文章主要是從我平時對布局的最佳化方面總結一下,我認為經常可以用到的布局最佳化方面的一些技巧和手段。
1.減少布局的嵌套,這一點也是最重要的
搞android的都知道,android的整個UI布局檔案最後也是要一層一層的解析成View對象的,如果層次太深的話,對導致遞迴的層次太深而極大的影響解析速度,所以,我們一定不能讓布局檔案的層次太深,要想做到布局檔案的層次不深,通常用到的手段有:1)使用RelativeLayout代替LinearLayout。2)編寫完布局檔案時,可以使用HieracyView工具檢查是否有多餘的無用布局,如果有,則一定要去掉無用的布局。
2.布局重用。
一些可以公用的布局我們不必要每次都重寫一遍,可以將其寫為一個獨立的布局檔案,最後使用include標籤將布局引用即可,然而,嚴格上來講,布局重用只是減少了我們代碼的編寫量,並不能達到對應用的最佳化作用,而且,在使用include時會很容易產生第一點中的無用父布局,如:
如何去除使用include代來的負作用,下面會有方案。
3.使用merge標籤去消除include標籤所引入的無用布局
使用merge時要注意,merge標籤只能是根布局,結合2,3兩點看一個樣本用法:
首先,建立一個merge標籤的根布局,代碼如下:
?xml version="1.0" encoding="utf-8"?>
接著,使用include引入布局:
4.利用 ViewStub消極式載入一些用不到的布局,在一些場合取代android:visibility="gone"的用法,因為被gone掉的布局不斷是會同時建立對象的。那為什麼使用ViewStub就高效呢,拿源碼來說話,先看一下ViewStub源碼:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(0, 0); }
@Override
public void draw(Canvas canvas) {
}
由onMeasure()方法和draw()方法可以看出, ViewStub的初始寬高都是零,所以他開始不會佔用空間,其次draw()方法也沒有執行任何的繪製,由這兩個方法就可以看出,ViewStub的確很高效。
在代碼中要操縱ViewStub的時候,要首先使用viewstub.inflate()方法,將其所擁有的View初始化進去。否則會報null 指標錯誤。
5.減少不同層間的背景重繪,例如,如果某個view父布局的背景已經設定為了白色,則不需要再為此view設定背景色,通過這個簡單的小技巧,可以非常多的提升速度。
6.如果整個App都使用了自訂的Title和background,則我們可以使用自訂的style,永久的去掉系統預設為我們的Activity所添加的title和background,也可以提高Activity的渲染速度。