Android接入Splash Screen API横屏模式出现白色块问题
这个横屏边缘白块是AndroidX Splash Screen 1.0.0及更早版本的已知兼容缺陷,和广告SDK集成无关——你在无广告应用中能稳定复现相同问题已经可以佐证这点。
该缺陷的触发逻辑是:Splash Screen库默认按竖屏比例计算启动背景、图标的绘制区域,当设备切换为横屏时,库内部没有正确适配宽高翻转后的窗口边界,未被启动页背景覆盖的区域会直接露出窗口默认的白色底色,最终在屏幕起始/末尾侧形成固定白块,模拟器、实体机均可稳定复现。
按生效优先级从高到低依次操作:
1. 统一窗口背景色(最快覆盖90%以上场景)
白块的本质是启动页绘制区域未覆盖全窗口时,露出的系统默认白色窗口背景。直接在你的启动页跳转后的业务主题Theme.UnityAds中,添加窗口背景配置,和启动页背景色保持一致即可从视觉上完全消除白块:
<item name="android:windowBackground">@color/teal_700</item>
这个配置不会增加额外性能开销,也不需要修改业务逻辑,是官方issue中推荐的首选解决方案。
2. 升级Splash Screen依赖到修复版本
1.0.0版本的Splash Screen库存在明确的横屏、折叠屏适配bug,直接升级到官方修复后的稳定版本即可解决大部分绘制逻辑问题:
在模块级build.gradle的依赖块中替换原有splashscreen依赖:
implementation "androidx.core:core-splashscreen:1.0.1"
*注意:目前不要使用1.1.0-alpha系列的测试版,该版本在部分国产ROM上存在启动黑屏的新问题。
3. 修正Manifest重复主题配置
你当前的Manifest配置中,<application>标签和入口<MainActivity>标签都设置了启动主题Theme.App.Starting,重复设置会导致Splash Screen初始化两次,放大绘制边界计算错误的问题。直接移除application标签上的theme属性,仅保留入口Activity的启动主题配置即可。
4. 手动处理启动页退出逻辑(兜底方案)
如果以上两步操作后仍有极个别机型出现白块,可以手动接管启动页退出逻辑,跳过默认的过渡动画,避免过渡帧漏出白边:
// 替换原有的installSplashScreen()调用 val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) // 手动移除启动页视图,跳过默认淡出动画 splashScreen.setOnExitAnimationListener { splashView -> splashView.remove() }
5. 横屏场景单独适配(适配平板/折叠屏)
如果你的应用需要长期支持横屏使用,可以在res/values-land目录下新建横屏专属的styles配置,手动指定横屏下的启动图标尺寸,避免库自动计算时拉伸背景绘制范围:
<!-- 新建res/values-land/styles.xml文件 --> <style name="Theme.App.Starting" parent="Theme.SplashScreen"> <item name="windowSplashScreenBackground">@color/teal_700</item> <item name="windowSplashScreenAnimatedIcon">@drawable/ic_launcher_foreground</item> <!-- 横屏下手动指定图标尺寸,不要让库自动计算 --> <item name="windowSplashScreenIconSize">96dp</item> <item name="postSplashScreenTheme">@style/Theme.UnityAds</item> </style>
以上方案全部操作完成后,在横屏模式下冷启动应用,无论是切换导航栏模式、旋转设备方向,都不会再出现边缘白块。你当前主布局根容器已经设置了和启动页一致的teal_700背景,配合窗口背景同色配置,即使系统偶发过渡帧渲染异常,也不会露出白色块。
内容的提问来源于stack exchange,提问作者Ignacio Speicher

