如何在 Jetpack Compose 中使用虚线边框?
How to have dashed border in Jetpack Compose?
我可以使用 Modifier.border()
轻松创建普通边框,但如何创建虚线边框,如下图所示。
在正常的边框修改器中进行一些挖掘之后,我发现它使用 Stroke 对象,它可以采用参数 PathEffect让它变成虚线,这里是采用此参数的普通边框函数的修改版本。
https://gist.github.com/DavidIbrahim/236dadbccd99c4fd328e53587df35a21
使用 1.0.x
时,没有带有短划线路径的内置 Modifier.border()
。
但是您可以在 Canvas
中使用 PathEffect.dashPathEffect
。
类似于:
val stroke = Stroke(width = 2f,
pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
)
Box(Modifier.size(250.dp,60.dp),contentAlignment = Alignment.Center){
Canvas(modifier = Modifier.fillMaxSize()) {
drawRoundRect(color = Color.Red,style = stroke)
}
Text(
textAlign = TextAlign.Center,text = "Tap here to introduce yourseft")
}
我为修改器编写了这个扩展,您可以简单地使用它或修改它。
fun Modifier.dashedBorder(width: Dp, radius: Dp, color: Color) =
drawBehind {
drawIntoCanvas {
val paint = Paint()
.apply {
strokeWidth = width.toPx()
this.color = color
style = PaintingStyle.Stroke
pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
}
it.drawRoundRect(
width.toPx(),
width.toPx(),
size.width - width.toPx(),
size.height - width.toPx(),
radius.toPx(),
radius.toPx(),
paint
)
}
}
我可以使用 Modifier.border()
轻松创建普通边框,但如何创建虚线边框,如下图所示。
在正常的边框修改器中进行一些挖掘之后,我发现它使用 Stroke 对象,它可以采用参数 PathEffect让它变成虚线,这里是采用此参数的普通边框函数的修改版本。
https://gist.github.com/DavidIbrahim/236dadbccd99c4fd328e53587df35a21
使用 1.0.x
时,没有带有短划线路径的内置 Modifier.border()
。
但是您可以在 Canvas
中使用 PathEffect.dashPathEffect
。
类似于:
val stroke = Stroke(width = 2f,
pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
)
Box(Modifier.size(250.dp,60.dp),contentAlignment = Alignment.Center){
Canvas(modifier = Modifier.fillMaxSize()) {
drawRoundRect(color = Color.Red,style = stroke)
}
Text(
textAlign = TextAlign.Center,text = "Tap here to introduce yourseft")
}
我为修改器编写了这个扩展,您可以简单地使用它或修改它。
fun Modifier.dashedBorder(width: Dp, radius: Dp, color: Color) =
drawBehind {
drawIntoCanvas {
val paint = Paint()
.apply {
strokeWidth = width.toPx()
this.color = color
style = PaintingStyle.Stroke
pathEffect = PathEffect.dashPathEffect(floatArrayOf(10f, 10f), 0f)
}
it.drawRoundRect(
width.toPx(),
width.toPx(),
size.width - width.toPx(),
size.height - width.toPx(),
radius.toPx(),
radius.toPx(),
paint
)
}
}