Android 12下SplashScreen图片拉伸变形及适配异常问题
我来帮你搞定这个Android 12上的启动屏图标异常问题,咱们先理清楚问题根源,再一步步解决:
问题原因分析
Android 12引入的全新SplashScreen API对图标显示有严格规范:系统会自动将图标放入默认的圆形容器中,如果你的图标不是适配的矢量图,或者用了不合适的布局嵌套(比如直接用bitmap标签),就会出现拉伸、裁剪甚至黑屏的情况。而Android 11因为是兼容模式,所以不会有这个限制。
解决方案
方案1:遵循Android 12图标规范(推荐)
直接使用矢量图标(VectorDrawable),并确保图标的viewBox是正方形(比如0 0 24 24或0 0 48 48),这样系统会自动处理图标在圆形容器中的适配,完全避免拉伸和裁剪。
修改你的Splash主题,直接引用矢量图标即可:
<style name="SplashTheme" parent="Theme.SplashScreen"> <item name="windowSplashScreenBackground">@android:color/black</item> <!-- 直接使用适配的矢量图标 --> <item name="windowSplashScreenAnimatedIcon">@drawable/ic_my_splash_icon</item> <item name="postSplashScreenTheme">@style/Theme.AppTheme</item> </style>
这种方式不需要额外的layer-list,系统会自动帮你把图标居中显示在黑色背景上,同时兼容Android 11和12。
方案2:自定义layer-list布局(需额外装饰时用)
如果必须用layer-list(比如要添加额外的背景元素),不要用bitmap标签,而是通过指定item的宽高和缩放类型来控制图标显示:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 背景层 --> <item> <shape android:shape="rectangle"> <solid android:color="@android:color/black" /> </shape> </item> <!-- 图标层:指定固定宽高,用fitCenter确保图标完整显示 --> <item android:width="120dp" android:height="120dp" android:gravity="center"> <vector android:drawable="@drawable/ic_my_splash_icon" android:scaleType="fitCenter"/> </item> </layer-list>
然后在主题中把windowSplashScreenAnimatedIcon指向这个layer-list即可。这里的宽高可以根据你的图标大小调整,fitCenter会让图标保持原有比例,完整显示在指定的item区域内,不会被拉伸或裁剪。
方案3:修复设计视图不显示问题
如果修改后Android Studio设计视图无法渲染图标,试试这两步:
- 检查你的图标是否是矢量图,或者是否在所有分辨率的drawable目录下都有对应尺寸的资源;
- 执行
Build > Clean Project,然后Build > Rebuild Project,清理缓存后重新渲染。
为什么之前的bitmap标签会导致黑屏?
bitmap标签的嵌套方式并不被Android 12的SplashScreen API完全支持,而且如果没有正确设置尺寸和gravity,会导致drawable无法正确加载,最终只显示背景层的黑色,或者直接黑屏。所以不推荐用这种方式。
内容的提问来源于stack exchange,提问作者amar2108

