Box ใน Jetpack Compose: คืออะไร คุณสมบัติ composable และวิธีการทำงาน

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-06-29 เวลาอ่าน: 10 นาที

Box เป็นฟังก์ชัน composable ใน Jetpack Compose สำหรับวางองค์ประกอบย่อยซ้อนกันเป็นเลเยอร์ แตกต่างจาก Row และ Column ตรงที่ Box ซ้อนองค์ประกอบในพื้นที่เดียวกัน ทำให้สามารถสร้างพื้นผิว ป้าย และตัวบ่งชี้ที่กำหนดเองได้ ตาม Google Android Documentation, 2025 Box เป็นหนึ่งในสามคอนเทนเนอร์พื้นฐานของ Compose และให้การจัดการเลเยอร์ที่ยืดหยุ่นด้วย Modifier.align และ Modifier.zIndex

ประเด็นสำคัญ

  • Box เป็นคอนเทนเนอร์ Compose ที่ซ้อนองค์ประกอบย่อยทับกัน โดยองค์ประกอบถัดไปจะถูกวาดทับองค์ประกอบก่อนหน้า
  • contentAlignment กำหนดการจัดตำแหน่งของเนื้อหาทั้งหมดใน Box ในขณะที่ Modifier.align ให้การวางตำแหน่งเฉพาะสำหรับแต่ละองค์ประกอบย่อย
  • Modifier.zIndex ควบคุมลำดับการวาดขององค์ประกอบ ทำให้สามารถยกบางเลเยอร์ให้อยู่เหนือเลเยอร์อื่นได้
  • Box ใช้สำหรับวางข้อความทับรูปภาพ สร้างป้ายแจ้งเตือน ป้าย และเลเยอร์พื้นหลัง
  • Modifier.clipToBounds จำกัดการเรนเดอร์องค์ประกอบย่อยให้อยู่ภายในขอบเขตของ Box ป้องกันเนื้อหาไหลออกนอกคอนเทนเนอร์

Box ใน Jetpack Compose คืออะไร?

Box เป็นฟังก์ชัน composable ที่วางองค์ประกอบย่อยในพื้นที่เดียวกัน โดยซ้อนกันทับ องค์ประกอบย่อยแรกจะถูกวาดไว้ด้านล่าง สุดท้ายอยู่ด้านบน โดยค่าเริ่มต้น Box จะปรับตามขนาดขององค์ประกอบย่อยที่ใหญ่ที่สุด

แตกต่างจาก Row และ Column ตรงที่ Box ไม่ได้จัดเรียงองค์ประกอบตามลำดับ — องค์ประกอบย่อยทั้งหมดใช้พื้นที่เดียวกันและสามารถทับซ้อนกันได้ สิ่งนี้ทำให้ Box ขาดไม่ได้ในการประกอบเลเยอร์อินเทอร์เฟซ

ขนาดของ Box ถูกกำหนดโดยกฎ: หากไม่มีองค์ประกอบย่อยใดมีขนาดคงที่ Box จะยุบลงเป็นขนาดต่ำสุด หากมีองค์ประกอบย่อยอย่างน้อยหนึ่งตัวมี Modifier.fillMaxSize Box จะขยายจนถึงขนาดสูงสุด

ตาม Android Developers Blog, 2024 Box เป็นคอนเทนเนอร์ที่มีประสิทธิภาพมากที่สุดใน Compose สำหรับกรณีที่องค์ประกอบไม่ต้องการการจัดเรียงตามลำดับ Box ไม่ทำการวัดเพิ่มเติมสำหรับการวางตำแหน่ง แตกต่างจาก Row และ Column

ลายเซ็นพื้นฐานของ Box

Box รับพารามิเตอร์ modifier, contentAlignment และ propagateMinConstraints องค์ประกอบย่อยทั้งหมดถูกส่งในบล็อก content โดยแต่ละตัวสามารถมีตัวปรับเปลี่ยนของตัวเองได้

kotlin
@Composable
fun BoxExample() {
    Box(
        modifier = Modifier.size(200.dp),
        contentAlignment = Alignment.Center
    ) {
        Box(
            modifier = Modifier.fillMaxSize().background(Color.Blue)
        )
        Text(
            text = "สวัสดี",
            color = Color.White
        )
    }
}

ContentAlignment และ Modifier.align ใน Box

contentAlignment เป็นพารามิเตอร์ของ Box ที่กำหนดการจัดตำแหน่งเริ่มต้นสำหรับองค์ประกอบย่อยทั้งหมด หากไม่ระบุ จะใช้ Alignment.TopStart — องค์ประกอบจะถูกวางไว้ที่มุมบนซ้ายของคอนเทนเนอร์

Modifier.align อนุญาตให้แทนที่การจัดตำแหน่งสำหรับองค์ประกอบย่อยเฉพาะโดยอิสระจาก contentAlignment ตัวอย่างเช่น Box ที่มี Alignment.Center สามารถมีองค์ประกอบที่มี Modifier.align(Alignment.BottomEnd) ซึ่งจะถูกตรึงไว้ที่มุมล่างขวา

ตาม Material Design Guidelines, 2025 Modifier.align มีประโยชน์สำหรับการวางตำแหน่งป้ายและไอคอนบนภาพพื้นหลัง สิ่งนี้ช่วยให้ตั้งค่าการจัดตำแหน่งทั่วไปสำหรับเนื้อหาทั้งหมดของ Box และแทนที่สำหรับองค์ประกอบแต่ละรายการ

ตารางค่า Alignment

ค่าตำแหน่งใน Boxตัวอย่างการใช้งาน
TopStartมุมบนซ้ายไอคอนที่มุมการ์ด
TopCenterกึ่งกลางด้านบนหัวข้อเหนือรูปภาพ
Centerกึ่งกลางคอนเทนเนอร์ข้อความกึ่งกลางบนพื้นหลัง
BottomEndมุมล่างขวาจำนวนการแจ้งเตือนบนไอคอน
BottomCenterกึ่งกลางด้านล่างคำอธิบายใต้รูปภาพ

ตัวอย่างกับ Modifier.align

ในตัวอย่างนี้ Box มีภาพพื้นหลังและป้ายที่มุมล่างขวา Modifier.align(BottomEnd) วางตำแหน่งป้ายโดยอิสระจาก contentAlignment ของ Box

kotlin
@Composable
fun BadgeExample() {
    Box(
        modifier = Modifier.size(120.dp),
        contentAlignment = Alignment.Center
    ) {
        Box(
            modifier = Modifier.size(100.dp).background(Color.Gray)
        )
        Box(
            modifier = Modifier
                .size(30.dp)
                .align(Alignment.BottomEnd)
                .background(Color.Red, CircleShape)
        )
    }
}

การจัดการเลเยอร์ด้วย zIndex

Modifier.zIndex ควบคุมลำดับการวาดขององค์ประกอบภายใน Box โดยค่าเริ่มต้น องค์ประกอบจะถูกวาดตามลำดับการประกาศ — องค์ประกอบแรกอยู่ด้านล่าง สุดท้ายอยู่ด้านบน zIndex แทนที่ลำดับนี้

องค์ประกอบที่มี zIndex 2.0f จะถูกวาดเหนือองค์ประกอบที่มี zIndex 1.0f โดยไม่ขึ้นกับลำดับในโค้ด ค่า zIndex ที่เป็นลบจะวางองค์ประกอบไว้ใต้ตัวอื่น ตาม Android Developers, 2024 zIndex มีผลต่อลำดับการวาดเท่านั้น ไม่มีผลต่อการจัดการเหตุการณ์สัมผัส

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

kotlin
@Composable
fun ZIndexExample() {
    Box(modifier = Modifier.size(150.dp)) {
        Box(modifier = Modifier.size(80.dp)
            .align(Alignment.TopStart)
            .zIndex(2.0f)
            .background(Color.Green))
        Box(modifier = Modifier.size(100.dp)
            .align(Alignment.Center)
            .zIndex(1.0f)
            .background(Color.Blue))
    }
}

ตัวอย่างการใช้งาน Box ที่ใช้งานได้จริง

Box ถูกใช้อย่างแพร่หลายในการวางข้อความทับรูปภาพ ภาพพื้นหลังจะถูกวางก่อน จากนั้นข้อความที่มี Modifier.align สำหรับวางตำแหน่งบนพื้นหลัง

kotlin
@Composable
fun ImageWithOverlay() {
    Box(modifier = Modifier.fillMaxWidth().height(200.dp)) {
        Image(
            painter = painterResource(R.drawable.photo),
            contentDescription = "Photo",
            modifier = Modifier.fillMaxSize(),
            contentScale = ContentScale.Crop
        )
        Box(
            modifier = Modifier.fillMaxSize()
                .background(Color.Black.copy(alpha = 0.4f))
        )
        Text(
            text = "หัวข้อ",
            color = Color.White,
            modifier = Modifier.align(Alignment.BottomStart)
                .padding(16.dp)
        )
    }
}

ตัวอย่างที่สองคือ Box สำหรับสร้างตัวบ่งชี้การโหลด Box ครอบคลุมพื้นที่หน้าจอทั้งหมด และ CircularProgressIndicator จะถูกจัดกึ่งกลางผ่าน contentAlignment

kotlin
@Composable
fun LoadingOverlay() {
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        CircularProgressIndicator(
            modifier = Modifier.size(48.dp)
        )
    }
}

ข้อจำกัดขนาดของ Box

Box โดยค่าเริ่มต้นจะปรับตามขนาดของเนื้อหา หากองค์ประกอบย่อยมีขนาดต่างกัน Box จะใช้ขนาดขององค์ประกอบที่ใหญ่ที่สุด เมื่อไม่มีองค์ประกอบย่อย Box จะยุบลงเป็นขนาดต่ำสุด

Modifier.clipToBounds จำกัดการเรนเดอร์องค์ประกอบย่อยให้อยู่ภายในขอบเขตของ Box หากไม่มีตัวปรับเปลี่ยนนี้ องค์ประกอบย่อยสามารถขยายออกนอก Box ได้ ตาม Material Design Guidelines, 2025 clipToBounds เป็นสิ่งจำเป็นเมื่อใช้ Modifier.scale หรือ Modifier.graphicsLayer ภายใน Box

propagateMinConstraints เป็นพารามิเตอร์ของ Box ที่ส่งต่อข้อจำกัดขนาดต่ำสุดไปยังองค์ประกอบย่อย หากตั้งค่าเป็น true องค์ประกอบย่อยจะต้องไม่เล็กกว่าขนาดต่ำสุดที่กำหนดไว้สำหรับ Box ผ่าน Modifier.size หรือ Modifier.constrain

  • Box — คอนเทนเนอร์ขั้นต่ำหากไม่มีการกำหนดขนาดและไม่มีองค์ประกอบย่อยที่มี fillMaxSize
  • Modifier.clipToBounds ป้องกันเนื้อหาไหลออกนอกขอบเขต Box
  • propagateMinConstraints ส่งต่อข้อจำกัดต่ำสุดไปยังองค์ประกอบย่อย

คำถามที่พบบ่อย

Box แตกต่างจาก Row และ Column อย่างไร?

Box ซ้อนองค์ประกอบทับกัน ในขณะที่ Row และ Column จัดเรียงตามลำดับ Box เหมาะสำหรับเลเยอร์และการวางซ้อน Row สำหรับแถวแนวนอน และ Column สำหรับรายการแนวตั้ง

จะจัดตำแหน่งองค์ประกอบหนึ่งใน Box ให้แตกต่างจากตัวอื่นได้อย่างไร?

ใช้ Modifier.align สำหรับองค์ประกอบย่อยเฉพาะ ตัวปรับเปลี่ยนนี้จะแทนที่ contentAlignment ที่ตั้งไว้สำหรับ Box ทั้งหมด ตัวอย่างเช่น Modifier.align(Alignment.BottomEnd) จะตรึงองค์ประกอบไว้ที่มุมล่างขวา

จะสร้าง Box ที่มีสีพื้นหลังและข้อความกึ่งกลางได้อย่างไร?

สร้าง Box ด้วย Modifier.size และ Modifier.background และตั้งค่า contentAlignment เป็น Alignment.Center ข้อความภายใน Box จะถูกจัดกึ่งกลางโดยอัตโนมัติโดยไม่ต้องใช้ตัวปรับเปลี่ยนเพิ่มเติม

propagateMinConstraints ใน Box คืออะไร?

propagateMinConstraints ส่งต่อข้อจำกัดขนาดต่ำสุดของ Box ไปยังองค์ประกอบย่อย เมื่อตั้งค่าเป็น true องค์ประกอบย่อยจะต้องไม่เล็กกว่าขนาดต่ำสุดที่กำหนดไว้สำหรับ Box ผ่าน Modifier.size หรือ Modifier.constrain

จะวางองค์ประกอบหนึ่งทับอีกองค์ประกอบใน Box พร้อมควบคุมลำดับได้อย่างไร?

ลำดับการประกาศองค์ประกอบใน Box กำหนดลำดับภาพ: องค์ประกอบแรกอยู่ด้านล่าง สุดท้ายอยู่ด้านบน สำหรับการควบคุมที่แม่นยำ ให้ใช้ Modifier.zIndex — องค์ประกอบที่มีค่าสูงกว่าจะถูกวาดเหนือตัวอื่น

สรุป

  • Box เป็นคอนเทนเนอร์ Compose ที่ซ้อนองค์ประกอบย่อยทับกันในพื้นที่เดียวกัน โดยองค์ประกอบถัดไปจะถูกวาดทับองค์ประกอบก่อนหน้า
  • contentAlignment กำหนดการจัดตำแหน่งเริ่มต้นสำหรับองค์ประกอบย่อยทั้งหมด ในขณะที่ Modifier.align ให้การวางตำแหน่งเฉพาะบุคคล
  • Modifier.zIndex ควบคุมลำดับการวาดของเลเยอร์ ทำให้สามารถยกหรือลดองค์ประกอบโดยไม่ขึ้นกับลำดับการประกาศ
  • Box ใช้สำหรับวางข้อความทับรูปภาพ สร้างป้าย ตัวบ่งชี้การโหลด และเลเยอร์พื้นหลัง
  • Modifier.clipToBounds จำกัดการเรนเดอร์องค์ประกอบย่อยให้อยู่ภายในขอบเขตของ Box ป้องกันเนื้อหาไหลออกนอกคอนเทนเนอร์
  • propagateMinConstraints ส่งต่อข้อจำกัดต่ำสุดไปยังองค์ประกอบย่อย มีประโยชน์สำหรับสร้างคอนเทนเนอร์ที่กำหนดเองที่มีขนาดต่ำสุดคงที่
  • สำหรับการจัดเรียงองค์ประกอบตามลำดับแนวนอนหรือแนวตั้ง ให้ใช้ Row หรือ Column; สำหรับเลเยอร์และการวางซ้อน ให้ใช้ Box

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม