Android 12上新引入的Splash Screen功能,可以高效打造自由、丰富的应用启动效果。但仍占据市场主流的低版本设备,如何才能尝上鲜呢?答案就是Jetpack的新成员SplashScreen库,让我们一探其用法以及背后的原理!
前言
早在Android 12 Preview版公开的时候,我注意到了酷炫的Splash Screen功能,便快速定制和分享了用它打造的各式启动效果,收到了很多积极的反馈。万分荣幸的是:负责Splash Screen功能的Google工程师也给我的Demo点了赞,还进行了转发!
但不少开发者表示Android 12上的效果固然不错,可12之前的版本才是主流,如果不兼容的话,实属有些鸡肋。包括我在内,都很关心低版本如何才能应用上这个新功能。
翻阅这位Google工程师的历史推文的时候,意外发现不久前AndroidX包也刚推出了一个叫SplashScreen的同名API。我们都知道AndroidX归属Jetpack,是独立于SDK版本以外的开发框架集合,很显然它就是用来兼容低版本的Splash Screen功能库。
这可谓是及时雨啊,必须研究一下,让Splash Screen功能充分发挥它的作用!加上之前分享的文章没有提及实现原理,本文一并探讨一下。
1. 新成员SplashScreen
Jetpack SplashScreen是向后兼容Android 12 Splash Screen功能的开发库。 其最早支持到Android 6(API 23),全球的Android设备中6及以上的版本占用率达到了9成以上,可以说完全够用了。
1.1 作用以及局限
Splash Screen功能打造的启动画面分为进场和退场两部分:前者负责展示Icon、Icon动画以及品牌Logo等基本信息,后者则用于展示整体或Icon视图过渡到目标画面的动画效果。
对于退场部分而言,无论是否运行在12上,Jetpack SplashScreen库都能达到Android 12同等效果;但进场部分如果是运行在低版本上,暂时存在些局限。
- 暂不支持展示Icon动画:
AnimatedVectorDrawable - 暂不支持配置Icon背景:
IconBackgroundColor - 暂不支持设置品牌Logo:
BrandingImage
| 进场部分的功能对比 | Jetpack版 | Android 12版 |
|---|---|---|
| ScreenBackground | YES | YES |
| ScreenIcon | YES | YES |
| AnimatedVectorDrawable | NA | YES |
| IconBackgroundColor | NA | YES |
| BrandingImage | NA | YES |
备注:后面会讲到SplashScreen库的实现原理,面向低版本的进场效果本质上是一个LayerDrawable。说实话,对于支持Vector Drawable动画、Adaptive Icon背景是无能为力的。但笔者认为在代码层面加入些额外处理,是可以做到完美支持的,期待后期升级能完善一下!
2.2 导入依赖
SplashScreen库的最新版本为1.0.0-alpha01,Gradle里简单依赖即可。
dependencies {
def core_version = "1.6.0"
...
// Optional - APIs for SplashScreen, including compatiblity helpers on devices prior Android 12
implementation "androidx.core:core-splashscreen:1.0.0-alpha01"
}
2.3 SplashScreen库预设主题
SplashScreen库针对启动画面的打造定义了专用的Attr,比如设置Icon和画面背景的windowSplashScreenAnimatedIcon和windowSplashScreenBackground,以及设置启动画面退出后Activity主题的postSplashScreenTheme等。
低版本并不支持Icon动画,也就谈不上配置时长,但库还是提供了相关的属性windowSplashScreenAnimationDuration,原因不太清楚。
<attr format="reference" name="postSplashScreenTheme"/>
<attr format="reference" name="windowSplashScreenAnimatedIcon"/>
<attr format="integer" name="windowSplashScreenAnimationDuration"/>
<attr format="color" name="windowSplashScreenBackground"/>
此外为了简化App端的配置,还预设了主题,同时并针对设备版本进行了区分。
如下是面向低版本的主题:
<style name="Theme.SplashScreen" parent="Theme.SplashScreenBase">
<item name="postSplashScreenTheme">?android:attr/theme</item>
<item name="windowSplashScreenAnimationDuration">@integer/default_icon_animation_duration</item>
<item name="windowSplashScreenBackground">@android:color/background_light</item>
<item name="windowSplashScreenAnimatedIcon">@android:drawable/sym_def_app_icon</item>
</style>
<style name="Theme.SplashScreenBase" parent="android:Theme.NoTitleBar">
<item name="android:windowBackground">@drawable/compat_splash_screen</item>
<item name="android:opacity">opaque</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:fitsSystemWindows">false</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
</style>
比较关键的是父主题SplashScreenBase设置了windowBackground属性,其指向的Drawable负责展示低版本的启动画面。
原理很简单:读取windowSplashScreenBackground设置的背景ColorDrawable和windowSplashScreenAnimatedIcon设置的图标Drawable,图标 Drawable放置到背景Drawable的中央,然后组合成Layer Drawable。老实说,跟我们以前自定义启动画面的思路是类似的。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:gravity="fill">
<color android:color="?attr/windowSplashScreenBackground" />
</item>
<item
android:drawable="?attr/windowSplashScreenAnimatedIcon"
android:gravity="center"
android:width="@dimen/splashscreen_icon_size"
android:height

Jetpack引入的SplashScreen库为Android6及更高版本提供了向后兼容的启动画面功能。通过设置特定主题和属性,开发者可以实现与Android12相似的启动效果,包括图标动画、背景颜色和品牌Logo。文章详细介绍了如何使用这个库,以及如何在低版本设备上模拟进场和退场动画,同时还探讨了SplashScreen的实现原理。通过适配Jetpack SplashScreen库,开发者可以让更多用户享受到丰富的启动体验。
最低0.47元/天 解锁文章
1481

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



