android 剪切到此形状会使所有大小修饰符无效

g52tjvyc  于 2023-02-17  发布在  Android
关注(0)|答案(1)|浏览(113)

我有一个简单的Box Composable,我想把它裁剪成一个自定义形状,但无论何时我尝试它,形状的大小仍然非常小。我尝试过使用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")
) {}

作为一个控件,你可以用一个预定义的形状来替换自定义的形状,比如RectangleShapeCircleShape等。

3qpi33ja

3qpi33ja1#

剪切不会使大小修改器无效。形状是使用来自创建该可绘制对象的值的固有像素大小创建的。
您所需要做的就是使用getBounds()获取Path的固有大小。在使用matrix.postScale创建形状时,size和scale将变为可组合大小。

@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")
    ) {}
}

相关问题