Skip to content

绘图与画布 (Canvas)

源:Compose 图形

虽然 Compose 提供了丰富的内置组件,但有时你需要绘制自定义图形(如图表、自定义进度条)。Compose 提供了声明式的 Graphics API。

1. Canvas Composable

Canvas 是一个专门用于绘制的组件。它提供了一个 DrawScope 作用域。

kotlin
Canvas(modifier = Modifier.size(100.dp)) {
    // 这里的 this 是 DrawScope
    // size.width 和 size.height 是当前画布大小
    
    // 1. 画圆
    drawCircle(
        color = Color.Red,
        radius = size.minDimension / 4
    )
    
    // 2. 画线
    drawLine(
        color = Color.Blue,
        start = Offset(0f, 0f),
        end = Offset(size.width, size.height),
        strokeWidth = 5f
    )
}

2. 常用绘制 API (DrawScope)

方法描述
drawRect绘制矩形
drawCircle绘制圆形
drawArc绘制圆弧(扇形或圆环)
drawLine绘制直线
drawPath绘制自定义路径 (Path)
drawImage绘制位图 (ImageBitmap)
kotlin
drawArc(
    color = Color.Green,
    startAngle = 0f,
    sweepAngle = 270f,
    useCenter = false, // false = 圆环, true = 扇形
    style = Stroke(width = 10f)
)
kotlin
val path = Path().apply {
    moveTo(0f, 0f)
    quadraticBezierTo(size.width / 2, size.height, size.width, 0f)
}
drawPath(path = path, color = Color.Magenta)

3. drawWithContent / drawBehind

如果你想修饰现有的 Composable(例如给 Text 加背景、边框或特效),可以使用 Modifier.drawBehindModifier.drawWithContent

kotlin
Text(
    text = "Hello Canvas",
    modifier = Modifier
        .padding(16.dp)
        .drawBehind {
            // 在内容后面绘制一个黄色圆圈
            drawCircle(color = Color.Yellow)
        }
)

4. 图形层 (GraphicsLayer)

graphicsLayer 修饰符用于对内容进行变换(平移、缩放、旋转、透明度、裁剪),它是 GPU 加速的。

kotlin
Image(
    painter = painterResource(id = R.drawable.logo),
    contentDescription = null,
    modifier = Modifier
        .graphicsLayer {
            scaleX = 1.2f
            rotationZ = 45f
            alpha = 0.5f
            shadowElevation = 10.dp.toPx()
            shape = CircleShape
            clip = true
        }
)