Круговой индикатор выполнения градиента в режиме создания реактивного ранца

Я хочу создать круговой индикатор выполнения с таким градиентом, используя компоновку реактивного ранца.

Я пытался сделать это с помощью Brush.sweepGradient, однако это сработало неправильно, поскольку начальный угол индикатора выполнения и градиент развертки не совпадают, и нет параметра для управления углом в SweepGradient. Как это сделать??

0
1
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что возможно присвоить CircularProgressIndicator градиентный цвет, потому что на данный момент его параметр color принимает только тип Color, и я не вижу никакой перегрузки с типом Brush для его цвета.

Один из способов добиться желаемого — нарисовать кольцо с помощью Canvas, однако простого кольца недостаточно. С помощью некоторых настроек вы можете добиться этого:

@Composable
fun GradientProgress(
    modifier: Modifier = Modifier,
    diameter: Dp = 100.dp,
    width: Float = 10f,
    colors: List<Color> = listOf(Color.Cyan, Color.Blue),
    progress: Float = .75f
) {
    Box(
        content = {
            Text(
                text = "${(progress * 100).toInt()}",
                modifier = Modifier.align(Alignment.Center)
            )
            Canvas(
                modifier = modifier
                    .size(diameter)
                    .rotate(-90f)
                    .graphicsLayer {
                        rotationY = 360f
                    },
                onDraw = {
                    drawArc(
                        color = Color.LightGray,
                        startAngle = 0f,
                        sweepAngle = 360f,
                        false,
                        style = Stroke(width = width)
                    )
                    drawArc(
                        brush = Brush.sweepGradient(colors = colors),
                        startAngle = 0f,
                        sweepAngle = progress * 360f,
                        false,
                        style = Stroke(width = width)
                    )
                }
            )
        }
    )
}

Другие вопросы по теме