79420300

Date: 2025-02-07 09:11:29
Score: 0.5
Natty:
Report link

Stepped progress bar with android compose

My requirement was slightly different from the actual question so i have update the code based on answers from other folks.

Thank You everyone for the help, here is the updated code

@Composable
fun StepsProgressBar(modifier: Modifier = Modifier, numberOfSteps: Int, currentStep: Int, color: Color) {
    Row(
        modifier = modifier,
        verticalAlignment = Alignment.CenterVertically
    ) {
        for (step in 0..numberOfSteps) {
            Step(
                modifier = Modifier.weight(1F),
                isCompete = step < currentStep,
                isLast = step == numberOfSteps,
                isPending = currentStep - step == 1,
                stepColor = color
            )
        }
    }
}

@Composable
fun Step(modifier: Modifier = Modifier, isCompete: Boolean, isLast: Boolean, isPending: Boolean, stepColor: Color) {
    val color: Color = if (isCompete) stepColor else colorResource(id = R.color.Gray300)
    val sColor: Color = if (!isPending && isCompete) stepColor else colorResource(id = R.color.Gray300)

    Box(modifier = modifier) {
        if (!isLast) {
            //Line
            HorizontalDivider(
                modifier = Modifier.align(Alignment.Center),
                color = color,
                thickness = 4.dp
            )
        }
        //Circle
        Canvas(modifier = Modifier
            .size(12.dp)
            .align(Alignment.CenterStart),
            onDraw = {
                drawCircle(color = color)
            }
        )
    }
    if (!isLast) {
        Box(modifier = modifier) {

            //Line
            HorizontalDivider(
                modifier = Modifier.align(Alignment.CenterEnd).background(
                    Brush.horizontalGradient(
                        startX = 0f,
                        endX = 25f,
                    colors = listOf(
                        color,
                        sColor
                    )
                )),
                color = Color.Transparent,
                thickness = 4.dp
            )
        }
    }
}

For @Preview() use like this

StepsProgressBar(modifier = Modifier.fillMaxWidth(), numberOfSteps = 5, currentStep = 3, color = Color.Red)

In case if you want to use it in XML based UI

<androidx.compose.ui.platform.ComposeView
            android:id="@+id/progress_view"
            android:layout_width="match_parent"
            android:layout_height="12dp"/>

findViewById<ComposeView>(R.id.progress_view).setContent {
MaterialTheme {
                    Surface {
                        StepsProgressBar(
                            modifier = Modifier.fillMaxWidth(),
                            numberOfSteps = 5,
                            currentStep = 3
                            ),
                            color = colorResource(
                                id = R.color.Primary
                        )
                    }
                }
}

Output:

enter image description here

Reasons:
  • Blacklisted phrase (0.5): Thank You
  • Long answer (-1):
  • Has code block (-0.5):
  • User mentioned (1): @Preview
  • Low reputation (0.5):
Posted by: MadLeo