進度指標會以視覺化的方式呈現作業狀態,它們會使用動態效果,讓使用者注意到程序 (例如載入或處理資料) 完成的進度。也可以表示處理程序正在進行,但不代表處理程序已接近完成。
請考慮下列三種可能會使用進度指標的用途:
- 載入內容:從網路擷取內容時,例如載入使用者個人資料的圖片或資料。
- 檔案上傳:提供使用者有關上傳時間的意見回饋。
- 處理時間過長:當應用程式處理大量資料時,請向使用者說明完成的總量。
Material Design 中有兩種進度指標:
- Determinate:顯示進度百分比。
- 未確定:無視進度,持續播放動畫。
同樣地,進度指標可採用下列任一形式:
- 線性:從左到右填滿的水平列。
- 圓形:圓形的筆劃會逐漸變長,直到包含整個圓形的周長為止。
API 途徑
雖然有多種可組合項可用來建立與 Material Design 保持一致的進度指標,但其參數並沒有顯著差異。您應留意的重要參數包括:
progress
:指標顯示的目前進度。在0.0
和1.0
之間傳遞Float
。color
:實際指標的顏色。也就是說,元件中會反映進度,並在進度完成時完整涵蓋元件的部分。trackColor
:指標繪製時所用的軌道顏色。
確定指標
確定指標會準確反映動作的完成程度。請使用 LinearProgressIndicator
或 CircularProgressIndicator
可組合項,並傳遞 progress
參數的值。
以下程式碼片段提供較詳細的範例。當使用者按下按鈕時,應用程式會顯示進度指標,並啟動協同程式,進而逐漸提高 progress
的值。這會導致進度指標依序疊代。
@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) } }
載入作業完成一半後,上例中的線性指標會顯示如下:
圓形指標同樣會如下所示:
未確定指標
不確定的指標並不會反映作業完成的進度,而是透過動畫向使用者表示處理作業正在進行中,但不會指定任何完成程度。
如要建立不確定的進度指標,請使用 LinearProgressIndicator
或 CircularProgressIndicator
可組合項,但請勿為 progress
傳入值。以下範例說明如何透過按下按鈕來切換不確定指標。
@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, ) }
以下是指標啟用時的實作範例:
以下是相同實作的範例,但使用 LinearProgressIndicator
而非 CircularProgressIndicator
。