Indikator progres menampilkan status operasi secara visual. Animasi ini menggunakan gerakan untuk menarik perhatian pengguna tentang seberapa dekat proses penyelesaian, seperti memuat atau memproses data. Indikator ini juga dapat menandakan bahwa pemrosesan sedang berlangsung, tanpa merujuk pada seberapa dekat penyelesaiannya.
Pertimbangkan tiga kasus penggunaan berikut saat Anda mungkin menggunakan indikator progres:
- Memuat konten: Saat mengambil konten dari jaringan, seperti memuat gambar atau data untuk profil pengguna.
- Upload file: Beri pengguna masukan tentang berapa lama waktu yang dibutuhkan untuk mengupload.
- Pemrosesan yang lama: Saat aplikasi memproses data dalam jumlah besar, sampaikan kepada pengguna berapa banyak total yang telah selesai.
Dalam Desain Material, ada dua jenis indikator progres:
- Determinate: Menampilkan secara tepat seberapa besar progres yang telah dibuat.
- Tidak ditentukan (Indeterminate): Beranimasi terus-menerus tanpa memperhatikan progres.
Demikian pula, indikator progres dapat menggunakan salah satu dari dua bentuk berikut:
- Linier: Batang horizontal yang terisi dari kiri ke kanan.
- Lingkaran: Lingkaran yang goresannya bertambah panjang hingga mencakup seluruh keliling lingkaran.
API Surface
Meskipun ada beberapa composable yang dapat Anda gunakan untuk membuat indikator progres yang konsisten dengan Desain Material, parameternya tidak terlalu berbeda. Di antara parameter utama yang harus Anda ingat adalah sebagai berikut:
progress
: Progres saat ini yang ditampilkan indikator. TeruskanFloat
antara0.0
dan1.0
.color
: Warna indikator sebenarnya. Artinya, bagian komponen yang mencerminkan progres dan yang sepenuhnya mencakup komponen saat progres selesai.trackColor
: Warna jalur tempat indikator digambar.
Indikator determinan
Indikator determinan mencerminkan secara tepat seberapa lengkap suatu tindakan. Gunakan composable LinearProgressIndicator
atau CircularProgressIndicator
dan teruskan nilai untuk parameter progress
.
Cuplikan berikut memberikan contoh yang relatif mendetail. Saat pengguna
menekan tombol, aplikasi akan menampilkan indikator progres, dan meluncurkan
coroutine yang secara bertahap meningkatkan nilai progress
. Hal ini menyebabkan
indikator progres berulang secara bergiliran.
@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) } }
Saat pemuatan selesai sebagian, indikator linear dalam contoh sebelumnya akan muncul sebagai berikut:
Demikian pula, indikator melingkar akan muncul sebagai berikut:
Indikator tidak tentu
Indikator tidak ditentukan tidak mencerminkan seberapa dekat penyelesaian suatu operasi. Sebaliknya, indikator ini menggunakan gerakan untuk menunjukkan kepada pengguna bahwa pemrosesan sedang berlangsung, meskipun tanpa menentukan tingkat penyelesaian.
Untuk membuat indikator progres tidak ditentukan, gunakan komponen LinearProgressIndicator
atau CircularProgressIndicator
, tetapi jangan teruskan nilai untuk
progress
. Contoh berikut menunjukkan cara mengalihkan indikator tidak ditentukan dengan menekan tombol.
@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, ) }
Berikut adalah contoh penerapan ini saat indikator aktif:
Berikut adalah contoh penerapan yang sama, tetapi dengan
LinearProgressIndicator
, bukan CircularProgressIndicator
.