Jetpack 中的波浪框组成

Jél*_*chu 2 android android-canvas kotlin android-jetpack android-jetpack-compose

有没有办法用Canvas制作一个顶部有波浪形的盒子?

我想知道这个效果是否可以直接用Canvas来实现,不需要有滚动动画。

在此输入图像描述

Phi*_*hov 6

不太清楚你为什么要谈论Canvas。要裁剪这样的视图,您可以使用自定义Shape并将其应用到您的视图中Modifier.clip。这是您可以使用的形状:

class WavyShape(
    private val period: Dp,
    private val amplitude: Dp,
) : Shape {
    override fun createOutline(
        size: Size,
        layoutDirection: LayoutDirection,
        density: Density,
    ) = Outline.Generic(Path().apply {
        val wavyPath = Path().apply {
            val halfPeriod = with(density) { period.toPx() } / 2
            val amplitude = with(density) { amplitude.toPx() }
            moveTo(x = -halfPeriod / 2, y = amplitude)
            repeat(ceil(size.width / halfPeriod + 1).toInt()) { i ->
                relativeQuadraticBezierTo(
                    dx1 = halfPeriod / 2,
                    dy1 = 2 * amplitude * (if (i % 2 == 0) 1 else -1),
                    dx2 = halfPeriod,
                    dy2 = 0f,
                )
            }
            lineTo(size.width, size.height)
            lineTo(0f, size.height)
        }
        val boundsPath = Path().apply {
            addRect(Rect(offset = Offset.Zero, size = size))
        }
        op(wavyPath, boundsPath, PathOperation.Intersect)
    })
}
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因您确实需要在内部使用它,您可以将我在内部创建的内容Canvas传递给,以便剪切块的内容。PathWavyShapeDrawScope.clipPathclipPath

将自定义形状应用到您的Image或任何其他视图:

Image(
    painter = painterResource(id = R.drawable.my_image_1),
    contentDescription = null,
    contentScale = ContentScale.FillBounds,
    modifier = Modifier
        .clip(WavyShape(period = 100.dp, amplitude = 50.dp))
)
Run Code Online (Sandbox Code Playgroud)

结果: