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 е особено полезен в анимации и draggable компоненти, където елемент трябва временно да се повдигне над останалите. Например, при влачене на карта, нейният 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. Това поведение е важно при създаване на поръчани контейнери с фиксирани минимални размери.

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

Обсъдете проекта

Прочетете също