Android 12 飞溅白色背景

Android 12 splash white background

我试图添加对 Android 12 初始屏幕的支持。 这是我的 v31/styles.xml

<resources>

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:navigationBarColor">@android:color/transparent</item>
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_launcher_foreground</item>
    <item name="android:windowSplashScreenIconBackgroundColor">#FF3044</item>
    <item name="android:windowSplashScreenBackground">#FF3044</item>
</style>

</resources>

新启动后我可以看到白屏。那个白屏是 android:windowBackground,但如果我尝试将其设置为 @null,我会在白屏的位置出现倒置的飞溅。 飞溅后如何去除白色背景?我猜 Splash API 旨在取代 windowBackground。

App flow -> SplashActivity(具有上述主题),然后我使用 ViewModel 暂停 preDraw 方法,然后导航到另一个 activity。

SplashActivity.kt - onCreate()

val content: View = findViewById(android.R.id.content)
    content.viewTreeObserver.addOnPreDrawListener(
        object : ViewTreeObserver.OnPreDrawListener {
            override fun onPreDraw(): Boolean {
                return if (viewModel.appInit()) {
                    navigateToHome()
                    content.viewTreeObserver.removeOnPreDrawListener(this)
                    true
                } else {
                    false
                }
            }
        }
    )

HomeActivity 没有任何主题。当我在 Splash 的主题中添加 <item name="android:windowBackground">@color/android:black</item> 时,我得到的不是白色屏幕,而是黑色屏幕。

问题是您正在 returning true 并在请求导航到您的另一个 activity 后删除 OnPreDrawListener,这向系统表明您当前 Activity 现在可以绘制了,但下一个还不可见,因此您看到的是闪光灯。

只需在预绘制监听器中始终 return false 并在 onStop()

中将其删除