在Android 12 出现了一个SplashScreen新功能,它为一切运用添加了新的运用发动动画,可以经过SplashScreen API来定制专属运用发动动画。
默许情况下,新的运用发动动画为白色布景,中心为运用图标。
接下去将逐个介绍怎么运用SplashScreen API来定制专属运用发动动画。
由于这是Android 12新增功能,所以一切相关API都要求api 31才能运用,因而需求额外创建一个values-v31,并将themes.xml拷贝一份放入其中。
布景色彩
默许情况下,运用发动动画布景为白色。
在运用所运用的主题中设置以下代码,可以定制运用发动动画的布景色彩。
<item name="android:windowSplashScreenBackground">@color/splash_screen_background</item>
<color name="splash_screen_background">#7B5AB6</color>
需求留意一点,目前运用android:windowSplashScreenBackground设置的色彩不能带通明度,必须为6位或者是8位且通明度为FF,假如运用了带通明度的色彩将不生效。
发动图标
默许情况下,运用发动动画的中心为运用图标。
在运用所运用的主题中设置以下代码,可以定制运用发动动画的中心图标。
<item name="android:windowSplashScreenAnimatedIcon">@drawable/cat</item>
这是原始图片:
- 可以发现发动图标需求保存必定的内边距,因为会被部分裁剪。
- 除了设置静态图片,也可以设置动画方式,装备运用android:windowSplashScreenAnimationDuration设置动画时长。
- 假如设置的图标是通明布景的,可以另外设置android:windowSplashScreenIconBackgroundColor来定制中心图标的布景色彩。
底部图片(Google不推荐运用)
运用android:windowSplashScreenBrandingImage可以设置底部图片,图片尺寸比例需求为2.5:1。
推迟发动时刻
运用android:windowSplashScreenAnimationDuration可以设置发动动画时长,可是最长只能设置1000毫秒。
很多时分需求在发动的时分拉取一些运用装备,需求有更长时刻的发动作用。
可以在代码中实现,经过ViewTreeObserver.OnPreDrawListener:
class MainActivity : AppCompatActivity() {
private var isAppReady = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val content: View = findViewById(android.R.id.content)
content.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
override fun onPreDraw(): Boolean {
if (isAppReady) {
content.viewTreeObserver.removeOnPreDrawListener(this)
}
return isAppReady
}
})
delayBootTime()
}
private fun delayBootTime() {
lifecycleScope.launch {
delay(3000)
isAppReady = true
}
}
}
当运用装备已准备好,onPreDraw返回true,而且移除监听。这儿运用delay3秒来模拟拉取运用装备的耗时操作。
需求留意,必定要在准备好后onPreDraw返回true,否则会一直卡在发动页上。
发动退出动画
Android 12 SplashScreen新功能提供了setOnExitAnimationListener办法可以定制发动退出时的动画作用,该API只能在版别12及以上运用:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
splashScreen.setOnExitAnimationListener { splashScreenView ->
val slideUp = ObjectAnimator.ofFloat(
splashScreenView,
View.TRANSLATION_Y,
0f,
-splashScreenView.height.toFloat()
)
slideUp.duration = 2000
// 在自定义动画结束时调用splashScreenView.remove()
slideUp.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
splashScreenView.remove()
}
})
slideUp.start()
}
}
低版别兼容
在Android 12以下版别没有SplashScreen发动动画,显示的空白布景页面,这在用户体验上很不好。因而,Google在AndroidX中提供了一个向下兼容的SplashScreen库。
装备
implementation 'androidx.core:core-splashscreen:1.0.0'
设置主题
定义一个新的主题并给运用运用:
<style name="SplashScreenTheme" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/splash_screen_background</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/cat</item>
<item name="postSplashScreenTheme">@style/Theme.SplashScreenDemo</item>
</style>
需求留意几点:
- 必须以R.style.Theme_SplashScreen 为父级
- 发动图标动画方式失效
- windowSplashScreenBackground、windowSplashScreenAnimatedIcon前面都没有 android:
- postSplashScreenTheme指定运用原来的主题,这样,当SplashScreen结束时,运用主题可以被恢复
在发动Activity中设置
必定要在setContentView办法之前调用installSplashScreen办法
super.onCreate(savedInstanceState)
installSplashScreen()
setContentView(R.layout.activity_main)
至此,在低版别上也能有同样作用的SplashScreen动画了,当然一些发动退出动画这些Android 12特有的API仍然是无法运用的。