
可能有不少小伙伴已经留意到
Android 12上推出了全新的启动画面 APISplashScreen。同时为了兼容低版本的使用,Jetpack框架里推出了同名库。
本次针对这个库的使用和原理做个全面的介绍,将按照如下几个方面去展开:
- 首先简单探讨一下为什么需要启动画面
- 接着一起回顾一下之前打造启动画面的常规做法
- 然后重点阐述一下 SplashScreen 库的目的,以及如何使用
- 最后介绍一下 SplashScreen 库大致的实现原理
1. 为什么需要启动画面
1.1 启动画面的作用
-
当我们打开各种桌面软件或移动端 App 的时候,首先会看到的经常是一段过渡画面。用以展示产品所属的公司、品牌的图标、公司的 Slogan 等,借以宣传公司的调性和传达一些特色
-
同时在节日庆典、特殊活动的时候展示广告页面或活动海报
-
在启动画面展示的同时,背后的内容得以加载
同时在一定程度上缓解用户的等待,启动画面良好设计的话,还能使得这个枯燥的过程显得有趣和充满期待!
1.2 App 启动的典型流程
来看一下 App 启动的典型流程。

点击 Launcher 上的 Logo 之后,首先用户将看到一个启动画面,如果是初次启动的话接着会展示 Guide 画面引导用户了解如何使用;如果是节日或广告需要的话展示的是广告宣传画面,最后才是展示内容的主画面。
我们本次探讨的核心就是第一个启动画面。
Jetpack SplashScreen 库正是用来打造用户看到的第一个启动画面,在讲述之前,先来回顾一下之前的常规做法。
2. 常规做法
我们知道从点击 Launcher 上的 icon 到 App 内容描画之前,有很多准备工作。在这段时间是看不到目标 App 内容的。
为了快速响应用户的点击或缓解用户的等待,在 App 描画之前系统将启动专用的 SplashScreenWindow 盖在 App 之上。该Window 的呈现源自于 App 主题方面的配置。
配置的不同进而影响到启动 Window 的表现,我们来看看各种配置的做法。
2.1 默认的启动画面背景
假使 App 的主题针对 Window 背景什么都不设置,你会发现启动的过程中总有个默认的白画面一闪而过。
<style name="SplashThemeBase.DefaultBg"/>
2.2 不设置启动画面背景
当然可以将 windowBackground 设置为空,可是你会发现启动的过程中又变成黑色一片闪过。
<style name="SplashThemeBase.NoBg">
<item name="android:windowBackground">@null</item>
</style>
无论是白画面还是黑画面一闪而过,都无法接受,所以还得继续优化。
2.3 直接关闭启动画面
无论白画面还是黑画面一闪而过的体验都不好,这时候可能会想到关闭默认的启动画面。通过 windowDisablePreview 属性可以彻底关闭启动画面。
<style name="SplashThemeBase.TransparentBg">
<item name="android:windowDisablePreview">true</item>
</style>
这样一来,确实看不到启动画面的存在了,但整个过程貌似“变慢”了。实际上性能并没有**“劣化”**,只是启动中过渡的 Window 不存在了。假使 Application 或 Activity 等组件里存在耗时逻辑的话,这种劣化会更加明显。
相较于前面的黑白画面一闪而过,这种变慢的体验也好不到哪去。
2.4 设置启动画面背景
绕来绕去,最后我们发现还是得提供一个恰当的启动画面。具体在于将 UI 提供的背景色、Icon、Brand 等资源组合成一个 LayerListDrawable,然后将其设置到 windowBackground 中即可。
<!--theme-->
<style name="SplashThemeBase.WithBg">
<item name="android:windowBackground">@drawable/ic_splash_bg</item>
</style>
<!--drawable-->
<layer-list ... >
<item android:drawable="@drawable/ic_logo"></item>
<item android:drawable="@drawable/ic_brand"></item>
</layer-list>
这种做法既可以提供体验良好的过渡画面,同时可以快速响应用户的点击。可以说是最为简单也最为便捷的一种实现方式。
2.5 设置启动画面内容
Android 8 加入一个配置启动画面的属性 windowSplashscreenContent,用于配置启动画面的内容。它的优先级高于 windowBackground。两者一起设置的话呢,会覆盖在 windowBackground 上。大体的效果呢和前面的差不多,不再赘述。
<style name="SplashThemeBase.WithBg.SplashScreenContent">
<item name="android:windowSplashscreenContent">@drawable/ic_splash_content</item>
</style>
注意:这个属性自 Android 8 加入,从 12 开始废弃
2.6 定义启动专用 Activity
有的时候觉得单单设置一张背景图太过简单,无法实现一些复杂的启动效果。又或者希望能和广告或节日的画面深度配合起来。这时候难免需要定义一个专门的启动 Activity。
具体来讲需要在入口 Activity 前预设专门的 Splash Activity来显示启动画面,Splash Activity 在一定时间后自动跳转到入口 Activity
启动 Activity 提供类似启动画面的布局。
<androidx.constraintlayout.widget.ConstraintLayout ... >
<ImageView android:src="@drawable/ic_icon" ... />
<ImageView android:src="@drawable/ic_brand" ... />
</androidx.constraintlayout.widget.ConstraintLayout>
在画面展示后配合定时跳转等逻辑去打开广告或海报等画面。
class SplashActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
setContentView(binding.root)
goToMainScreenDelayed()
}
}
使用Jetpack SplashScreen打造动态启动画面

本文详细介绍了Android12的SplashScreen API和Jetpack的SplashScreen库,展示了如何通过它们实现丰富、灵活的启动画面。内容包括启动画面的作用、常规做法、SplashScreen库的目的和使用,以及其实现原理。通过设置动画图标、延长展示时间、定制退场动画等,提升用户体验。
最低0.47元/天 解锁文章
1587

被折叠的 条评论
为什么被折叠?



