Indicateurs de progression

Les indicateurs de progression permettent de visualiser l'état d'une opération. Ils utilisent le mouvement pour attirer l'attention de l'utilisateur à quel point le processus est presque terminé, tel que le chargement ou le traitement des données. Elles peuvent également signifier que le traitement est en cours, sans tenir compte de son état d'avancement.

Voici les trois cas d'utilisation dans lesquels un indicateur de progression peut être utile:

  • Chargement du contenu: lors de la récupération de contenu à partir d'un réseau, par exemple lors du chargement d'une image ou de données pour un profil utilisateur.
  • Importation de fichiers: indiquez à l'utilisateur la durée de l'importation.
  • Traitement long: pendant qu'une application traite une grande quantité de données, indiquez à l'utilisateur la proportion du total des données.

Il existe deux types d'indicateurs de progression dans Material Design:

  • Déterminer: affiche exactement l'étendue des progrès effectués.
  • Indeterminate: s'anime en continu sans tenir compte de la progression.

De même, un indicateur de progression peut prendre l'une des deux formes suivantes:

  • Linéaire: barre horizontale qui se remplit de gauche à droite.
  • Circulaire: cercle dont le trait s'étend jusqu'à ce qu'il s'étende sur toute la circonférence.
Indicateur de progression linéaire associé à un indicateur de progression circulaire.
Figure 1. Il s'agit des deux types d'indicateurs de progression.

Surface de l'API

Bien qu'il existe plusieurs composables que vous pouvez utiliser pour créer des boutons d'action flottants conformes à Material Design, leurs paramètres ne diffèrent pas beaucoup. Voici quelques-uns des paramètres clés à prendre en compte:

  • progress: la progression actuelle affichée par l'indicateur. Transmettez un Float entre 0.0 et 1.0.
  • color: couleur de l'indicateur réel. C'est-à-dire la partie du composant qui reflète la progression et qui l'inclut entièrement lorsque la progression est terminée.
  • trackColor: couleur de la piste sur laquelle l'indicateur est dessiné.

Indicateurs déterminés

Un indicateur déterminé reflète exactement le niveau d'achèvement d'une action. Utilisez les composables LinearProgressIndicator ou CircularProgressIndicator, et transmettez une valeur pour le paramètre progress.

L'extrait de code suivant fournit un exemple relativement détaillé. Lorsque l'utilisateur appuie sur le bouton, l'application affiche à la fois l'indicateur de progression et lance une coroutine qui augmente progressivement la valeur de progress. Cela entraîne une itération de l'indicateur de progression.

@Composable
fun LinearDeterminateIndicator() {
    var currentProgress by remember { mutableStateOf(0f) }
    var loading by remember { mutableStateOf(false) }
    val scope = rememberCoroutineScope() // Create a coroutine scope

    Column(
        verticalArrangement = Arrangement.spacedBy(12.dp),
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxWidth()
    ) {
        Button(onClick = {
            loading = true
            scope.launch {
                loadProgress { progress ->
                    currentProgress = progress
                }
                loading = false // Reset loading when the coroutine finishes
            }
        }, enabled = !loading) {
            Text("Start loading")
        }

        if (loading) {
            LinearProgressIndicator(
                progress = { currentProgress },
                modifier = Modifier.fillMaxWidth(),
            )
        }
    }
}

/** Iterate the progress value */
suspend fun loadProgress(updateProgress: (Float) -> Unit) {
    for (i in 1..100) {
        updateProgress(i.toFloat() / 100)
        delay(100)
    }
}

Lorsque le chargement est partiellement terminé, l'indicateur linéaire de l'exemple précédent se présente comme suit:

De même, l'indicateur circulaire se présente comme suit:

Indicateurs indéterminés

Un indicateur indéterminé ne reflète pas le stade de la fin d'une opération. Il utilise plutôt un mouvement pour indiquer à l'utilisateur que le traitement est en cours, sans préciser de degré d'achèvement.

Pour créer un indicateur de progression indéterminé, utilisez le composable LinearProgressIndicator ou CircularProgressIndicator, mais ne transmettez pas de valeur pour progress. L'exemple suivant montre comment activer/désactiver un indicateur indéterminé en appuyant sur un bouton.

@Composable
fun IndeterminateCircularIndicator() {
    var loading by remember { mutableStateOf(false) }

    Button(onClick = { loading = true }, enabled = !loading) {
        Text("Start loading")
    }

    if (!loading) return

    CircularProgressIndicator(
        modifier = Modifier.width(64.dp),
        color = MaterialTheme.colorScheme.secondary,
        trackColor = MaterialTheme.colorScheme.surfaceVariant,
    )
}

Voici un exemple de cette implémentation lorsque l'indicateur est actif:

Voici un exemple de la même implémentation, mais avec LinearProgressIndicator au lieu de CircularProgressIndicator.

Ressources supplémentaires