本期迭代的任務(wù)是改善過度繪制和優(yōu)化布局嵌套暂题。
首先檢查項(xiàng)目中是否存在過渡繪制的頁面桐玻,并減少過渡繪制简识。
再查看當(dāng)前App的布局嵌套拔妥,學(xué)習(xí)使用merge標(biāo)簽降低布局的層級(jí)
什么是過度繪制忿危?
簡(jiǎn)單來講,過度繪制是指像素點(diǎn)重復(fù)繪制了多次没龙。我們可以打開手機(jī)或者模擬器的開發(fā)者選項(xiàng)铺厨,來查看當(dāng)前應(yīng)用程序是否存在過度繪制缎玫。這時(shí)我們可以看到屏幕出現(xiàn)多種顏色。
不同顏色代表含義(無色:無過度繪制解滓,即該像素點(diǎn)只繪制1次赃磨;藍(lán)色:1x過度繪制,即該像素點(diǎn)繪制了2次洼裤;綠色:2x過度繪制邻辉;淺紅:3x過度繪制;紅色:4x過度繪制)
一般項(xiàng)目的驗(yàn)收標(biāo)準(zhǔn)是:不允許出現(xiàn)黑色像素腮鞍;不允許存在4x過度繪制值骇;不允許存在面積超過屏幕1/4區(qū)域的3x過度繪制(淡紅色區(qū)域)
布局層級(jí)這么復(fù)雜,我們要如何找到多余的布局并將其優(yōu)化掉呢移国?下面來介紹一個(gè)小工具(作用于靜態(tài)的Activity吱瘩,筆者在嵌套fragment的Activity中嘗試執(zhí)行失敗)
Scalpel
Scalpel是由JakeWharton大神開源的一個(gè)Android項(xiàng)目桥狡,用于分析解剖Android程序的界面布局并展現(xiàn)出3D效果搅裙。Scalpel使用非常簡(jiǎn)單,只要將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);
下面以簡(jiǎn)單的登陸頁面為例嫂易,看看工具的使用效果:
如圖所示兄朋,我們現(xiàn)在是有6層布局,有的看上去明顯是不需要繪制的怜械,那么我們來分析一下颅和,怎么去掉多余的繪制呢。
首先缕允,自己代碼中找到兩層多余的繪制
再者峡扩,系統(tǒng)自帶一層繪制,我們將那層繪制去掉障本,可以讓全部的頁面減少一層繪制教届。
getWindow().setBackgroundDrawable(null);
除了去除多余的背景色之后,我們來看看效果驾霜。
如何查看布局嵌套
AS自帶的開發(fā)工具Layout Inspector可以查看每個(gè)頁面的Component Tree案训。
(具體用法網(wǎng)上有很多優(yōu)秀的文檔,我不贅述粪糙。)
通過這個(gè)工具强霎,我們可以看到系統(tǒng)的層級(jí),以及我們自己代碼中蓉冈,是否存在多余層級(jí)城舞。
對(duì)于嵌套復(fù)雜的布局可以使用 include轩触、merge進(jìn)行優(yōu)化
merge的作用
merge標(biāo)簽是作為include標(biāo)簽的一種輔助擴(kuò)展來使用的,它的主要作用是為了防止在引用布局文件時(shí)產(chǎn)生多余的布局嵌套椿争。大家都知道怕膛,Android去解析和展示一個(gè)布局是需要消耗時(shí)間的,布局嵌套的越多秦踪,那么解析起來就越耗時(shí)褐捻,性能也就越差,因此我們?cè)诰帉懖季治募r(shí)應(yīng)該讓嵌套的層數(shù)越少越好椅邓。
merge的用法
merge標(biāo)簽只能作為根布局存在柠逞,通過include標(biāo)簽放到相應(yīng)的布局位置,這樣merge就能讓頁面直接繼承父布局景馁,減少一層布局嵌套板壮。
去除了LinearLayout
(優(yōu)化后的頁面開了開發(fā)者模式里過度繪制檢查的代碼)