Box — adalah fungsi composable di Jetpack Compose untuk menempatkan elemen anak di atas satu sama lain berdasarkan prinsip lapisan. Berbeda dengan Row dan Column, Box menumpuk elemen dalam satu area, memungkinkan pembuatan tekstur, lencana, dan indikator kustom. Menurut Google Android Documentation, 2025, Box adalah salah satu dari tiga kontainer dasar Compose dan menyediakan manajemen lapisan yang fleksibel dengan Modifier.align dan Modifier.zIndex.
Poin Utama
Box — adalah fungsi composable yang menempatkan elemen anak dalam satu area, menumpuknya satu sama lain. Elemen anak pertama digambar di bagian bawah, yang terakhir — di atas. Secara default, Box menyesuaikan dengan ukuran elemen anak terbesar.
Berbeda dengan Row dan Column, Box tidak menyusun elemen secara berurutan — semua elemen anak menempati area yang sama dan dapat saling tumpang tindih. Ini membuat Box sangat diperlukan untuk komposisi lapisan antarmuka.
Ukuran Box ditentukan oleh aturan: jika tidak ada elemen anak yang memiliki ukuran tetap, Box mengecil ke ukuran minimum. Jika setidaknya satu elemen anak memiliki Modifier.fillMaxSize, Box meluas ke ukuran maksimum.
Menurut Android Developers Blog, 2024, Box adalah kontainer paling efisien di Compose untuk kasus di mana elemen tidak memerlukan penataan berurutan. Box tidak melakukan pengukuran tambahan untuk penentuan posisi, tidak seperti Row dan Column.
Box menerima parameter modifier, contentAlignment dan propagateMinConstraints. Semua elemen anak diteruskan dalam blok content, di mana masing-masing dapat memiliki modifier sendiri.
@Composable
fun BoxExample() {
Box(
modifier = Modifier.size(200.dp),
contentAlignment = Alignment.Center
) {
Box(
modifier = Modifier.fillMaxSize().background(Color.Blue)
)
Text(
text = "Halo",
color = Color.White
)
}
}
contentAlignment — adalah parameter Box yang mengatur perataan default untuk semua elemen anak. Jika tidak ditentukan, Alignment.TopStart digunakan — elemen ditempatkan di sudut kiri atas kontainer.
Modifier.align memungkinkan mengubah perataan untuk elemen anak tertentu secara independen dari contentAlignment. Misalnya, Box dengan Alignment.Center dapat berisi elemen dengan Modifier.align(Alignment.BottomEnd) yang akan ditempatkan di sudut kanan bawah.
Menurut Material Design Guidelines, 2025, Modifier.align berguna untuk memposisikan lencana dan ikon di atas gambar latar. Ini memungkinkan pengaturan perataan umum untuk seluruh konten Box dan menimpanya untuk elemen individual.
| Nilai | Posisi di Box | Contoh penerapan |
|---|---|---|
| TopStart | Sudut kiri atas | Ikon di sudut kartu |
| TopCenter | Bagian atas tengah | Judul di atas gambar |
| Center | Tengah kontainer | Teks di tengah latar |
| BottomEnd | Sudut kanan bawah | Penghitung notifikasi pada ikon |
| BottomCenter | Bagian bawah tengah | Keterangan di bawah gambar |
Dalam contoh ini Box berisi gambar latar dan lencana di sudut kanan bawah. Modifier.align(BottomEnd) memposisikan lencana secara independen dari contentAlignment seluruh 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 mengelola urutan gambar elemen di dalam Box. Secara default, elemen digambar sesuai urutan deklarasi — elemen pertama di bawah, terakhir di atas. zIndex mengubah urutan ini.
Elemen dengan zIndex 2.0f digambar di atas elemen dengan zIndex 1.0f, terlepas dari urutan mereka dalam kode. Nilai zIndex negatif menempatkan elemen lebih rendah dari yang lain. Menurut Android Developers, 2024, zIndex hanya mempengaruhi urutan gambar, bukan pemrosesan peristiwa sentuhan.
zIndex sangat berguna dalam animasi dan komponen draggable, di mana elemen harus sementara naik di atas yang lain. Misalnya, saat menyeret kartu, zIndex-nya ditingkatkan agar tidak tertutup oleh elemen tetangga.
@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 banyak digunakan untuk menumpuk teks pada gambar. Gambar latar ditempatkan pertama, kemudian teks dengan Modifier.align untuk penentuan posisi di atas latar.
@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 = "Judul",
color = Color.White,
modifier = Modifier.align(Alignment.BottomStart)
.padding(16.dp)
)
}
}
Contoh kedua — Box untuk membuat indikator pemuatan. Box menempati seluruh area layar, dan CircularProgressIndicator dipusatkan melalui contentAlignment.
@Composable
fun LoadingOverlay() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator(
modifier = Modifier.size(48.dp)
)
}
}
Box secara default menyesuaikan dengan ukuran konten. Jika elemen anak memiliki ukuran berbeda, Box mengambil ukuran elemen terbesar. Jika tidak ada elemen anak, Box mengecil ke ukuran minimum.
Modifier.clipToBounds membatasi penggambaran elemen anak ke batas Box. Tanpa modifier ini, elemen anak bisa keluar dari Box. Menurut Material Design Guidelines, 2025, clipToBounds wajib saat menggunakan Modifier.scale atau Modifier.graphicsLayer di dalam Box.
propagateMinConstraints — adalah parameter Box yang meneruskan batasan ukuran minimum ke elemen anak. Jika diatur ke true, elemen anak tidak boleh lebih kecil dari ukuran minimum Box. Perilaku ini penting saat membuat kontainer kustom dengan ukuran minimum tetap.
Pertanyaan yang Sering Diajukan
Box menumpuk elemen satu sama lain, sementara Row dan Column menyusunnya secara berurutan. Box cocok untuk lapisan dan tumpukan, Row — untuk baris horizontal, Column — untuk daftar vertikal.
Gunakan Modifier.align untuk elemen anak tertentu. Modifier ini menimpa contentAlignment yang ditetapkan untuk seluruh Box. Misalnya, Modifier.align(Alignment.BottomEnd) akan menempatkan elemen ke sudut kanan bawah.
Atur Box dengan Modifier.size dan Modifier.background, dan set contentAlignment ke Alignment.Center. Teks di dalam Box akan secara otomatis dipusatkan tanpa modifier tambahan.
propagateMinConstraints meneruskan batasan ukuran minimum Box ke elemen anak. Jika true, elemen anak tidak boleh lebih kecil dari ukuran minimum yang ditetapkan untuk Box melalui Modifier.size atau Modifier.constrain.
Urutan deklarasi elemen di Box menentukan urutan visualnya: elemen pertama di bawah, terakhir — di atas. Untuk kontrol yang presisi, gunakan Modifier.zIndex — elemen dengan nilai lebih besar digambar di atas yang lain.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga