如何正确搭配使用SplashScreen compat库与Jetpack Compose?
SplashScreen compat库与Jetpack Compose搭配使用解决方案
可以正常搭配使用,你遇到的退出动画无法播放完毕的问题,核心原因是setContent会替换Window根布局下的内容视图,和SplashScreen的退出动画生命周期产生冲突,无需延迟调用setContent,有两种性能无损的最优解决方案:
方案1:使用setKeepOnScreenCondition控制闪屏展示时机(官方推荐)
该方案可以让Compose渲染和闪屏展示并行执行,完全没有性能损耗,等Compose首帧渲染完成后自动触发闪屏退出动画,动画可完整播放。
代码示例:
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val splashScreen = installSplashScreen() var isComposeContentReady = false // 闪屏保持展示,直到Compose内容准备完成 splashScreen.setKeepOnScreenCondition { !isComposeContentReady } setContent { AppTheme { // 你的业务根组件 MainScreen() // 首帧组合完成后标记准备就绪 LaunchedEffect(Unit) { isComposeContentReady = true } } } } }
方案2:使用setOnExitAnimationListener自主控制闪屏退出逻辑
适合需要自定义闪屏退出动画、或者需要和Compose入场效果做联动的场景,你可以完全控制闪屏视图的移除时机,不会被setContent的视图替换逻辑影响。
代码示例:
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val splashScreen = installSplashScreen() splashScreen.setOnExitAnimationListener { splashScreenView -> // 自定义退出动画,可根据需求调整动画类型、时长 val fadeOutAnim = ObjectAnimator.ofFloat( splashScreenView, View.ALPHA, 1f, 0f ).apply { duration = 800 interpolator = AccelerateDecelerateInterpolator() doOnEnd { // 动画播放完毕后主动移除闪屏视图 splashScreenView.remove() } } fadeOutAnim.start() } setContent { AppTheme { MainScreen() } } } }
注意事项
- 不要额外给Activity主题设置
windowBackground作为旧版闪屏兜底,直接按SplashScreen compat库的要求配置主题属性即可,避免样式冲突 setKeepOnScreenCondition的判断条件要尽量轻量,不要放入耗时逻辑,避免闪屏页长时间无意义展示
内容的提问来源于stack exchange,提问作者Felix Wunderlich
相关产品推荐
相关产品推荐

