問題起因
在用了今日頭條適配方案后感覺非常的完美,但是后來在應(yīng)用冷啟動(dòng)的時(shí)候總感覺黑屏的時(shí)間有點(diǎn)長(zhǎng),決定優(yōu)化一下,在將應(yīng)用啟動(dòng)時(shí)一切可以延遲加載和非必要初始化的代碼進(jìn)行處理之后依然會(huì)有短暫的黑屏,那么只能使用另一種方法,將啟動(dòng)頁(yè)的theme中添加android:windowBackground屬性,設(shè)置成和啟動(dòng)頁(yè)的背景圖,當(dāng)然啟動(dòng)頁(yè)只是一個(gè)logo,為了背景圖不被拉伸,將圖片放在了xml中,如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:gravity="fill">
<shape>
<solid android:color="@color/comn_bg"/>
</shape>
</item>
<item android:gravity="center_horizontal|top" android:top="150dp">
<bitmap android:gravity="center_horizontal|top" android:src="@drawable/guide_hunterlogo"/>
</item>
</layer-list>
果然沒有被拉伸,但是仔細(xì)看一下,背景圖的大小居然突然的變化了,這是什么鍋?
問題分析
最后終于鎖定了原因,由于使用了今日頭條的適配,那歸根結(jié)底到底為什么呢?
其實(shí)系統(tǒng)使用了原始的DisplayMetrics生成的drawable來暫時(shí)替換冷啟動(dòng)的黑屏,但是當(dāng)我們使用今日頭條適配后改變了DisplayMetrics,后來又使用了適配后的DisplayMetrics,DecorView再次繪制背景時(shí),LayerDrawable背景圖的大小發(fā)生了變化,所以我們?cè)俅慰吹降膯?dòng)頁(yè)突然發(fā)生了變化。
解決方案
基于此,我們?cè)撛趺唇鉀Q呢?
我們可以進(jìn)行妥協(xié)將啟動(dòng)頁(yè)的android:windowBackground設(shè)置成透明,當(dāng)然如果你還想設(shè)置成logo,那么可以重新切圖,需要將整個(gè)啟動(dòng)圖全部切出來,不要使用xml作為背景圖,當(dāng)然這樣也會(huì)造成包體積增大,不推薦。
還有一種方法就是我們可以在適配之前先獲取到啟動(dòng)頁(yè)的背景圖,然適配后在把背景圖設(shè)置回去就ok了,如下:
Drawable background = getWindow().getDecorView().getBackground();
getWindow().setBackgroundDrawable(background);
當(dāng)然如果DecorView還會(huì)多次繪制背景的話也只能是暫時(shí)的,并不能根本處理,如果看源碼我們知道
DecorView其實(shí)就是一個(gè)FrameLayout布局,那么既然我們是通過theme設(shè)置的背景,那么我們可以在設(shè)置主題后禁止DecorView再次繪制也可以解決,在啟動(dòng)頁(yè)的Activity中重寫setTheme,如下:
@Override
public void setTheme(int resid) {
super.setTheme(resid);
getWindow().getDecorView().setWillNotDraw(true);
}