Saltearse al contenido

CircularProgressIndicator

MaterialMaterial 3
Imagen del componente Circular Progress Indicator - MaterialImagen del componente Circular Progress Indicator - Material 3

El CircularProgressIndicator es un componente definido como el trazo de un diámetro circular animado, es utilizado para representar visualmente el avance de una operación.

También puede ser utilizado para indicar la ejecución de alguna tarea sin proporcionar indicios de que tan próxima esté a finalizar.

Implementación

Definición del componente

Indicador indeterminado

Terminal window
@Composable
fun CircularProgressIndicator(
modifier: Modifier = Modifier,
color: Color = MaterialTheme.colors.primary,
strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth,
backgroundColor: Color = Color.Transparent,
strokeCap: StrokeCap = StrokeCap.Square
)

Indicador determinado

Terminal window
@Composable
fun CircularProgressIndicator(
progress: @FloatRange(from = 0.0, to = 1.0) Float,
modifier: Modifier = Modifier,
color: Color = MaterialTheme.colors.primary,
strokeWidth: Dp = ProgressIndicatorDefaults.StrokeWidth,
backgroundColor: Color = Color.Transparent,
strokeCap: StrokeCap = StrokeCap.Butt
)
AtributoDescripción
progressFloatRange situado en el intervalo cerrado de 0.0 a 1.0, donde 0.0 representa ningún progreso y 1.0 la finalización de éste. “Los valores fuera del rango son forzados a entrar en él”.
modifierModificador que implementará el composable.
colorColor del indicador de progreso.
strokeWidthAncho del trazo para el indicador de progreso.
backgroundColorEl color del recorrido sobre el que se dibuja el indicador.
strokeCapCapa para usar en los extremos del indicador.

Ejemplos

Indicador indeterminado

Ejemplo de CircularProgressIndicator indeterminado material
Terminal window
@Composable
fun IndeterminateCircularIndicatorExample() {
var loading by remember { mutableStateOf(false) }
val scope = rememberCoroutineScope()
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
if (loading) {
CircularProgressIndicator()
}
Spacer(modifier = Modifier.requiredHeight(30.dp))
Button(
onClick = {
loading = true
scope.launch {
delay(2000) // <-- Operación de carga.
loading = false
}
},
enabled = !loading
) {
Text("Start loading")
}
}
}

Indicador determinado

Ejemplo de CircularProgressIndicator determinado material
Terminal window
@Composable
fun DeterminateCircularProgressIndicatorExample() {
var currentProgress by remember { mutableStateOf(0.0f) }
var loading by remember { mutableStateOf(false) }
val animatedProgress by animateFloatAsState(
targetValue = currentProgress,
animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec,
label = ""
)
val scope = rememberCoroutineScope()
Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
CircularProgressIndicator(progress = animatedProgress)
Spacer(Modifier.requiredHeight(30.dp))
Button(
onClick = {
loading = true
scope.launch {
loadProgress { progress ->
currentProgress = progress
}
loading = false
}
},
enabled = !loading
) {
Text("Start loading")
}
}
}
suspend fun loadProgress(updateProcess: (Float) -> Unit) {
for (current in 1..100) {
updateProcess( current.toFloat() / 100 )
delay(50) //<-- Operación de carga.
}
}