前言

Android 为我们提供了 android:windowBackground 的解决方案,我们可以专门为 SplashActivity 设置一个背景来避免 创建空白(黑色) 窗口这一步骤的尴尬,而对于 android:windowBackground 又延伸了各种各样的方案。

纯色背景 + 启动图标

使用layer-list绘制一个纯色的背景加一个启动图标。layer-list 代码如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:drawable="@color/colorPrimary" />
  4. <item>
  5. <bitmap
  6. android:gravity="center"
  7. android:src="@mipmap/ic_launcher" />
  8. </item>
  9. </layer-list>

为启动页创建主题:

  1. <resources>
  2. <!-- 基本主题 -->
  3. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  4. <item name="colorPrimary">@color/colorPrimary</item>
  5. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  6. <item name="colorAccent">@color/colorAccent</item>
  7. </style>
  8. <!--纯色加启动图标的方案-->
  9. <style name="SplashThemeLayer" parent="AppTheme">
  10. <item name="windowActionBar">false</item>
  11. <item name="windowNoTitle">true</item>
  12. <item name="android:windowBackground">@drawable/bg_splash_layer_list</item>
  13. </style>
  14. </resources>

设置背景图片

启动页是一张图片时,可以设置一个和启动页一样的图片代替黑白屏。

  • 正常的主题

    1. <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    2. <!-- Customize your theme here. -->
    3. <item name="colorPrimary">@color/colorPrimary</item>
    4. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    5. <item name="colorAccent">@color/colorAccent</item>
    6. </style>
  • 启动页主题

    1. <style name="FirstTheme" parent="AppTheme">
    2. <item name="android:windowNoTitle">true</item>
    3. <item name="android:windowBackground">@mipmap/enjoylife</item>
    4. <item name="colorPrimaryDark">@color/translate</item>
    5. <item name="windowNoTitle">true</item><!--无标题-->
    6. <item name="android:windowFullscreen">true</item><!--全屏-->
    7. <item name="android:windowIsTranslucent">true</item><!--半透明-->
    8. </style>
  • 启动页 Activity,不设置界面,只要跳转即可 ``` class SplashActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

    1. super.onCreate(savedInstanceState)
    2. window.decorView.postDelayed({
    3. startActivity(Intent(this@SplashActivity,MainActivity::class.java))
    4. finish()
    5. },2500)

} }

  1. 需要注意的是:Splash 页面的背景颜色需要设置为透明 #00000000,不要设置其他背景,否则会导致图片的伸缩变形。用这种方式又带了了另外一个问题:图片的内存占用和 OOM,像这种启动页面的,基本上都是直接打包在 APP 中的,而色彩越是丰富,图片的体积就越大,大多数情况下我们是无法反驳的,我们可以通过压缩图片的方式来尽量减少图片的体积,这里推荐一个 png 压缩网站:[tinypng](https://link.ld246.com/forward?goto=https%3A%2F%2Ftinypng.com%2F),基本上能把我们拿到的设计图减少一半以上的体积。
  2. <a name="nRqyy"></a>
  3. ### 设置启动页透明
  4. 效果不如设置图片好,启动界面设置想要的界面,在启动主题里面将图片换成透明背景色即可。

```

更炫酷的方式

直接参考 github 源码,onboarding-examples-android

新版本测试

发现只要在主题中设置了无论哪种,打开 app 时都会直接显示首页,基本看不到白屏或黑屏,也看不到设置的背景图等。不设置的情况下,黑白屏也只是一闪而过,可能新的系统有过这方面的处理。

参考

Android启动白屏原因及解决方案
Android 之路 - 冷启动解决方案:实现秒开
5分钟教你打造一个秒开的 Android App
Android启动页黑屏及最优解决方案
Android:启动页—最佳实践