Jetpack Compose-进度条及圆形进度条绘制 发表于 2025-08-15 | 分类于 android Jetpack Compose-进度条及圆形进度条绘制 前言自带的组件效果11234567891011121314151617181920212223242526272829303132@Preview@Composablefun ProgressBarPreview() { Column( Modifier .width(120.dp) .wrapContentHeight() .padding(16.dp) .background(Color.White) ) { // 圆形不确定进度条 CircularProgressIndicator( progress = { 0.75f }, modifier = Modifier.padding(16.dp), color = ProgressIndicatorDefaults.circularColor, strokeWidth = ProgressIndicatorDefaults.CircularStrokeWidth, trackColor = Color(0xffCCE7FF), strokeCap = ProgressIndicatorDefaults.CircularDeterminateStrokeCap, gapSize = 8.dp ) // 线性确定进度条 LinearProgressIndicator( progress = { 0.75f }, modifier = Modifier.padding(16.dp), color = ProgressIndicatorDefaults.linearColor, trackColor = ProgressIndicatorDefaults.linearTrackColor, strokeCap = ProgressIndicatorDefaults.LinearStrokeCap, ) }} 效果 效果2123456789101112131415161718192021222324252627282930313233@Preview@Composablefun ProgressBarPreview() { Column( Modifier .width(120.dp) .wrapContentHeight() .padding(16.dp) .background(Color.White) ) { // 圆形不确定进度条 CircularProgressIndicator( progress = { 0.75f }, modifier = Modifier.padding(10.dp), color = Color(0xFF0085F7), strokeWidth = ProgressIndicatorDefaults.CircularStrokeWidth, trackColor = Color(0xffCCE7FF), strokeCap = ProgressIndicatorDefaults.CircularDeterminateStrokeCap, gapSize = 0.dp ) // 线性确定进度条 LinearProgressIndicator( progress = { 0.75f }, modifier = Modifier.padding(10.dp), color = Color(0xFF0085F7), trackColor = Color(0xffCCE7FF), strokeCap = ProgressIndicatorDefaults.LinearStrokeCap, gapSize = 0.dp ) }} 效果 去除结尾圆点1234567891011121314Box( Modifier .width(120.dp) .height(8.dp)) { LinearProgressIndicator( progress = { 0.75f }, modifier = Modifier.fillMaxSize(), color = Color(0xFF0085F7), trackColor = Color(0xffCCE7FF), gapSize = 0.dp, drawStopIndicator = {} )} 效果 自定义组件自带的效果不满足我们的要求,所以这里自定义组件 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788import androidx.compose.foundation.Canvasimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.paddingimport androidx.compose.foundation.layout.sizeimport androidx.compose.runtime.Composableimport androidx.compose.ui.Modifierimport androidx.compose.ui.geometry.Offsetimport androidx.compose.ui.geometry.Sizeimport androidx.compose.ui.graphics.Colorimport androidx.compose.ui.graphics.StrokeCapimport androidx.compose.ui.graphics.drawscope.Strokeimport androidx.compose.ui.tooling.preview.Previewimport androidx.compose.ui.unit.Dpimport androidx.compose.ui.unit.dp/** * 自定义圆形进度条组件 * * @param progress 进度值,范围 0f-1f * @param modifier 修饰符 * @param size 进度条大小 * @param strokeWidth 进度条线宽 * @param backgroundColor 背景圆环颜色 * @param progressColor 进度圆环颜色 * @param strokeCap 线帽样式 */@Composablefun CircularProgressBar( progress: Float, modifier: Modifier = Modifier, size: Dp = 48.dp, backgroundWidth: Dp = 4.dp, strokeWidth: Dp = 8.dp, startAngle: Float = -90f, backgroundColor: Color = Color.Transparent, progressColor: Color = Color.Blue, strokeCap: StrokeCap = StrokeCap.Round) { // 确保进度在 0f 到 1f 之间 val clampedProgress = progress.coerceIn(0f, 1f) Canvas( modifier = modifier.size(size) ) { // 绘制背景圆环 drawArc( color = backgroundColor, startAngle = 0f, sweepAngle = 360f, useCenter = false, style = Stroke( width = backgroundWidth.toPx(), cap = strokeCap ), size = Size(size.toPx(), size.toPx()), topLeft = Offset.Zero ) // 绘制进度圆环 (360度 * 进度) drawArc( color = progressColor, startAngle = startAngle, // 从顶部开始 sweepAngle = 360f * clampedProgress, useCenter = false, style = Stroke( width = strokeWidth.toPx(), cap = strokeCap ), size = Size(size.toPx(), size.toPx()), topLeft = Offset.Zero ) }}@Preview@Composablefun CircularProgressBarPreview() { Box(Modifier.padding(16.dp)) { CircularProgressBar( progress = 0.75f, size = 80.dp, strokeWidth = 8.dp, progressColor = Color(0xFF0085F7), backgroundColor = Color(0xffCCE7FF), ) }} 效果