แถบแอป

แถบแอปคือคอนเทนเนอร์ที่ให้สิทธิ์เข้าถึงฟีเจอร์หลักและรายการการนำทางแก่ผู้ใช้ แถบแอปมี 2 ประเภท ได้แก่ แถบแอปด้านบนและแถบแอปด้านล่าง ลักษณะที่ปรากฏและวัตถุประสงค์ของแถบแอปแต่ละประเภทมีดังนี้

ประเภท

ลักษณะที่ปรากฏ

วัตถุประสงค์

แถบแอปด้านบน

อยู่ด้านบนสุดของหน้าจอ

ให้สิทธิ์เข้าถึงงานและข้อมูลสำคัญ โดยทั่วไปจะแสดงชื่อ รายการการทำงานหลัก และรายการการนำทางบางรายการ

แถบแอปด้านล่าง

อยู่ด้านล่างสุดของหน้าจอ

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

ตัวอย่างแถบแอปด้านบนและด้านล่าง
รูปที่ 1 แถบแอปด้านบน (ซ้าย) และแถบแอปด้านล่าง (ขวา)

หากต้องการใช้แถบแอปด้านบนและแถบแอปด้านล่าง ให้ใช้ฟังก์ชันที่ประกอบกันได้ TopAppBar และ BottomAppBar ตามลำดับ ฟังก์ชันเหล่านี้ช่วยให้คุณสร้างอินเทอร์เฟซที่สอดคล้องกันซึ่งห่อหุ้มการนำทางและการควบคุมการทำงาน และสอดคล้องกับหลักการออกแบบ Material Design

แถบแอปด้านบน

ตารางต่อไปนี้แสดงแถบแอปด้านบน 4 ประเภท

ประเภท

ตัวอย่าง

เล็ก: สำหรับหน้าจอที่ไม่ต้องมีการนำทางหรือการทำงานมากนัก

แถบแอปด้านบนขนาดเล็ก

จัดกึ่งกลาง: สำหรับหน้าจอที่มีการทำงานหลักเพียงอย่างเดียว

แถบแอปด้านบนที่จัดกึ่งกลาง

ปานกลาง: สำหรับหน้าจอที่ต้องมีการนำทางและการทำงานในระดับปานกลาง

แถบแอปด้านบนขนาดกลาง

ใหญ่: สำหรับหน้าจอที่ต้องมีการนำทางและการทำงานจำนวนมาก

แถบแอปด้านบนขนาดใหญ่

แพลตฟอร์ม API

ฟังก์ชันที่ประกอบกันได้ต่างๆ ที่ช่วยให้คุณใช้แถบแอปด้านบน 4 ประเภทแตกต่างกันได้นั้นค่อนข้างคล้ายกัน โดยมีพารามิเตอร์หลักหลายรายการร่วมกัน ดังนี้

  • title: ข้อความที่ปรากฏในแถบแอป
  • navigationIcon: ไอคอนหลักสำหรับการนำทาง ปรากฏทางด้านซ้ายของแถบแอป
  • actions: ไอคอนที่ให้สิทธิ์เข้าถึงการทำงานหลักแก่ผู้ใช้ โดยจะปรากฏทางด้านขวาของแถบแอป
  • scrollBehavior: กำหนดวิธีที่แถบแอปด้านบนตอบสนองต่อการเลื่อนเนื้อหาภายในของ Scaffold
  • colors: กำหนดลักษณะที่ปรากฏของแถบแอป

ลักษณะการทำงานของฟีเจอร์เลื่อน

คุณสามารถควบคุมวิธีที่แถบแอปตอบสนองเมื่อผู้ใช้เลื่อนเนื้อหาภายในของ Scaffold ที่กำหนด โดยสร้างอินสแตนซ์ของ TopAppBarScrollBehavior แล้วส่งไปยังแถบแอปด้านบนสำหรับ scrollBehavior พารามิเตอร์

TopAppBarScrollBehavior มี 3 ประเภท ดังนี้

  • enterAlwaysScrollBehavior: เมื่อผู้ใช้ดึงเนื้อหาภายในของ Scaffold ขึ้น แถบแอปด้านบนจะยุบ แถบแอปจะขยายเมื่อผู้ใช้เริ่มดึงเนื้อหาภายในลง
  • exitUntilCollapsedScrollBehavior: คล้ายกับ enterAlwaysScrollBehavior แต่แถบแอปจะขยายก็ต่อเมื่อผู้ใช้ดึงเนื้อหาลงจนสุด
  • pinnedScrollBehavior: แถบแอปจะยังคงอยู่ในตำแหน่งเดิมและไม่ตอบสนองต่อการเลื่อน

ตัวอย่างต่อไปนี้แสดงตัวเลือกเหล่านี้บางส่วน

ตัวอย่าง

ส่วนต่อไปนี้แสดงการใช้งานแถบแอปด้านบน 4 ประเภท รวมถึงตัวอย่างต่างๆ เกี่ยวกับวิธีควบคุมลักษณะการทำงานของฟีเจอร์เลื่อน

เล็ก

หากต้องการสร้างแถบแอปด้านบนขนาดเล็ก ให้ใช้ฟังก์ชันที่ประกอบกันได้ TopAppBar ตัวอย่างต่อไปนี้แสดงแถบแอปด้านบนพื้นฐานที่มีเพียงชื่อ

ตัวอย่างต่อไปนี้ไม่ได้ส่งค่าสำหรับ scrollBehavior ไปยัง TopAppBar จึงไม่ตอบสนองต่อการเลื่อนเนื้อหาภายใน

@Composable
fun SmallTopAppBarExample() {
    Scaffold(
        topBar = {
            TopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text("Small Top App Bar")
                }
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

การใช้งานนี้จะปรากฏดังนี้

ตัวอย่างแถบแอปด้านบนขนาดเล็ก
รูปที่ 2 แถบแอปด้านบนขนาดเล็ก

จัดกึ่งกลาง

แถบแอปด้านบนที่จัดกึ่งกลางนั้นโดยพื้นฐานแล้วจะเหมือนกับแถบแอปขนาดเล็ก แต่ชื่อจะอยู่กึ่งกลางภายในคอมโพเนนต์ หากต้องการใช้แถบแอปประเภทนี้ ให้ใช้ฟังก์ชันที่ประกอบกันได้ โดยเฉพาะ CenterAlignedTopAppBar

ตัวอย่างนี้ใช้ enterAlwaysScrollBehavior() เพื่อรับค่าที่จะส่งสำหรับ scrollBehavior ดังนั้น แถบจะยุบเมื่อผู้ใช้เลื่อนเนื้อหาภายในของ Scaffold

@Composable
fun CenterAlignedTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),

        topBar = {
            CenterAlignedTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Centered Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior,
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

การใช้งานนี้จะปรากฏดังนี้

ตัวอย่างแถบแอปด้านบนที่จัดกึ่งกลาง
รูปที่ 3 แถบแอปด้านบนที่จัดกึ่งกลาง

ปานกลาง

แถบแอปด้านบนขนาดกลางจะวางชื่อไว้ใต้ไอคอนเพิ่มเติม หากต้องการสร้าง แถบแอปประเภทนี้ ให้ใช้ฟังก์ชันที่ประกอบกันได้ MediumTopAppBar

ตัวอย่างนี้ใช้ enterAlwaysScrollBehavior() เพื่อรับค่าที่จะส่งสำหรับ scrollBehavior เช่นเดียวกับข้อมูลโค้ดก่อนหน้า

@Composable
fun MediumTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            MediumTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Medium Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

การใช้งานนี้จะปรากฏดังนี้ พร้อมการสาธิตลักษณะการทำงานของฟีเจอร์เลื่อนจาก enterAlwaysScrollBehavior()

รูปที่ 4 แถบแอปด้านบนขนาดกลางที่ยุบเมื่อผู้ใช้เลื่อนขึ้นและขยายเมื่อผู้ใช้เลื่อนลง

ใหญ่

แถบแอปด้านบนขนาดใหญ่จะคล้ายกับแถบแอปขนาดกลาง แต่มีระยะห่างระหว่างชื่อกับไอคอนมากกว่าและใช้พื้นที่บนหน้าจอโดยรวมมากขึ้น หากต้องการสร้างแถบแอปประเภทนี้ ให้ใช้ฟังก์ชันที่ประกอบกันได้ LargeTopAppBar

ตัวอย่างนี้ใช้ exitUntilCollapsedScrollBehavior() เพื่อรับค่าที่จะส่งสำหรับ scrollBehavior ซึ่งแตกต่างจากข้อมูลโค้ดก่อนหน้า ดังนั้น แถบจะยุบเมื่อผู้ใช้เลื่อนเนื้อหาภายในของ Scaffold แต่จะขยายเมื่อผู้ใช้เลื่อนไปที่ส่วนท้ายของเนื้อหาภายใน

@Composable
fun LargeTopAppBarExample() {
    val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())

    Scaffold(
        modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
        topBar = {
            LargeTopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text(
                        "Large Top App Bar",
                        maxLines = 1,
                        overflow = TextOverflow.Ellipsis
                    )
                },
                navigationIcon = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.AutoMirrored.Filled.ArrowBack,
                            contentDescription = "Localized description"
                        )
                    }
                },
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            imageVector = Icons.Filled.Menu,
                            contentDescription = "Localized description"
                        )
                    }
                },
                scrollBehavior = scrollBehavior
            )
        },
    ) { innerPadding ->
        ScrollContent(innerPadding)
    }
}

การใช้งานนี้จะปรากฏดังนี้

หน้าจอในแอปที่มีแถบแอปด้านล่างซึ่งมีไอคอนการดำเนินการทางด้านซ้าย และปุ่มการทำงานแบบลอยทางด้านขวา
รูปที่ 5 ตัวอย่างการใช้งานแถบแอปด้านบนขนาดใหญ่

แถบแอปด้านล่าง

หากต้องการสร้างแถบแอปด้านล่าง ให้ใช้ฟังก์ชันที่ประกอบกันได้ BottomAppBar การใช้ฟังก์ชันที่ประกอบกันได้นี้ค่อนข้างคล้ายกับฟังก์ชันที่ประกอบกันได้ของแถบแอปด้านบนที่อธิบายไว้ในส่วนก่อนหน้าของหน้านี้ คุณส่งฟังก์ชันที่ประกอบกันได้สำหรับพารามิเตอร์หลักต่อไปนี้

  • actions: ชุดไอคอนที่ปรากฏทางด้านซ้ายของแถบ โดยทั่วไปจะเป็นการทำงานหลักสำหรับหน้าจอที่กำหนด หรือรายการการนำทาง
  • floatingActionButton: ปุ่มการทำงานแบบลอยที่ปรากฏทางด้านขวาของแถบ

@Composable
fun BottomAppBarExample() {
    Scaffold(
        bottomBar = {
            BottomAppBar(
                actions = {
                    IconButton(onClick = { /* do something */ }) {
                        Icon(Icons.Filled.Check, contentDescription = "Localized description")
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Edit,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Mic,
                            contentDescription = "Localized description",
                        )
                    }
                    IconButton(onClick = { /* do something */ }) {
                        Icon(
                            Icons.Filled.Image,
                            contentDescription = "Localized description",
                        )
                    }
                },
                floatingActionButton = {
                    FloatingActionButton(
                        onClick = { /* do something */ },
                        containerColor = BottomAppBarDefaults.bottomAppBarFabColor,
                        elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation()
                    ) {
                        Icon(Icons.Filled.Add, "Localized description")
                    }
                }
            )
        },
    ) { innerPadding ->
        Text(
            modifier = Modifier.padding(innerPadding),
            text = "Example of a scaffold with a bottom app bar."
        )
    }
}

การใช้งานนี้จะปรากฏดังนี้

หน้าจอในแอปที่มีแถบแอปด้านล่างซึ่งมีไอคอนการดำเนินการทางด้านซ้าย และปุ่มการทำงานแบบลอยทางด้านขวา
รูปที่ 6 ตัวอย่างการใช้งานแถบแอปด้านล่าง

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