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 особливо корисний в анімаціях і draggable-компонентах, де елемент має тимчасово підніматися над іншими. Наприклад, під час перетягування картки її 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. Ця поведінка важлива при створенні кастомних контейнерів із фіксованими мінімальними розмірами.
Часті запитання
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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також