Gli indicatori di avanzamento mostrano visivamente lo stato di un'operazione. Usano il movimento per portare all'attenzione dell'utente quanto sia quasi completato il processo, ad esempio caricare o elaborare i dati. Possono anche indicare che l'elaborazione sta richiedendo posizione, senza riferirsi a quanto potrebbe essere vicina al completamento.
Considera questi tre casi d'uso in cui potresti utilizzare un indicatore di avanzamento:
- Caricamento dei contenuti: durante il recupero dei contenuti da una rete, ad esempio il caricamento. un'immagine o i dati di un profilo utente.
- Caricamento di file: fornisci all'utente un feedback sulle tempistiche del caricamento.
- Elaborazione lunga: mentre un'app elabora una grande quantità di dati, comunicano all'utente quanti dati totali sono stati completati.
In Material Design, esistono due tipi di indicatori di avanzamento:
- Determina: mostra esattamente il grado di avanzamento fatto.
- Indeterminato: l'animazione viene eseguita in modo continuo, senza tenere conto dei progressi.
Analogamente, un indicatore di avanzamento può avere una delle seguenti forme:
- Lineare: una barra orizzontale che si riempie da sinistra a destra.
- Circolare: un cerchio il cui tratto cresce in lunghezza fino a includere la l'intera circonferenza del cerchio.
Piattaforma API
Sebbene esistano diversi componibili utilizzabili per creare indicatori di avanzamento coerenti con Material Design, i loro parametri non differiscono molto. Tra I parametri chiave da tenere presenti sono i seguenti:
progress
: l'avanzamento attuale visualizzato dall'indicatore. Supera unFloat
tra0.0
e1.0
.color
: il colore dell'indicatore effettivo. In altre parole, la parte componente che riflette l'avanzamento e che lo comprende per intero. una volta completati i progressi.trackColor
: il colore della traccia su cui è tracciato l'indicatore.
Determinare gli indicatori
Un determinato indicatore riflette esattamente il livello di completamento di un'azione. Utilizza uno dei due
LinearProgressIndicator
o CircularProgressIndicator
componibili e passare un valore per il parametro progress
.
Il seguente snippet fornisce un esempio relativamente dettagliato. Quando l'utente
preme il pulsante, l'app visualizza l'indicatore di avanzamento e avvia un
coroutine che aumenta gradualmente il valore di progress
. Questo fa sì che
l'indicatore di avanzamento per ripetere l'iterazione a rotazione.
@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) } }
Quando il caricamento è parzialmente completato, l'indicatore lineare nella precedente è il seguente:
Analogamente, l'indicatore circolare appare come segue:
Indicatori indeterminati
Un indicatore di indeterminato non riflette quanto manca al completamento di un'operazione dall'indirizzo IP interno. Utilizza invece il movimento per indicare all'utente che l'elaborazione è in corso, ma senza specificare il grado di completamento.
Per creare un indicatore di avanzamento indeterminato, utilizza l'LinearProgressIndicator
o CircularProgressIndicator
componibile, ma non passare un valore per
progress
. L'esempio seguente mostra come attivare/disattivare una
indicatore di indeterminatezza con la pressione di un pulsante.
@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, ) }
Di seguito è riportato un esempio di questa implementazione quando l'indicatore è attivo:
Di seguito è riportato un esempio della stessa implementazione, ma con
LinearProgressIndicator
anziché CircularProgressIndicator
.