【问题标题】:How can I draw a shadow for a path in canvas in jetpack compose如何在jetpack compose中为画布中的路径绘制阴影
【发布时间】:2022-01-10 05:58:28
【问题描述】:

我正在为 jetpack compose 中的顶部栏绘制自定义形状。我想为路径画一个阴影。

 val topBarShapePath = Path().apply {
        moveTo(dpToPixels(leftPadding), 0f)
        lineTo(dpToPixels(leftPadding), dpToPixels(dpValue = 110.dp))
        arcTo(
                Rect(
                        dpToPixels(leftPadding),
                        dpToPixels(dpValue = 110.dp),
                        dpToPixels(dpValue = 32.dp),
                        dpToPixels(dpValue = 135.dp)
                ), -180f, -90f, true)
        lineTo(
                dpToPixels(dpValue = triangleStartX),
                dpToPixels(dpValue = rectHeight))
        lineTo(
                dpToPixels(dpValue = screenWidth),
                dpToPixels(dpValue = triangleEndY)
        )
        lineTo(dpToPixels(dpValue = screenWidth), 0f)
        lineTo(dpToPixels(dpValue = leftPadding), 0f)
    }
    
    Column(
            modifier = Modifier
                    .fillMaxWidth()
                    .height(400.dp)
                    .drawBehind {
                        val finalWidth = 40.dp.toPx()
                        drawPath(
                                topBarShapePath,
                                color = topbarcolor)
                        drawOutline(
                            outline = Outline.Generic(
                                topBarShapePath),
                            brush = Brush.horizontalGradient(),
                            style = Stroke(
                                width = 1.dp.toPx(),
                            )
                        )
                    }
    )

这是我用来绘制形状的代码,“drawOutline”是尝试为路径绘制阴影,但我不知道如何模糊线条。

任何帮助表示赞赏。

这是我正在寻找的结果的屏幕截图:

【问题讨论】:

    标签: android canvas draw android-jetpack-compose shadow


    【解决方案1】:

    目前无法在 Canvas 中绘制阴影,但您可以使用 Modifier.shadow 进行绘制,指定所需的自定义形状,如下所示:

    class TopBarShape(/*some parameters*/): Shape {
        override fun createOutline(
            size: Size,
            layoutDirection: LayoutDirection,
            density: Density,
        ) = Outline.Generic(Path().apply {
            // your path code
        })
    }
    
    Modifier.shadow(elevation = 10.dp, shape = TopBarShape(/*your parameters*/))
    

    遗憾的是,这个修饰符不允许进行太多修改,it's one 是最受关注的 Compose 问题,所以希望它将来会改变,但因为它不是最新的 1.1-beta,我至少不会期望它直到1.2。

    如果你仍然认为手动绘制阴影是必要的功能,你可以create a feature request。

    【讨论】:

      猜你喜欢
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多