Android12新增开屏页设置,在xml中设置相关属性可定义开屏页的logo、背景颜色、slogn、动画等样式,但只能在Android版本12及以上使用,12以下无效,但使用Jectpack的SplashScreen库可支持12以下开屏样式,最低支持到Android6
一、使用
导入依赖
implementation 'androidx.core:core-splashscreen:1.0.0-alpha01'
定义主题
<style name="Theme.SplashTheme" parent="Theme.SplashScreen">
<!--背景色-->
<item name="windowSplashScreenBackground">@color/purple_500</item>
<!--设置icon图标 AnimationDrawable 和 AnimatedVectorDrawable 创建的对象,可呈现动画效果-->
<item name="windowSplashScreenAnimatedIcon">@mipmap/ic_launcher_round</item>
<item name="windowSplashScreenAnimationDuration">@integer/icon_animator_duration</item>
<item name="postSplashScreenTheme">@style/Theme.AppTheme</item>
</style>
注意需继承Theme.SplashScreen主题,该主题不属于AppCompat主题,所以对应的Activity不能继承AppCompatActivity.animatedIcon 可以是带动画的矢量图标,但动画效果只在12上起作用,如果使用svg的动画效果则要准备个无动画效果的图供12以下使用; <item name="android:windowSplashScreenBrandingImage"></item> 该属性只能在theme(31)值文件下使用,设置底部图标 在有png图标的情况下,可以用png转svg工具转换成svg文件,然后通过AS自带的Vector Asset Tool和Animated Vector Drawable标签,可以将SVG扩展成矢量图动画文件
配置运行
将compileSdk指定31,如果编译报错,检查是否配置了android:exported=“true”,至此就可以运行看到设置的效果
二、进阶
控制画面展示时长
开屏页的时长是不固定的,所以动画的显示可能没显示完就退出了,可以通过获取splashscreen实例来控制展示时间和退出的时机
val splashScreen=installSplashScreen()
splashScreen.setKeepVisibleCondition(SplashScreen.KeepOnScreenCondition { !isLoading })
isLoading 代表是否可以退出了
设置退出动画
splashScreen.setOnExitAnimationListener {
splashScreenViewProvider->
val onExit={splashScreenViewProvider.remove()}
showSplashExitAnimator(splashScreenViewProvider.view,onExit)
showSplashIconExitAnimator(splashScreenViewProvider.iconView,onExit)
}
isLoading 后会执行退出动画,退出动画执行后需手动调用remove方法将闪屏布局移除,如果此时执行了跳转页面的动作则可能看不到动画的执行效果,会执行页面跳转的动画。 某些时候开屏动画已经执行完但布局还未完成绘制,会停留在开屏页较长时间,此时可不去执行退场动画,让用户绘制完立即进入数据页面,可在执行退场动画前利用 val animationDuration = splashScreenViewProvider.iconAnimationDurationMillis 和val animationStart = splashScreenViewProvider.iconAnimationStartMillis 计算剩余时间来决定是否执行退场动画,
val remainingDuration = (
animationDuration - (SystemClock.uptimeMillis() - animationStart)
).coerceAtLeast(0L)
三、实践
GitHub
四、参考
官方Jectpack splashScreen Jetpack新成员SplashScreen:打造全新的App启动画面
|