本期迭代的任務(wù)是改善過度繪制和優(yōu)化布局嵌套。
首先檢查項目中是否存在過渡繪制的頁面,并減少過渡繪制。
再查看當(dāng)前App的布局嵌套,學(xué)習(xí)使用merge標(biāo)簽降低布局的層級
什么是過度繪制?
簡單來講,過度繪制是指像素點重復(fù)繪制了多次。我們可以打開手機或者模擬器的開發(fā)者選項,來查看當(dāng)前應(yīng)用程序是否存在過度繪制。這時我們可以看到屏幕出現(xiàn)多種顏色。
不同顏色代表含義(無色:無過度繪制,即該像素點只繪制1次;藍(lán)色:1x過度繪制,即該像素點繪制了2次;綠色:2x過度繪制;淺紅:3x過度繪制;紅色:4x過度繪制)
一般項目的驗收標(biāo)準(zhǔn)是:不允許出現(xiàn)黑色像素;不允許存在4x過度繪制;不允許存在面積超過屏幕1/4區(qū)域的3x過度繪制(淡紅色區(qū)域)
布局層級這么復(fù)雜,我們要如何找到多余的布局并將其優(yōu)化掉呢?下面來介紹一個小工具(作用于靜態(tài)的Activity,筆者在嵌套fragment的Activity中嘗試執(zhí)行失敗)
Scalpel
Scalpel是由JakeWharton大神開源的一個Android項目,用于分析解剖Android程序的界面布局并展現(xiàn)出3D效果。Scalpel使用非常簡單,只要將ScalpelFrameLayout作為根布局即可。
第一步:在Gradle中引入Scalpel
api 'com.jakewharton.scalpel:scalpel:1.1.2'
第二步:在需要觀察3D布局的activity布局文件中,將ScalpelFrameLayout作為根布局
<com.jakewharton.scalpel.ScalpelFrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.jakewharton.scalpel.ScalpelFrameLayout>
第三步:在Activity的onCreate里,添加如下代碼
ScalpelFrameLayout scalpelFrameLayout = new ScalpelFrameLayout(this);
View view = LayoutInflater.from(this).inflate(R.layout.sample_activity, null);
scalpelFrameLayout.addView(view);
setContentView(scalpelFrameLayout);
//以下可選
//是否顯示3D布局
scalpelFrameLayout.setLayerInteractionEnabled(true);
//是否顯示view的布局
scalpelFrameLayout.setDrawViews(true);
//是否顯示view的ID
scalpelFrameLayout.setDrawIds(true);
//設(shè)置布局邊框的顏色
scalpelFrameLayout.setChromeColor(0xff00ff00);
//設(shè)置布局邊框的陰影顏色
scalpelFrameLayout.setChromeShadowColor(0xff0000ff);
下面以簡單的登陸頁面為例,看看工具的使用效果:


如圖所示,我們現(xiàn)在是有6層布局,有的看上去明顯是不需要繪制的,那么我們來分析一下,怎么去掉多余的繪制呢。
首先,自己代碼中找到兩層多余的繪制


再者,系統(tǒng)自帶一層繪制,我們將那層繪制去掉,可以讓全部的頁面減少一層繪制。
getWindow().setBackgroundDrawable(null);
除了去除多余的背景色之后,我們來看看效果。

如何查看布局嵌套
AS自帶的開發(fā)工具Layout Inspector可以查看每個頁面的Component Tree。
(具體用法網(wǎng)上有很多優(yōu)秀的文檔,我不贅述。)
通過這個工具,我們可以看到系統(tǒng)的層級,以及我們自己代碼中,是否存在多余層級。


對于嵌套復(fù)雜的布局可以使用 include、merge進行優(yōu)化
merge的作用
merge標(biāo)簽是作為include標(biāo)簽的一種輔助擴展來使用的,它的主要作用是為了防止在引用布局文件時產(chǎn)生多余的布局嵌套。大家都知道,Android去解析和展示一個布局是需要消耗時間的,布局嵌套的越多,那么解析起來就越耗時,性能也就越差,因此我們在編寫布局文件時應(yīng)該讓嵌套的層數(shù)越少越好。
merge的用法
merge標(biāo)簽只能作為根布局存在,通過include標(biāo)簽放到相應(yīng)的布局位置,這樣merge就能讓頁面直接繼承父布局,減少一層布局嵌套。


去除了LinearLayout


(優(yōu)化后的頁面開了開發(fā)者模式里過度繪制檢查的代碼)