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

Android Jetpack Compose:如何绘制填充父布局的圆角矩形

解决Canvas绘制圆角矩形填满Box的问题

你的代码里有几个关键问题,导致画出来的矩形填不满Box:

  • 没用到Canvas组件——drawRect、drawRoundRect这类绘制方法必须放在Canvas的作用域里才会生效,直接写在Box里根本不会执行绘制逻辑
  • 手动通过onGloballyPositioned拿宽高转DP完全没必要,Canvas内部能直接拿到父布局给的可用尺寸
  • 你要画圆角矩形,得用drawRoundRect,不是drawRect

下面是修正后的代码,能自动填满整个Box的宽高画圆角矩形,直接适配Column/Row的网格布局:

Box(modifier = modifier) {
    // 让Canvas占满整个Box的空间
    Canvas(modifier = Modifier.fillMaxSize()) {
        // 直接用Canvas自带的size,就是Box的实际宽高
        drawRoundRect(
            color = Color.Green,
            size = size,
            // 自定义圆角大小,把DP转成Canvas需要的像素值
            cornerRadius = CornerRadius(16.dp.toPx())
        )
        
        // 如需显示宽高,直接用当前Canvas的size转换即可
        val dpHeight = size.height.toDp()
        val dpWidth = size.width.toDp()
        Column {
            Text(text = "H $dpHeight")
            Text(text = "W $dpWidth")
        }
    }
}

重点说明:

  • Modifier.fillMaxSize()让Canvas完全填充Box,这样Canvas的size就是Box的真实尺寸,不用手动监听位置
  • drawRoundRect是专门画圆角矩形的API,cornerRadius需要传像素值,用dp.toPx()转换就行
  • 不用额外维护宽高状态,Canvas会自动跟着Box的尺寸变化,完美适配网格布局的需求

内容的提问来源于stack exchange,提问作者Adil Bhatty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:57:19