Android12 Jetpack SplashScreen API总结

Android12 Jetpack SplashScreen API总结


官方Android 12的Splash Screen文档地址
官方Splash Screen兼容库,支持所有版本系统

本篇文章主要围绕下面三个问题来介绍:

  1. 我们能从Android 12 SplashScreen API里面学到什么?
  2. 新出的SplashScreen兼容库又是什么?能做成什么样子?
  3. 小甲同学:我想看Android12 SplashScreen源码,可以吗?

SplashScreen使用

首先我们需要把 compileSdktargetSdk(可选) 升级到31 。

Android12版本

(A).主题和外观配置

<!--文章末尾我们会把包含所有示例的链接地址提供出来,如有需要:请翻到文章末尾-->

<!-- values-v31/themes.xml -->
<!--单一颜色填充「启动画面」窗口背景-->
<item name="android:windowSplashScreenBackground">@color/...</item>

<!--「启动画面」中心的图标,
     可以配置AnimationDrawable 和 AnimatedVectorDrawable类型的drawable-->
<item name="android:windowSplashScreenAnimatedIcon">@drawable/...</item>

<!--「启动画面」中心图标动画的持续时间,这个属性不会对屏幕显示的实际时间产生任何影响-->
<item name="android:windowSplashScreenAnimationDuration">1000</item>

<!--「启动画面」中心图标后面设置背景-->
<item name="android:windowSplashScreenIconBackgroundColor">@color/...</item>

<!--「启动画面」底部显示的品牌图标-->
<item name="android:windowSplashScreenBrandingImage">@drawable/...</item>

(B).延长启动画面

val content: View = findViewById(android.R.id.content)
    content.viewTreeObserver.addOnPreDrawListener(
        object : ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                // 模拟一些数据的初始化,再取消挂起
                return if (viewModel.isReady) {
                    // 取消挂起,恢复页面内容绘制
                    content.viewTreeObserver.removeOnPreDrawListener(this)
                    true
                } else {
                    // 挂起,内容还没有准备好
                    false
                }
            }
        }
    )

(C ).关闭启画面的动画

// 自己定制关闭的动画
splashScreen.setOnExitAnimationListener { splashScreenView ->
        val slideUp = ObjectAnimator.ofFloat(
            // 你们自己控制,自己随便写什么动画,这里我们测试让图标移动
            splashScreenView.iconView,
            View.TRANSLATION_Y,
            0f,
            -splashScreenView.height.toFloat()
        )
        slideUp.interpolator = AnticipateInterpolator()
        slideUp.duration = 200L
        slideUp.doOnEnd { splashScreenView.remove() }
        slideUp.start()
    }

(D).遇到的问题

  • android:windowSplashScreenBrandingImage 定义的图片尺寸要求是多少?总觉得有点拉伸;
  • 使用AnimationDrawable 或者 AnimatedVectorDrawable,来设置中心图标,会出现“中心图标”消失的情况,静态图标不会有这种问题出现;
  • Android12父主题设置android:windowBackground被覆盖,看不到效果

问题1: 在源码里面也没有看到具体的值或者比例大小,怎么办呢?

小技巧: 使用一个超大的正方形的图标设置进去测试了一下,拉伸不要紧,我们要的是比例, 然后测量了一下比例为:2.5 : 1,所以设计品牌名图标的时候,可以设置为400 * 160这样的比例为2.5:1的图标

问题2: 针对中心图标会闪现消失的问题做测试,
测试一:静态Icon,测试二:动态Icon

静态中心图标 - 正常 ……飘过……

下面我们来测试 动态中心图标,为了方便测试出效果,我们覆盖住图标后面的背景色,方便对比,最后发现:测试结果不太理想,效果不行

<!--AnimationDrawable写法-->
<!--没有真机测试,这个写法,效果看起来也挺奇怪的,可能是模拟器且是预览版的问题吧-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@mipmap/ic_launcher" android:duration="600" />
    <item android:drawable="@drawable/api12_logo" android:duration="200" />
    <item android:drawable="@mipmap/ic_launcher" android:duration="200" />
</animation-list>

Android12 Jetpack SplashScreen API总结

动态中心图标,不正常

我们再来看一下官方文档中的顺滑效果
Android12 Jetpack SplashScreen API总结

下面我们使用AnimatedVectorDrawable来制作动态图标,
为了观察出效果:我们打开模拟器的开发者选项,找到Animator时长缩放设置为:动画时长x10,自己看效果,此处略……

笑脸眼睛动画的矢量图文件

上一篇:Influxdb基础


下一篇:[转帖]时序数据库技术体系 – InfluxDB TSM存储引擎之数据读取