Android Splash Screen图片拉伸 屏幕不匹配时如何实现裁剪
问题说明
在应用中配置Splash Screen启动闪屏时,闪屏图片始终被拉伸至铺满屏幕边缘,需求为:当屏幕尺寸与图片尺寸不匹配时,对图片做等比缩放+裁剪处理,而非拉伸变形。测试设备为Google Pixel 3a,尝试调整多种android:gravity属性组合均未生效。
现有配置
launch_screen.xml
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="fill|clip_horizontal" android:src="@drawable/splash_screen"/> </item> </layer-list>
styles.xml
<resources> <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar"> <item name="android:editTextBackground">@drawable/rn_edit_text_material</item> </style> <style name="SplashTheme" parent="AppTheme"> <item name="android:windowBackground">@drawable/launch_screen</item> </style> </resources>
解决方案
原有配置不生效的核心原因是android:gravity属性使用错误:fill规则会强制图片在XY轴拉伸以完全铺满容器,直接导致图片变形;clip_horizontal仅在图片原始尺寸大于容器、且未触发缩放规则时才会裁剪超出部分,和fill搭配时完全无法生效。
按以下两步修改即可实现等比缩放裁剪的效果:
- 修改launch_screen.xml的bitmap配置,替换gravity属性为
center_crop,修改后代码如下:<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <bitmap android:gravity="center_crop" android:src="@drawable/splash_screen"/> </item> </layer-list>center_crop的效果和ImageView的scaleType="centerCrop"完全一致:保持图片原始宽高比,等比缩放图片直到图片的宽、高都大于等于容器对应尺寸,最后裁剪超出容器的部分,居中显示图片内容,不会出现拉伸变形。该属性从API 11开始支持,覆盖所有当前主流安卓设备。 - 调整闪屏图片的存放目录:将
splash_screen图片移动到res/drawable-nodpi目录下,不要存放在默认drawable目录或带密度后缀的目录(如drawable-xxhdpi)。nodpi目录下的资源不会被系统根据设备屏幕密度自动缩放,避免系统提前缩放图片导致裁剪尺寸计算错误。
原有styles.xml的配置不需要修改,调整完成后重新编译运行即可看到裁剪而非拉伸的闪屏效果。
内容的提问来源于stack exchange,提问作者chocolate cake
相关产品推荐
相关产品推荐

