You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jetpack Compose中为drawLine绘制的进度条添加自定义圆角?

实现自定义圆角的渐变进度条

原来的drawLine通过StrokeCap.Round实现的圆角是固定为线宽的一半,无法自定义圆角大小。要实现自定义圆角,推荐改用drawRoundRect来绘制背景和进度条,这种方式能完全控制圆角半径:

代码实现步骤

1. 绘制背景圆角矩形

替换原来的drawLine,用drawRoundRect绘制带自定义圆角的背景:

drawRoundRect(
    color = backgroundIndicatorColor,
    size = size,
    cornerRadius = CornerRadius(x = 16.dp.toPx(), y = 16.dp.toPx()) // 替换为你需要的圆角尺寸
)

2. 绘制渐变进度条

先创建渐变画笔,再根据进度绘制带圆角的进度区域:

// 创建水平渐变画笔
val gradientBrush = Brush.horizontalGradient(
    colors = listOf(Color(0xFF667EEA), Color(0xFF764BA2))
)

// 计算进度宽度
val progressWidth = size.width * progress // progress为0f-1f的进度值

// 绘制进度,根据进度是否满值调整右侧圆角
drawRoundRect(
    brush = gradientBrush,
    size = Size(width = progressWidth, height = size.height),
    cornerRadius = if (progress >= 1f) {
        CornerRadius(x = 16.dp.toPx(), y = 16.dp.toPx()) // 满进度时两端均为圆角
    } else {
        CornerRadius(x = 16.dp.toPx(), y = 16.dp.toPx()).copy(right = 0f) // 未满时右侧为直角
    }
)

完整Composable示例

@Composable
fun CustomRoundProgressIndicator(
    progress: Float,
    modifier: Modifier = Modifier,
    backgroundColor: Color = Color.Gray.copy(alpha = 0.3f),
    gradientColors: List<Color> = listOf(Color(0xFF667EEA), Color(0xFF764BA2)),
    cornerRadius: Dp = 16.dp
) {
    val cornerRadiusPx = cornerRadius.toPx()
    val gradientBrush = Brush.horizontalGradient(colors = gradientColors)

    Canvas(modifier = modifier) {
        // 绘制背景
        drawRoundRect(
            color = backgroundColor,
            size = size,
            cornerRadius = CornerRadius(cornerRadiusPx, cornerRadiusPx)
        )

        // 绘制进度
        val progressWidth = size.width * progress.coerceIn(0f, 1f)
        drawRoundRect(
            brush = gradientBrush,
            size = Size(progressWidth, size.height),
            cornerRadius = if (progress >= 1f) {
                CornerRadius(cornerRadiusPx, cornerRadiusPx)
            } else {
                CornerRadius(cornerRadiusPx, cornerRadiusPx).copy(right = 0f)
            }
        )
    }
}

如果需要进度未填满时两端仍保持圆角,直接去掉if判断,使用统一的cornerRadius即可,可根据实际UI需求调整。

内容的提问来源于stack exchange,提问作者TinaTT2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:16:16