Android启动页如何让1:1比例Drawable按高度适配并保持比例?
Android启动页1:1宽高比Drawable适配解决方案
以下是几种可行的解决方案,按兼容性和易用性排序:
方案1:用BitmapDrawable包裹(兼容所有Android版本)
直接在layer-list中用<bitmap>标签包裹你的1:1图标,通过adjustViewBounds保持比例:
修改launch_background.xml:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 白色背景层 --> <item android:drawable="@android:color/white" /> <!-- 保持1:1比例的图标层 --> <item> <bitmap android:src="@drawable/your_1_1_logo" android:gravity="center" android:adjustViewBounds="true" /> </item> </layer-list>
adjustViewBounds="true"会让Drawable根据自身固有宽高比缩放,避免被拉伸变形gravity="center"保证图标在屏幕居中显示,自动取宽高中的较小值作为正方形边长适配屏幕- 不管是VectorDrawable还是BitmapDrawable,都可以用这种方式包裹适配
方案2:Android 12+官方SplashScreen API(推荐)
如果你的App最低兼容版本≥31,官方API会自动处理图标比例,适配逻辑更规范:
- 修改
styles.xml中的启动主题:
<style name="LaunchTheme" parent="Theme.SplashScreen"> <!-- 启动页背景色 --> <item name="android:windowBackground">@android:color/white</item> <!-- 设置1:1比例的启动图标 --> <item name="windowSplashScreenAnimatedIcon">@drawable/your_1_1_logo</item> <!-- 图标背景色(与整体背景保持一致即可) --> <item name="windowSplashScreenBackgroundColor">@android:color/white</item> <!-- 启动完成后过渡到的App主题 --> <item name="postSplashScreenTheme">@style/AppTheme</item> </style>
- 在主Activity的
onCreate中添加过渡代码:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 启用SplashScreen过渡逻辑 installSplashScreen() setContentView(R.layout.activity_main) } }
方案3:自定义Drawable(特殊场景备用)
如果以上方案都不满足需求,可通过自定义Drawable强制保持1:1比例:
class SquareDrawable(private val drawable: Drawable) : Drawable() { override fun draw(canvas: Canvas) { val availableWidth = bounds.width() val availableHeight = bounds.height() // 取宽高中的最小值作为正方形边长 val squareSize = min(availableWidth, availableHeight) // 计算居中绘制的坐标 val left = (availableWidth - squareSize) / 2f val top = (availableHeight - squareSize) / 2f // 设置图标的绘制边界为正方形区域 drawable.setBounds(left.toInt(), top.toInt(), (left + squareSize).toInt(), (top + squareSize).toInt()) drawable.draw(canvas) } override fun setAlpha(alpha: Int) { drawable.alpha = alpha } override fun setColorFilter(colorFilter: ColorFilter?) { drawable.colorFilter = colorFilter } override fun getOpacity(): Int = drawable.opacity override fun onBoundsChange(bounds: Rect) { super.onBoundsChange(bounds) invalidateSelf() } }
使用时可通过代码将该Drawable设置为windowBackground,或在XML中注册后通过<drawable>标签引用。
内容的提问来源于stack exchange,提问作者Exprove
相关产品推荐
相关产品推荐

