如何在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
相关产品推荐
相关产品推荐

