如何将具有固定值的路径缩放为动态可组合大小?

2024-01-02

我有一个简单的Box我想将其剪辑为自定义形状的可组合项,但每当我尝试它时,形状的尺寸仍然非常僵硬且很小。我尝试使用在路径级别上进行缩放Matrix(),但无济于事。这是示例 -

const val clockHand = "M0 80.52L2 86l2-5.48V2.74C4 1.83 3.6 0 2 0S0 1.83 0 2.74v77.78Z"
val clockHandShape = object : Shape {
    override fun createOutline(
        size: Size,
        layoutDirection: LayoutDirection,
        density: Density
    ): Outline {
        return Outline.Generic(PathParser.createPathFromPathData(clockHand).asComposePath())
    }
}

Box(
                        modifier = Modifier
                            .background(Color.Green)
                            .clip(clockHandShape)
                            .width(30.dp)
                            .height(50.dp)
                            .background(Color(0xFFFF007A))
                            .layoutId("hourHand")
) {}

作为一种控件,您可以将自定义形状替换为预定义形状,例如RectangleShape or CircleShape etc.


剪切不会使尺寸修改器失效。形状是使用来自创建该可绘制对象的值的固有像素大小创建的。

您需要做的就是使用 getBounds().size 获取 Path 的内在大小,并在使用 Matrix.postScale 创建形状时缩放到可组合大小。

@Preview
@Composable
private fun Test() {

    val clockHand = "M0 80.52L2 86l2-5.48V2.74C4 1.83 3.6 0 2 0S0 1.83 0 2.74v77.78Z"
    val path = PathParser.createPathFromPathData(clockHand).asComposePath()
    val pathSize = path.getBounds().size

    val clockHandShape = object : Shape {
        override fun createOutline(
            size: Size,
            layoutDirection: LayoutDirection,
            density: Density
        ): Outline {

            val matrix = android.graphics.Matrix()
            matrix.postScale(
                size.width / pathSize.width, size.height / pathSize.height
            )
            path.asAndroidPath().transform(matrix)

            return Outline.Generic(path)
        }
    }

    Box(
        modifier = Modifier
            .clip(clockHandShape)
            .size(90.dp, 150.dp)
            .background(Color(0xFFFF007A))
            .layoutId("hourHand")
    ) {}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将具有固定值的路径缩放为动态可组合大小? 的相关文章