You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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会自动处理图标比例,适配逻辑更规范:

  1. 修改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>
  1. 在主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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:30:59