Android如何通过windowBackground实现启动页centerCrop裁剪效果?
当然可以!你完全可以通过windowBackground实现类似ImageView的centerCrop缩放效果,不用依赖Activity布局来做启动页。我给你一步步拆解实现方法:
第一步:创建带centerCrop配置的Drawable资源
在res/drawable目录下新建一个XML文件(比如命名为splash_background.xml),用bitmap标签来定义图片的缩放规则:<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/your_splash_image" <!-- 替换成你的启动页图片 --> android:gravity="center" android:scaleType="centerCrop" />这里的
android:scaleType="centerCrop"就是核心,它会让图片按比例缩放至填满整个屏幕,同时裁剪掉超出屏幕的部分,和ImageView的centerCrop效果完全一致;gravity="center"则保证图片在屏幕中居中对齐。第二步:给启动页主题配置这个Drawable
在res/values/styles.xml(或对应的夜间模式样式文件)中,定义一个启动页专用主题,把windowBackground设置为刚才创建的Drawable:<style name="SplashTheme" parent="Theme.MaterialComponents.NoActionBar"> <!-- 根据你的基础主题调整 --> <item name="android:windowBackground">@drawable/splash_background</item> <item name="android:windowFullscreen">true</item> <!-- 如果需要全屏启动页就加上 --> <item name="android:windowDrawsSystemBarBackgrounds">false</item> <!-- 避免状态栏/导航栏干扰 --> </style>第三步:给启动Activity绑定这个主题
打开AndroidManifest.xml,找到你的启动Activity,把它的android:theme属性设置为上面的SplashTheme:<activity android:name=".SplashActivity" android:theme="@style/SplashTheme" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
这样设置后,应用启动时会立即加载这个带centerCrop效果的启动页,完全符合你的需求——既不用写Activity布局,又能避免直接设置图片为windowBackground时的拉伸问题。
需要注意的是,如果你的启动页图片和屏幕比例差异较大,centerCrop会裁剪掉图片的边缘部分,这是该效果的正常表现,和ImageView的centerCrop行为一致。
内容的提问来源于stack exchange,提问作者xinaiz

