1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp
@Composable fun 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 ) { 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 )
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 @Composable fun CircularProgressBarPreview() { Box(Modifier.padding(16.dp)) { CircularProgressBar( progress = 0.75f, size = 80.dp, strokeWidth = 8.dp, progressColor = Color(0xFF0085F7), backgroundColor = Color(0xffCCE7FF), ) }
}
|