在Android 12 出现了一个SplashScreen新功能,它为一切运用添加了新的运用发动动画,可以经过SplashScreen API来定制专属运用发动动画。

默许情况下,新的运用发动动画为白色布景,中心为运用图标。

默许运用发动动画

接下去将逐个介绍怎么运用SplashScreen API来定制专属运用发动动画。

由于这是Android 12新增功能,所以一切相关API都要求api 31才能运用,因而需求额外创建一个values-v31,并将themes.xml拷贝一份放入其中。

values-v31

布景色彩

默许情况下,运用发动动画布景为白色。

在运用所运用的主题中设置以下代码,可以定制运用发动动画的布景色彩。

<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仍然是无法运用的。