Chỉ báo tiến trình

Chỉ báo tiến trình cho biết trạng thái của hoạt động một cách trực quan. Chúng sử dụng chuyển động để giúp người dùng chú ý đến mức độ hoàn tất của quá trình, chẳng hạn như tải hoặc xử lý dữ liệu. Các biểu ngữ này cũng có thể biểu thị rằng quá trình xử lý đang diễn ra mà không tham chiếu đến mức độ hoàn tất có thể của quá trình.

Hãy xem xét ba trường hợp sử dụng sau, trong đó bạn có thể sử dụng chỉ báo tiến trình:

  • Tải nội dung: Trong khi tìm nạp nội dung từ mạng, chẳng hạn như tải hình ảnh hoặc dữ liệu cho hồ sơ người dùng.
  • Tải tệp lên: Cung cấp cho người dùng phản hồi về thời gian tải lên.
  • Xử lý lâu: Trong khi ứng dụng đang xử lý một lượng lớn dữ liệu, hãy thông báo cho người dùng lượng dữ liệu hoàn chỉnh.

Trong Material Design, có hai loại chỉ báo tiến trình:

  • Determinate (Xác định): Hiển thị chính xác tiến trình đã thực hiện.
  • Không xác định: Hoạt ảnh liên tục mà không quan tâm đến tiến trình.

Tương tự như vậy, chỉ báo tiến trình có thể ở một trong hai dạng sau:

  • Tuyến tính: Một thanh ngang lấp đầy từ trái sang phải.
  • Vòng tròn: Một hình tròn có nét vẽ theo chiều dài cho đến khi bao phủ toàn bộ chu vi của vòng tròn.
Chỉ báo tiến trình tuyến tính bên cạnh chỉ báo tiến trình vòng tròn.
Hình 1. Hai loại chỉ báo tiến trình.

Nền tảng API

Mặc dù có một số thành phần kết hợp mà bạn có thể sử dụng để tạo các nút hành động nổi nhất quán với Material Design, nhưng tham số của chúng không khác nhau nhiều. Trong số các thông số chính, bạn cần lưu ý là những thông số sau:

  • progress: Tiến trình hiện tại mà chỉ báo hiển thị. Truyền một Float trong khoảng từ 0.0 đến 1.0.
  • color: Màu của chỉ báo thực tế. Điều đó có nghĩa là một phần của thành phần phản ánh tiến trình và bao gồm đầy đủ thành phần khi tiến trình hoàn tất.
  • trackColor: Màu của tuyến đường mà chỉ báo được vẽ trên đó.

Xác định các chỉ báo

Chỉ báo xác định phản ánh chính xác mức độ hoàn tất của một hành động. Hãy sử dụng các thành phần kết hợp LinearProgressIndicator hoặc CircularProgressIndicator và truyền giá trị cho tham số progress.

Đoạn mã sau đây cung cấp một ví dụ tương đối chi tiết. Khi người dùng nhấn nút này, ứng dụng sẽ hiển thị chỉ báo tiến trình và khởi chạy coroutine để tăng dần giá trị của progress. Điều này khiến chỉ báo tiến trình lặp lại lần lượt.

@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)
    }
}

Khi quá trình tải hoàn tất một phần, chỉ báo tuyến tính trong ví dụ trước sẽ xuất hiện như sau:

Tương tự, chỉ báo vòng tròn sẽ xuất hiện như sau:

Các chỉ báo không xác định

Chỉ báo không xác định không phản ánh mức độ hoàn thành một thao tác. Thay vào đó, chỉ báo này sử dụng chuyển động để cho người dùng biết rằng quá trình xử lý đang diễn ra, mặc dù không chỉ định bất kỳ mức độ hoàn thành nào.

Để tạo một chỉ báo tiến trình không xác định, hãy sử dụng thành phần kết hợp LinearProgressIndicator hoặc CircularProgressIndicator, nhưng không truyền giá trị cho progress. Ví dụ sau minh hoạ cách bạn có thể bật/tắt một chỉ báo không xác định bằng cách nhấn nút.

@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,
    )
}

Sau đây là ví dụ về cách triển khai này khi chỉ báo đang hoạt động:

Sau đây là ví dụ về cách triển khai tương tự nhưng với LinearProgressIndicator thay vì CircularProgressIndicator.

Tài nguyên khác