深度探讨 Jetpack SplashScreen 如何重塑应用启动画面

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

在这里插入图片描述

可能有不少小伙伴已经留意到 Android 12 上推出了全新的启动画面 API SplashScreen。同时为了兼容低版本的使用,Jetpack 框架里推出了同名库。

本次针对这个库的使用和原理做个全面的介绍,将按照如下几个方面去展开:

  • 首先简单探讨一下为什么需要启动画面
  • 接着一起回顾一下之前打造启动画面的常规做法
  • 然后重点阐述一下 SplashScreen 库的目的,以及如何使用
  • 最后介绍一下 SplashScreen 库大致的实现原理

1. 为什么需要启动画面

1.1 启动画面的作用

12-widget
  • 当我们打开各种桌面软件或移动端 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"/>
12-widget

2.2 不设置启动画面背景

当然可以将 windowBackground 设置为空,可是你会发现启动的过程中又变成黑色一片闪过。

<style name="SplashThemeBase.NoBg">
    <item name="android:windowBackground">@null</item>
</style>
12-widget

无论是白画面还是黑画面一闪而过,都无法接受,所以还得继续优化。

2.3 直接关闭启动画面

无论白画面还是黑画面一闪而过的体验都不好,这时候可能会想到关闭默认的启动画面。通过 windowDisablePreview 属性可以彻底关闭启动画面。

<style name="SplashThemeBase.TransparentBg">
    <item name="android:windowDisablePreview">true</item>
</style>

这样一来,确实看不到启动画面的存在了,但整个过程貌似“变慢”了。实际上性能并没有**“劣化”**,只是启动中过渡的 Window 不存在了。假使 ApplicationActivity 等组件里存在耗时逻辑的话,这种劣化会更加明显。

相较于前面的黑白画面一闪而过,这种变慢的体验也好不到哪去。

12-widget

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>
12-widget

这种做法既可以提供体验良好的过渡画面,同时可以快速响应用户的点击。可以说是最为简单也最为便捷的一种实现方式。

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()
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechMerger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值