ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

解决白屏、黑屏问题,优化欢迎页显示

2021-03-12 18:00:51  阅读:393  来源: 互联网

标签:layer 启动 欢迎 splash logo 白屏 null 黑屏


文章目录


前言

你的应用是否出现过,启动后白屏、黑屏、响应慢等问题?
想不想像微信、QQ那样秒启动?
想学吗?
我教你呀,哈哈哈哈哈


一、为什么会出现黑屏、白屏?

       这一切还得从android进程的起源说起:据说,在很久很久以前… …
       简单来说,在android系统中,有一个女娲级的进程叫zygote,它是Android系统上所有应用进程的父进程,所有应用运行的进程,都是由zygote一手创建起来的。
       但是,进程也不是一天建成的,那都是需要Time的!当用户马大爷点击了应用启动图标,zygote就会开始日夜赶工的创建进程,但是就是这么点间隙,如果android系统不给点什么反映,马大爷就会以为自己没点到,这会严重挫败马大爷的自信心呐,于是,android系统必须给个反映:

系统会根据你的manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。这个黑(白)屏的界面,就是PreviewWindow,即预览窗口。

二、怎么解决?

       既然女娲创建进程需要时间,系统也给女娲了时间,只不过,给的方式有点丑陋,那我们能不能美化下呢?也就是那个PreviewWindow的展示界面能不能好看些呢?或者说,能不能换成自定义的页面呢?
       上帝既然为你创造了双脚,你必定可以买到合适的鞋!
       直接在AndroidManifest.xml中的启动类添加Theme

    <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/splash</item>
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>

1.图片变形怎么办?

2.出现留白怎么办?

3.跳转动画如何去掉?

哪儿那么多为什么,一次性解决所有问题:
很多博客说,使用.9啊。亲测,无效。(可能我测的姿势不对)

4.解决办法

使用layer-list,才是解决问题的关键。
比如下面这种情况的闪屏页面,使用layer-list是最优解:
android:windowBackground 设置时不使用原图,而是使用layer-list
同时,将闪屏页界面元素进行合理拆分,如下
theme:

    <style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/layer_splash</item>
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowAnimationStyle">@style/Animation_No</item> 
        <item name="android:windowFullscreen">true</item>
    </style>

layer_splash.xml: 顶部距离,底部距离自己把控

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque"><!--android:opacity=”opaque” 属性,是为了防止在主题切换之间会闪现的黑屏。-->
    <item>
        <bitmap
            android:gravity="fill"
            android:src="@mipmap/splash_bg" />
    </item>
    <item android:top="80dp">
        <bitmap
            android:gravity="top|center_horizontal"
            android:src="@drawable/test_splash_title" />
    </item>
    <item android:top="170dp">
        <bitmap
            android:gravity="top|center_horizontal"
            android:src="@drawable/test_splash_center" />
    </item>
    <item android:bottom="50dp">
        <bitmap
            android:gravity="bottom|center_horizontal"
            android:src="@drawable/test_splash_logo" />
    </item>
</layer-list>

Animation_No:

    <style name="Animation_No">
        <item name="android:activityOpenEnterAnimation">@null</item>
        <item name="android:activityOpenExitAnimation">@null</item>
        <item name="android:activityCloseEnterAnimation">@null</item>
        <item name="android:activityCloseExitAnimation">@null</item>
        <item name="android:taskOpenEnterAnimation">@null</item>
        <item name="android:taskOpenExitAnimation">@null</item>
        <item name="android:taskCloseEnterAnimation">@null</item>
        <item name="android:taskCloseExitAnimation">@null</item>
        <item name="android:taskToFrontEnterAnimation">@null</item>
        <item name="android:taskToFrontExitAnimation">@null</item>
        <item name="android:taskToBackEnterAnimation">@null</item>
        <item name="android:taskToBackExitAnimation">@null</item>
    </style>

具体示例如下图:
splash_bg是渐变背景,由于UI设计了渐变色,只能也使用图片了(可以用.9)
test_splash_title是顶部的标题栏(应用名称,别惊讶,总有老板会把名字放这里的)
test_splash_center是中间的图片,注意,图片一定是不带背景颜色的,这样效果好。
test_splash_logo是底部的小太阳
在这里插入图片描述

三、看看别人家的应用

1.Bilibli
B站的手机客户端,做的还是不错哒。
仔细看了下他家APP启动,猜测逻辑应该是这样,theme中的windowBackground应该是只设置了底部的logo,并使用了纯白背景,而后,启动页的真实activity的layout文件,应该是底部logo,中间添加了二次元图片。所以在启动哔哩哔哩时,会先显示底部logo纯白界面,后显示二次元+底部logo的界面。在这里插入图片描述
但是 但是 但是,这种做的好了就是B站的那种效果,做的不好,就是下面这种效果了!!
在这里插入图片描述
睁大眼看清楚,丁香妈妈那四个字,是不是有一个下移的效果。
这可不是开发专门做的特效,这应该是个bug,哈哈哈
而且,我发现滴滴,竟然也有这种问题!!!
这种明显的问题,测试肯定会问你的,能不能把这个特效去掉?!

当然可以的啦!
关键在于,theme中的layer-list的布局与启动页activity中的布局保持一致的同时,而且,要保证启动页也是全屏展示,即theme中也带有windowNoTitle和windowActionBar的属性

    <style name="FullScreen" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>

如果你没带这俩属性也显示正常,那么敲敲的告诉你,你把你的手机虚拟按键隐藏了你再看看试试!!!

总结

虽然说,解决了问题,但是说到底其实是个障眼法而已,三脚猫功夫。真正应该做的是优化启动逻辑,不能有了障眼法,就不去优化启动逻辑了。毕竟用户真正想要的是以最快的速度进到主应用、主界面,如果启动让用户等待太长时间,那这个应用估计很快就gg了。

自己铲平经理从远方喊话:
你看看人家支付宝,多大体量的APP,人家那启动时间,那基本上就来不及我反应,人家就打开了!再看看咱们自己的应用,搁这儿没睡醒呢还!!!!

不说了,不说了,赶紧跑路了。。。。。。

感谢:
Android 启动页的一些坑-多图杀猫
Android启动页黑屏及最优解决方案

标签:layer,启动,欢迎,splash,logo,白屏,null,黑屏
来源: https://blog.csdn.net/sinat_26710701/article/details/114697320

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有