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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също