问题描述
我试图添加对 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。
应用流程 -> SplashActivity(具有上述主题),然后我使用 viewmodel 暂停 preDraw 方法,然后导航到另一个活动。
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>
时,不是白色屏幕,而是黑色屏幕。
解决方法
问题是您在请求导航到其他 Activity 后返回 true
并删除 OnPreDrawListener
,这向系统表明您当前的 Activity 现在已准备好绘制,但下一个一个尚不可见,因此是您看到的闪光。
只需始终在预绘制侦听器中返回 false
并在 onStop()
中将其删除