Jetpack新成员SplashScreen:为全新的应用启动效果赋能!

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

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和画面背景的windowSplashScreenAnimatedIconwindowSplashScreenBackground,以及设置启动画面退出后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
评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值