Box è una funzione composable in Jetpack Compose per posizionare gli elementi figli uno sopra l'altro a strati. A differenza di Row e Column, Box impila gli elementi nella stessa area, consentendo di creare texture, badge e indicatori personalizzati. Secondo Google Android Documentation, 2025, Box è uno dei tre contenitori di base di Compose e fornisce una gestione flessibile dei layer tramite Modifier.align e Modifier.zIndex.
Punti chiave
Box è una funzione composable che posiziona gli elementi figli nella stessa area, impilandoli uno sopra l'altro. Il primo elemento figlio viene disegnato in basso, l'ultimo in alto. Per impostazione predefinita, Box si adatta alla dimensione dell'elemento figlio più grande.
A differenza di Row e Column, Box non dispone gli elementi in sequenza — tutti gli elementi figli occupano la stessa area e possono sovrapporsi. Questo rende Box indispensabile per comporre layer di interfaccia.
La dimensione di Box è determinata dalla regola: se nessun elemento figlio ha una dimensione fissa, Box si riduce alla dimensione minima. Se almeno un elemento figlio ha Modifier.fillMaxSize, Box si espande al massimo.
Secondo Android Developers Blog, 2024, Box è il contenitore più efficiente in Compose per i casi in cui gli elementi non richiedono una disposizione sequenziale. Box non esegue misurazioni aggiuntive per il posizionamento, a differenza di Row e Column.
Box accetta i parametri modifier, contentAlignment e propagateMinConstraints. Tutti gli elementi figli vengono passati nel blocco content, dove ciascuno può avere i propri modificatori.
@Composable
fun BoxExample() {
Box(
modifier = Modifier.size(200.dp),
contentAlignment = Alignment.Center
) {
Box(
modifier = Modifier.fillMaxSize().background(Color.Blue)
)
Text(
text = "Ciao",
color = Color.White
)
}
}
contentAlignment è un parametro di Box che imposta l'allineamento predefinito per tutti gli elementi figli. Se non specificato, viene utilizzato Alignment.TopStart — gli elementi vengono posizionati nell'angolo superiore sinistro del contenitore.
Modifier.align consente di sovrascrivere l'allineamento per un elemento figlio specifico indipendentemente da contentAlignment. Ad esempio, un Box con Alignment.Center può contenere un elemento con Modifier.align(Alignment.BottomEnd) che verrà fissato nell'angolo inferiore destro.
Secondo le Material Design Guidelines, 2025, Modifier.align è utile per posizionare badge e icone su immagini di sfondo. Ciò consente di impostare un allineamento generale per tutto il contenuto di Box e sovrascriverlo per elementi individuali.
| Valore | Posizione in Box | Esempio di utilizzo |
|---|---|---|
| TopStart | Angolo superiore sinistro | Icona nell'angolo di una carta |
| TopCenter | Centro superiore | Titolo sopra un'immagine |
| Center | Centro del contenitore | Testo centrato su uno sfondo |
| BottomEnd | Angolo inferiore destro | Contatore notifiche su un'icona |
| BottomCenter | Centro inferiore | Didascalia sotto un'immagine |
In questo esempio, Box contiene un'immagine di sfondo e un badge nell'angolo inferiore destro. Modifier.align(BottomEnd) posiziona il badge indipendentemente dal contentAlignment di 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 controlla l'ordine di disegno degli elementi all'interno di Box. Per impostazione predefinita, gli elementi vengono disegnati nell'ordine di dichiarazione — il primo elemento in basso, l'ultimo in alto. zIndex sovrascrive questo ordine.
Un elemento con zIndex 2.0f viene disegnato sopra un elemento con zIndex 1.0f, indipendentemente dal loro ordine nel codice. I valori negativi di zIndex posizionano un elemento sotto gli altri. Secondo Android Developers, 2024, zIndex influisce solo sull'ordine di disegno, non sulla gestione degli eventi touch.
zIndex è particolarmente utile nelle animazioni e nei componenti trascinabili, dove un elemento deve sollevarsi temporaneamente sopra gli altri. Ad esempio, quando si trascina una carta, il suo zIndex aumenta per non essere coperta dagli elementi vicini.
@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 è ampiamente utilizzato per sovrapporre testo su immagini. L'immagine di sfondo viene posizionata per prima, poi il testo con Modifier.align per posizionarlo sopra lo sfondo.
@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 = "Titolo",
color = Color.White,
modifier = Modifier.align(Alignment.BottomStart)
.padding(16.dp)
)
}
}
Il secondo esempio è Box per creare un indicatore di caricamento. Box occupa l'intera area dello schermo e CircularProgressIndicator viene centrato tramite contentAlignment.
@Composable
fun LoadingOverlay() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator(
modifier = Modifier.size(48.dp)
)
}
}
Box per impostazione predefinita si adatta alla dimensione del suo contenuto. Se gli elementi figli hanno dimensioni diverse, Box assume la dimensione dell'elemento più grande. Quando non ci sono elementi figli, Box si riduce alla dimensione minima.
Modifier.clipToBounds limita il rendering degli elementi figli ai confini di Box. Senza questo modificatore, gli elementi figli possono estendersi oltre Box. Secondo le Material Design Guidelines, 2025, clipToBounds è obbligatorio quando si utilizza Modifier.scale o Modifier.graphicsLayer all'interno di Box.
propagateMinConstraints è un parametro di Box che trasmette i vincoli di dimensione minima agli elementi figli. Se impostato su true, gli elementi figli non possono essere più piccoli della dimensione minima impostata per Box tramite Modifier.size o Modifier.constrain.
Domande frequenti
Box impila gli elementi uno sopra l'altro, mentre Row e Column li dispongono in sequenza. Box è adatto per layer e sovrapposizioni, Row per righe orizzontali e Column per elenchi verticali.
Utilizza Modifier.align per un elemento figlio specifico. Questo modificatore sovrascrive il contentAlignment impostato per l'intero Box. Ad esempio, Modifier.align(Alignment.BottomEnd) fissa l'elemento nell'angolo inferiore destro.
Crea un Box con Modifier.size e Modifier.background, e imposta contentAlignment su Alignment.Center. Il testo all'interno di Box verrà automaticamente centrato senza modificatori aggiuntivi.
propagateMinConstraints trasmette i vincoli di dimensione minima di Box agli elementi figli. Se impostato su true, gli elementi figli non possono essere più piccoli della dimensione minima impostata per Box tramite Modifier.size o Modifier.constrain.
L'ordine di dichiarazione degli elementi in Box determina il loro ordine visivo: il primo elemento in basso, l'ultimo in alto. Per un controllo preciso, usa Modifier.zIndex — un elemento con valore più alto viene disegnato sopra gli altri.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche