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

如何在Jetpack Compose中获取Canvas视图实际宽高(无需手动扣内边距)

如何在Jetpack Compose中直接获取Canvas的实际宽高

你完全可以直接获取Canvas自身的实际宽高,无需手动计算内边距的扣除量,这里有两种最常用的方法:

方法一:直接使用Canvas Lambda中的size属性

Canvas的绘制lambda参数自带一个size对象,它已经自动考虑了所有Modifier(包括padding)对尺寸的影响,直接给出当前Canvas的实际像素宽高。

修改后的代码如下:

fun Greeting() {
    Column {
        Canvas(modifier = Modifier
            .padding(16.dp)
            .fillMaxWidth()
            .height(200.dp)
            .background(Color.Yellow)) {
            drawPath(Path().apply {
                // 直接用size.width和size.height获取Canvas实际宽高
                lineTo(size.width, size.height)
            }, Color.Black, style = Stroke(2.dp.toPx()))
        }
    }
}

说明:

  • size.width是Canvas扣除左右padding后的实际宽度,size.height是扣除上下padding后的实际高度(这里你设置了固定200.dp,所以height就是200.dp转成的像素值)。
  • 注意把Stroke(2.dp.value)改成Stroke(2.dp.toPx()),dp.value只是dp的数值,没有转换为像素,会导致线条粗细在不同密度的屏幕上显示不一致。

方法二:用Modifier.onSizeChanged获取尺寸(适用于Canvas外部需要使用的场景)

如果需要在Canvas的绘制lambda之外获取它的尺寸,可以通过Modifier.onSizeChanged回调来监听尺寸变化:

fun Greeting() {
    var canvasSize by remember { mutableStateOf(IntSize.Zero) }
    
    Column {
        Canvas(modifier = Modifier
            .padding(16.dp)
            .fillMaxWidth()
            .height(200.dp)
            .background(Color.Yellow)
            .onSizeChanged { newSize ->
                canvasSize = newSize
            }) {
            drawPath(Path().apply {
                lineTo(canvasSize.width.toFloat(), canvasSize.height.toFloat())
            }, Color.Black, style = Stroke(2.dp.toPx()))
        }
    }
}

这种方法适合需要在Canvas外部(比如其他组件)使用该尺寸的场景,不过如果只是在Canvas内部绘制,方法一的size属性更直接高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:17:26