สัญญาณบอกสถานะความคืบหน้า

สัญญาณบอกสถานะความคืบหน้าจะแสดงสถานะการดำเนินการให้เห็น ไอคอนเหล่านี้ใช้การเคลื่อนไหวเพื่อดึงดูดความสนใจของผู้ใช้เกี่ยวกับความคืบหน้าของกระบวนการ เช่น การโหลดหรือประมวลผลข้อมูล นอกจากนี้ ยังอาจบ่งบอกว่ามีการดำเนินการอยู่ โดยไม่ระบุว่าใกล้จะเสร็จสิ้นมากน้อยเพียงใด

ลองพิจารณากรณีการใช้งาน 3 กรณีต่อไปนี้ที่คุณอาจใช้ตัวบ่งชี้ความคืบหน้า

  • การโหลดเนื้อหา: ขณะดึงข้อมูลเนื้อหาจากเครือข่าย เช่น การโหลดรูปภาพหรือข้อมูลสําหรับโปรไฟล์ผู้ใช้
  • การอัปโหลดไฟล์: แสดงความคิดเห็นให้ผู้ใช้ทราบเกี่ยวกับระยะเวลาที่ใช้ในการอัปโหลด
  • การประมวลผลที่ใช้เวลานาน: ขณะที่แอปประมวลผลข้อมูลจำนวนมาก ให้แจ้งให้ผู้ใช้ทราบถึงเปอร์เซ็นต์ของงานที่เสร็จสมบูรณ์

สัญญาณบอกสถานะความคืบหน้าใน Material Design มี 2 ประเภท ได้แก่

  • กำหนด: แสดงความคืบหน้าที่ทำได้
  • ไม่แน่นอน: ภาพเคลื่อนไหวจะแสดงอย่างต่อเนื่องโดยไม่คำนึงถึงความคืบหน้า

ในทํานองเดียวกัน ตัวบ่งชี้ความคืบหน้าอาจอยู่ในรูปแบบใดรูปแบบหนึ่งต่อไปนี้

  • เส้นตรง: แถบแนวนอนที่เติมจากซ้ายไปขวา
  • วงกลม: วงกลมที่มีเส้นขอบยาวขึ้นจนครอบคลุมเส้นรอบวงทั้งหมดของวงกลม
สัญญาณบอกสถานะความคืบหน้าแบบเชิงเส้นข้างสัญญาณบอกสถานะความคืบหน้าแบบวงกลม
รูปที่ 1 สัญญาณบอกสถานะความคืบหน้า 2 ประเภท

แพลตฟอร์ม API

แม้ว่าจะมีคอมโพสิชันหลายรายการที่คุณสามารถใช้เพื่อสร้างตัวบ่งชี้ความคืบหน้าซึ่งสอดคล้องกับ Material Design แต่พารามิเตอร์ของคอมโพสิชันเหล่านี้ก็ไม่ได้แตกต่างกันมากนัก พารามิเตอร์หลักที่ควรคำนึงถึงมีดังนี้

  • progress: ความคืบหน้าปัจจุบันที่ตัวบ่งชี้แสดง ส่ง Float ระหว่าง 0.0 ถึง 1.0
  • 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

แหล่งข้อมูลเพิ่มเติม