Search code examples
androidandroid-jetpack-composeandroid-jetpack

step progress bar with android compose


Currently I'm trying to find an easy way to implement a step progress bar with compose like this:

enter image description here

Does anyone have experience with that? Is there maybe a good library?


Solution

  • I don't think you need a library from this one, a simple and quick 'do it yourself' solution could be something like this:

    @Composable
    fun StepsProgressBar(modifier: Modifier = Modifier, numberOfSteps: Int, currentStep: Int) {
        Row(
            modifier = modifier,
            verticalAlignment = Alignment.CenterVertically
        ) {
            for (step in 0..numberOfSteps) {
                Step(
                    modifier = Modifier.weight(1F),
                    isCompete = step < currentStep,
                    isCurrent = step == currentStep
                )
            }
        }
    }
    
    @Composable
    fun Step(modifier: Modifier = Modifier, isCompete: Boolean, isCurrent: Boolean) {
        val color = if (isCompete || isCurrent) Color.Red else Color.LightGray
        val innerCircleColor = if (isCompete) Color.Red else Color.LightGray
    
        Box(modifier = modifier) {
    
            //Line
            Divider(
                modifier = Modifier.align(Alignment.CenterStart),
                color = color,
                thickness = 2.dp
            )
    
            //Circle
            Canvas(modifier = Modifier
                .size(15.dp)
                .align(Alignment.CenterEnd)
                .border(
                    shape = CircleShape,
                    width = 2.dp,
                    color = color
                ),
                onDraw = {
                    drawCircle(color = innerCircleColor)
                }
            )
        }
    }
    
    @Preview
    @Composable
    fun StepsProgressBarPreview() {
        val currentStep = remember { mutableStateOf(1) }
        StepsProgressBar(modifier = Modifier.fillMaxWidth(), numberOfSteps = 5, currentStep = currentStep.value)
    }
    

    This will be the result:

    enter image description here