Box în Jetpack Compose: ce este, proprietățile composable și cum funcționează

Autor: IT Sectr Publicat: 2026-06-29 Timp de citire: 10 min

Box — este o funcție composable în Jetpack Compose pentru plasarea elementelor copil unul peste altul pe principiul straturilor. Spre deosebire de Row și Column, Box suprapune elementele în aceeași zonă, permițând crearea de texturi, insigne și indicatoare personalizate. Potrivit Google Android Documentation, 2025, Box este unul dintre cele trei containere de bază Compose și oferă gestionare flexibilă a straturilor cu ajutorul Modifier.align și Modifier.zIndex.

Puncte cheie

  • Box — container Compose cu suprapunerea elementelor unul peste altul, unde fiecare element următor este desenat deasupra celui precedent.
  • contentAlignment stabilește alinierea întregului conținut al Box, iar Modifier.align — poziționarea individuală a fiecărui element copil.
  • Modifier.zIndex gestionează ordinea de desenare a elementelor, permițând ridicarea unor straturi deasupra altora.
  • Box este utilizat pentru suprapunerea textului pe imagini, crearea insignelor de notificare, ecusoanelor și fundalurilor.
  • Modifier.clipToBounds limitează desenarea elementelor copil la marginile Box, prevenind ieșirea conținutului din container.

Ce este Box în Jetpack Compose

Box — este o funcție composable care plasează elementele copil într-o singură zonă, suprapunându-le unul peste altul. Primul element copil este desenat în partea de jos, ultimul — deasupra. În mod implicit, Box se adaptează la dimensiunea celui mai mare element copil.

Spre deosebire de Row și Column, Box nu aranjează elementele secvențial — toate elementele copil ocupă aceeași zonă și se pot suprapune. Acest lucru face Box indispensabil pentru compunerea straturilor de interfață.

Dimensiunea Box este determinată după regula: dacă niciun element copil nu are dimensiune fixă, Box se reduce la dimensiunea minimă. Dacă cel puțin un element copil are Modifier.fillMaxSize, Box se extinde la maximum.

Potrivit Android Developers Blog, 2024, Box este cel mai eficient container în Compose pentru cazurile în care elementele nu necesită aranjare secvențială. Box nu efectuează măsurători suplimentare pentru poziționare, spre deosebire de Row și Column.

Semnătura de bază a Box

Box acceptă parametrii modifier, contentAlignment și propagateMinConstraints. Toate elementele copil sunt transmise în blocul content, unde fiecare poate avea proprii modificatori.

kotlin
@Composable
fun BoxExample() {
    Box(
        modifier = Modifier.size(200.dp),
        contentAlignment = Alignment.Center
    ) {
        Box(
            modifier = Modifier.fillMaxSize().background(Color.Blue)
        )
        Text(
            text = "Bună",
            color = Color.White
        )
    }
}

ContentAlignment și Modifier.align în Box

contentAlignment — este un parametru al Box care stabilește alinierea implicită pentru toate elementele copil. Dacă nu este specificat, se utilizează Alignment.TopStart — elementele sunt plasate în colțul din stânga sus al containerului.

Modifier.align permite modificarea alinierii pentru un anumit element copil, independent de contentAlignment. De exemplu, Box cu Alignment.Center poate conține un element cu Modifier.align(Alignment.BottomEnd), care va fi lipit de colțul din dreapta jos.

Potrivit Material Design Guidelines, 2025, Modifier.align este util pentru poziționarea insignelor și pictogramelor peste imaginile de fundal. Acesta permite stabilirea unei alinieri generale pentru întregul conținut al Box și modificarea acesteia pentru elemente individuale.

Tabelul valorilor Alignment

ValoarePoziția în BoxExemplu de aplicare
TopStartColțul stânga susPictogramă în colțul cărții
TopCenterCentrul de susTitlu deasupra imaginii
CenterCentrul containeruluiText centrat pe fundal
BottomEndColțul dreapta josContor de notificări pe pictogramă
BottomCenterCentrul de josLegendă sub imagine

Exemplu cu Modifier.align

În acest exemplu Box conține o imagine de fundal și o insignă în colțul din dreapta jos. Modifier.align(BottomEnd) poziționează insigna independent de contentAlignment al întregului 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)
        )
    }
}

Gestionarea straturilor cu zIndex

Modifier.zIndex gestionează ordinea de desenare a elementelor în interiorul Box. În mod implicit, elementele sunt desenate în ordinea declarării — primul element în partea de jos, ultimul deasupra. zIndex modifică această ordine.

Un element cu zIndex 2.0f este desenat deasupra unui element cu zIndex 1.0f, indiferent de ordinea lor în cod. Valorile negative ale zIndex plasează elementul mai jos decât celelalte. Potrivit Android Developers, 2024, zIndex afectează doar ordinea de desenare, nu și procesarea evenimentelor tactile.

zIndex este util în special în animații și componente draggable, unde un element trebuie să se ridice temporar deasupra celorlalte. De exemplu, la glisarea unei cărți, zIndex-ul acesteia crește pentru a nu fi acoperită de elementele vecine.

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))
    }
}

Exemple practice de utilizare a Box

Box este utilizat pe scară largă pentru suprapunerea textului pe imagine. Imaginea de fundal este plasată prima, apoi textul cu Modifier.align pentru poziționarea deasupra fundalului.

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 = "Titlu",
            color = Color.White,
            modifier = Modifier.align(Alignment.BottomStart)
                .padding(16.dp)
        )
    }
}

Al doilea exemplu — Box pentru crearea unui indicator de încărcare. Box ocupă întreaga zonă a ecranului, iar CircularProgressIndicator este centrat prin contentAlignment.

kotlin
@Composable
fun LoadingOverlay() {
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        CircularProgressIndicator(
            modifier = Modifier.size(48.dp)
        )
    }
}

Constrângeri de dimensiune ale Box

Box în mod implicit se adaptează la dimensiunea conținutului. Dacă elementele copil au dimensiuni diferite, Box adoptă dimensiunea celui mai mare element. În absența elementelor copil, Box se reduce la dimensiunea minimă.

Modifier.clipToBounds limitează desenarea elementelor copil la marginile Box. Fără acest modificator, elementele copil pot ieși în afara Box. Potrivit Material Design Guidelines, 2025, clipToBounds este obligatoriu la utilizarea Modifier.scale sau Modifier.graphicsLayer în interiorul Box.

propagateMinConstraints — este un parametru al Box care transmite constrângerile minime de dimensiune elementelor copil. Dacă este setat la true, elementele copil nu pot fi mai mici decât dimensiunea minimă a Box. Acest comportament este important la crearea containerelor personalizate cu dimensiuni minime fixe.

  • Box — container minim dacă nu sunt setate dimensiuni și nu există elemente copil cu fillMaxSize
  • Modifier.clipToBounds previne ieșirea conținutului din marginile Box
  • propagateMinConstraints transmite constrângerile minime elementelor copil

ÎntreBări frecvente

Cu ce se deosebește Box de Row și Column?

Box suprapune elementele unul peste altul, în timp ce Row și Column le aranjează secvențial. Box este potrivit pentru straturi și suprapuneri, Row — pentru rânduri orizontale, Column — pentru liste verticale.

Cum să aliniez un element în Box diferit de celelalte?

Utilizați Modifier.align pentru elementul copil specific. Acest modificator înlocuiește contentAlignment stabilit pentru întregul Box. De exemplu, Modifier.align(Alignment.BottomEnd) va lipi elementul de colțul din dreapta jos.

Cum să fac un Box cu culoare de fundal și text centrat?

Configurați Box cu Modifier.size și Modifier.background, iar contentAlignment setați-l la Alignment.Center. Textul din interiorul Box va fi centrat automat, fără modificatori suplimentari.

Ce este propagateMinConstraints în Box?

propagateMinConstraints transmite constrângerile minime de dimensiune ale Box elementelor copil. La valoarea true, elementele copil nu pot fi mai mici decât dimensiunea minimă stabilită pentru Box prin Modifier.size sau Modifier.constrain.

Cum să plasez un element în Box deasupra altuia cu controlul ordinii?

Ordinea declarării elementelor în Box determină ordinea lor vizuală: primul element în partea de jos, ultimul — deasupra. Pentru control fin, utilizați Modifier.zIndex — elementul cu valoarea mai mare este desenat deasupra celorlalte.

Rezumat

  • Box — container Compose cu suprapunerea elementelor copil unul peste altul într-o singură zonă, unde fiecare element următor este desenat deasupra celui precedent.
  • contentAlignment stabilește alinierea implicită pentru toate elementele copil, iar Modifier.align — poziționarea individuală.
  • Modifier.zIndex gestionează ordinea de desenare a straturilor, permițând ridicarea sau coborârea elementelor independent de ordinea declarării.
  • Box este utilizat pentru suprapunerea textului pe imagini, crearea insignelor, indicatoarelor de încărcare și fundalurilor.
  • Modifier.clipToBounds limitează desenarea elementelor copil la marginile Box, prevenind ieșirea conținutului din container.
  • propagateMinConstraints transmite constrângerile minime elementelor copil, util la crearea containerelor personalizate cu dimensiuni minime fixe.
  • Pentru aranjarea secvențială a elementelor pe orizontală sau verticală, utilizați Row sau Column, iar pentru straturi și suprapuneri — Box.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și