Box เป็นฟังก์ชัน composable ใน Jetpack Compose สำหรับวางองค์ประกอบย่อยซ้อนกันเป็นเลเยอร์ แตกต่างจาก Row และ Column ตรงที่ Box ซ้อนองค์ประกอบในพื้นที่เดียวกัน ทำให้สามารถสร้างพื้นผิว ป้าย และตัวบ่งชี้ที่กำหนดเองได้ ตาม Google Android Documentation, 2025 Box เป็นหนึ่งในสามคอนเทนเนอร์พื้นฐานของ Compose และให้การจัดการเลเยอร์ที่ยืดหยุ่นด้วย Modifier.align และ Modifier.zIndex
ประเด็นสำคัญ
Box เป็นฟังก์ชัน composable ที่วางองค์ประกอบย่อยในพื้นที่เดียวกัน โดยซ้อนกันทับ องค์ประกอบย่อยแรกจะถูกวาดไว้ด้านล่าง สุดท้ายอยู่ด้านบน โดยค่าเริ่มต้น Box จะปรับตามขนาดขององค์ประกอบย่อยที่ใหญ่ที่สุด
แตกต่างจาก Row และ Column ตรงที่ Box ไม่ได้จัดเรียงองค์ประกอบตามลำดับ — องค์ประกอบย่อยทั้งหมดใช้พื้นที่เดียวกันและสามารถทับซ้อนกันได้ สิ่งนี้ทำให้ Box ขาดไม่ได้ในการประกอบเลเยอร์อินเทอร์เฟซ
ขนาดของ Box ถูกกำหนดโดยกฎ: หากไม่มีองค์ประกอบย่อยใดมีขนาดคงที่ Box จะยุบลงเป็นขนาดต่ำสุด หากมีองค์ประกอบย่อยอย่างน้อยหนึ่งตัวมี Modifier.fillMaxSize Box จะขยายจนถึงขนาดสูงสุด
ตาม Android Developers Blog, 2024 Box เป็นคอนเทนเนอร์ที่มีประสิทธิภาพมากที่สุดใน Compose สำหรับกรณีที่องค์ประกอบไม่ต้องการการจัดเรียงตามลำดับ Box ไม่ทำการวัดเพิ่มเติมสำหรับการวางตำแหน่ง แตกต่างจาก Row และ Column
Box รับพารามิเตอร์ modifier, contentAlignment และ propagateMinConstraints องค์ประกอบย่อยทั้งหมดถูกส่งในบล็อก content โดยแต่ละตัวสามารถมีตัวปรับเปลี่ยนของตัวเองได้
@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 เป็นพารามิเตอร์ของ Box ที่กำหนดการจัดตำแหน่งเริ่มต้นสำหรับองค์ประกอบย่อยทั้งหมด หากไม่ระบุ จะใช้ Alignment.TopStart — องค์ประกอบจะถูกวางไว้ที่มุมบนซ้ายของคอนเทนเนอร์
Modifier.align อนุญาตให้แทนที่การจัดตำแหน่งสำหรับองค์ประกอบย่อยเฉพาะโดยอิสระจาก contentAlignment ตัวอย่างเช่น Box ที่มี Alignment.Center สามารถมีองค์ประกอบที่มี Modifier.align(Alignment.BottomEnd) ซึ่งจะถูกตรึงไว้ที่มุมล่างขวา
ตาม Material Design Guidelines, 2025 Modifier.align มีประโยชน์สำหรับการวางตำแหน่งป้ายและไอคอนบนภาพพื้นหลัง สิ่งนี้ช่วยให้ตั้งค่าการจัดตำแหน่งทั่วไปสำหรับเนื้อหาทั้งหมดของ Box และแทนที่สำหรับองค์ประกอบแต่ละรายการ
| ค่า | ตำแหน่งใน Box | ตัวอย่างการใช้งาน |
|---|---|---|
| TopStart | มุมบนซ้าย | ไอคอนที่มุมการ์ด |
| TopCenter | กึ่งกลางด้านบน | หัวข้อเหนือรูปภาพ |
| Center | กึ่งกลางคอนเทนเนอร์ | ข้อความกึ่งกลางบนพื้นหลัง |
| BottomEnd | มุมล่างขวา | จำนวนการแจ้งเตือนบนไอคอน |
| BottomCenter | กึ่งกลางด้านล่าง | คำอธิบายใต้รูปภาพ |
ในตัวอย่างนี้ Box มีภาพพื้นหลังและป้ายที่มุมล่างขวา Modifier.align(BottomEnd) วางตำแหน่งป้ายโดยอิสระจาก contentAlignment ของ Box
@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)
)
}
}
Modifier.zIndex ควบคุมลำดับการวาดขององค์ประกอบภายใน Box โดยค่าเริ่มต้น องค์ประกอบจะถูกวาดตามลำดับการประกาศ — องค์ประกอบแรกอยู่ด้านล่าง สุดท้ายอยู่ด้านบน zIndex แทนที่ลำดับนี้
องค์ประกอบที่มี zIndex 2.0f จะถูกวาดเหนือองค์ประกอบที่มี zIndex 1.0f โดยไม่ขึ้นกับลำดับในโค้ด ค่า zIndex ที่เป็นลบจะวางองค์ประกอบไว้ใต้ตัวอื่น ตาม Android Developers, 2024 zIndex มีผลต่อลำดับการวาดเท่านั้น ไม่มีผลต่อการจัดการเหตุการณ์สัมผัส
zIndex มีประโยชน์โดยเฉพาะในแอนิเมชันและคอมโพเนนต์ที่ลากได้ ซึ่งองค์ประกอบต้องลอยเหนือตัวอื่นชั่วคราว ตัวอย่างเช่น เมื่อลากการ์ด zIndex ของมันจะเพิ่มขึ้นเพื่อไม่ให้ถูกบดบังโดยองค์ประกอบข้างเคียง
@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 ถูกใช้อย่างแพร่หลายในการวางข้อความทับรูปภาพ ภาพพื้นหลังจะถูกวางก่อน จากนั้นข้อความที่มี Modifier.align สำหรับวางตำแหน่งบนพื้นหลัง
@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
@Composable
fun LoadingOverlay() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator(
modifier = Modifier.size(48.dp)
)
}
}
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 ซ้อนองค์ประกอบทับกัน ในขณะที่ Row และ Column จัดเรียงตามลำดับ Box เหมาะสำหรับเลเยอร์และการวางซ้อน Row สำหรับแถวแนวนอน และ Column สำหรับรายการแนวตั้ง
ใช้ Modifier.align สำหรับองค์ประกอบย่อยเฉพาะ ตัวปรับเปลี่ยนนี้จะแทนที่ contentAlignment ที่ตั้งไว้สำหรับ Box ทั้งหมด ตัวอย่างเช่น Modifier.align(Alignment.BottomEnd) จะตรึงองค์ประกอบไว้ที่มุมล่างขวา
สร้าง Box ด้วย Modifier.size และ Modifier.background และตั้งค่า contentAlignment เป็น Alignment.Center ข้อความภายใน Box จะถูกจัดกึ่งกลางโดยอัตโนมัติโดยไม่ต้องใช้ตัวปรับเปลี่ยนเพิ่มเติม
propagateMinConstraints ส่งต่อข้อจำกัดขนาดต่ำสุดของ Box ไปยังองค์ประกอบย่อย เมื่อตั้งค่าเป็น true องค์ประกอบย่อยจะต้องไม่เล็กกว่าขนาดต่ำสุดที่กำหนดไว้สำหรับ Box ผ่าน Modifier.size หรือ Modifier.constrain
ลำดับการประกาศองค์ประกอบใน Box กำหนดลำดับภาพ: องค์ประกอบแรกอยู่ด้านล่าง สุดท้ายอยู่ด้านบน สำหรับการควบคุมที่แม่นยำ ให้ใช้ Modifier.zIndex — องค์ประกอบที่มีค่าสูงกว่าจะถูกวาดเหนือตัวอื่น
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม