问题起因
在用了今日头条适配方案后感觉非常的完美,但是后来在应用冷启动的时候总感觉黑屏的时间有点长,决定优化一下,在将应用启动时一切可以延迟加载和非必要初始化的代码进行处理之后依然会有短暂的黑屏,那么只能使用另一种方法,将启动页的theme中添加android:windowBackground属性,设置成和启动页的背景图,当然启动页只是一个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>
果然没有被拉伸,但是仔细看一下,背景图的大小居然突然的变化了,这是什么锅?
问题分析
最后终于锁定了原因,由于使用了今日头条的适配,那归根结底到底为什么呢?
其实系统使用了原始的DisplayMetrics生成的drawable来暂时替换冷启动的黑屏,但是当我们使用今日头条适配后改变了DisplayMetrics,后来又使用了适配后的DisplayMetrics,DecorView再次绘制背景时,LayerDrawable背景图的大小发生了变化,所以我们再次看到的启动页突然发生了变化。
解决方案
基于此,我们该怎么解决呢?
我们可以进行妥协将启动页的android:windowBackground设置成透明,当然如果你还想设置成logo,那么可以重新切图,需要将整个启动图全部切出来,不要使用xml作为背景图,当然这样也会造成包体积增大,不推荐。
还有一种方法就是我们可以在适配之前先获取到启动页的背景图,然适配后在把背景图设置回去就ok了,如下:
Drawable background = getWindow().getDecorView().getBackground();
getWindow().setBackgroundDrawable(background);
当然如果DecorView还会多次绘制背景的话也只能是暂时的,并不能根本处理,如果看源码我们知道
DecorView其实就是一个FrameLayout布局,那么既然我们是通过theme设置的背景,那么我们可以在设置主题后禁止DecorView再次绘制也可以解决,在启动页的Activity中重写setTheme,如下:
@Override
public void setTheme(int resid) {
super.setTheme(resid);
getWindow().getDecorView().setWillNotDraw(true);
}
网友评论