Box es una función composable en Jetpack Compose para colocar elementos secundarios unos encima de otros en capas. A diferencia de Row y Column, Box apila elementos en la misma área, lo que permite crear texturas, insignias e indicadores personalizados. Según Google Android Documentation, 2025, Box es uno de los tres contenedores básicos de Compose y proporciona una gestión flexible de capas mediante Modifier.align y Modifier.zIndex.
Puntos clave
Box es una función composable que coloca elementos secundarios en la misma área, apilándolos unos sobre otros. El primer elemento secundario se dibuja abajo, el último arriba. Por defecto, Box se ajusta al tamaño del elemento secundario más grande.
A diferencia de Row y Column, Box no organiza elementos secuencialmente — todos los elementos secundarios ocupan la misma área y pueden superponerse. Esto hace que Box sea indispensable para componer capas de interfaz.
El tamaño de Box se determina por la regla: si ningún elemento secundario tiene un tamaño fijo, Box se colapsa al tamaño mínimo. Si al menos un elemento secundario tiene Modifier.fillMaxSize, Box se expande al máximo.
Según el Android Developers Blog, 2024, Box es el contenedor más eficiente en Compose para casos donde los elementos no requieren disposición secuencial. Box no realiza mediciones adicionales para el posicionamiento, a diferencia de Row y Column.
Box acepta los parámetros modifier, contentAlignment y propagateMinConstraints. Todos los elementos secundarios se pasan en el bloque content, donde cada uno puede tener sus propios modificadores.
@Composable
fun BoxExample() {
Box(
modifier = Modifier.size(200.dp),
contentAlignment = Alignment.Center
) {
Box(
modifier = Modifier.fillMaxSize().background(Color.Blue)
)
Text(
text = "Hola",
color = Color.White
)
}
}
contentAlignment es un parámetro de Box que establece la alineación predeterminada para todos los elementos secundarios. Si no se especifica, se utiliza Alignment.TopStart — los elementos se colocan en la esquina superior izquierda del contenedor.
Modifier.align permite anular la alineación de un elemento secundario específico independientemente de contentAlignment. Por ejemplo, un Box con Alignment.Center puede contener un elemento con Modifier.align(Alignment.BottomEnd) que se fijará en la esquina inferior derecha.
Según las Material Design Guidelines, 2025, Modifier.align es útil para posicionar insignias e iconos sobre imágenes de fondo. Esto permite establecer una alineación general para todo el contenido de Box y anularla para elementos individuales.
| Valor | Posición en Box | Ejemplo de uso |
|---|---|---|
| TopStart | Esquina superior izquierda | Icono en la esquina de una tarjeta |
| TopCenter | Centro superior | Título sobre una imagen |
| Center | Centro del contenedor | Texto centrado sobre un fondo |
| BottomEnd | Esquina inferior derecha | Contador de notificaciones en un icono |
| BottomCenter | Centro inferior | Pie de foto debajo de una imagen |
En este ejemplo, Box contiene una imagen de fondo y una insignia en la esquina inferior derecha. Modifier.align(BottomEnd) posiciona la insignia independientemente del contentAlignment de 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 controla el orden de dibujo de los elementos dentro de Box. Por defecto, los elementos se dibujan en el orden de declaración — el primer elemento abajo, el último arriba. zIndex anula este orden.
Un elemento con zIndex 2.0f se dibuja sobre un elemento con zIndex 1.0f, independientemente de su orden en el código. Los valores negativos de zIndex colocan un elemento debajo de los demás. Según Android Developers, 2024, zIndex solo afecta al orden de dibujo, no al manejo de eventos táctiles.
zIndex es especialmente útil en animaciones y componentes arrastrables, donde un elemento debe elevarse temporalmente sobre los demás. Por ejemplo, al arrastrar una tarjeta, su zIndex aumenta para que no sea superpuesta por elementos vecinos.
@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 se usa ampliamente para superponer texto sobre imágenes. La imagen de fondo se coloca primero, luego el texto con Modifier.align para posicionarlo sobre el fondo.
@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 = "Título",
color = Color.White,
modifier = Modifier.align(Alignment.BottomStart)
.padding(16.dp)
)
}
}
El segundo ejemplo es Box para crear un indicador de carga. Box ocupa toda el área de la pantalla, y CircularProgressIndicator se centra mediante contentAlignment.
@Composable
fun LoadingOverlay() {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
CircularProgressIndicator(
modifier = Modifier.size(48.dp)
)
}
}
Box por defecto se ajusta al tamaño de su contenido. Si los elementos secundarios tienen diferentes tamaños, Box toma el tamaño del elemento más grande. Cuando no hay elementos secundarios, Box se colapsa al tamaño mínimo.
Modifier.clipToBounds restringe el renderizado de elementos secundarios a los límites de Box. Sin este modificador, los elementos secundarios pueden extenderse más allá de Box. Según las Material Design Guidelines, 2025, clipToBounds es obligatorio al usar Modifier.scale o Modifier.graphicsLayer dentro de Box.
propagateMinConstraints es un parámetro de Box que pasa las restricciones de tamaño mínimo a los elementos secundarios. Si se establece en true, los elementos secundarios no pueden ser más pequeños que el tamaño mínimo de Box. Este comportamiento es importante al crear contenedores personalizados con tamaños mínimos fijos.
Preguntas frecuentes
Box apila elementos unos sobre otros, mientras que Row y Column los organizan secuencialmente. Box es adecuado para capas y superposiciones, Row para filas horizontales y Column para listas verticales.
Use Modifier.align para un elemento secundario específico. Este modificador anula el contentAlignment establecido para todo Box. Por ejemplo, Modifier.align(Alignment.BottomEnd) fija el elemento en la esquina inferior derecha.
Cree un Box con Modifier.size y Modifier.background, y establezca contentAlignment en Alignment.Center. El texto dentro de Box se centrará automáticamente sin modificadores adicionales.
propagateMinConstraints pasa las restricciones de tamaño mínimo de Box a los elementos secundarios. Cuando es true, los elementos secundarios no pueden ser más pequeños que el tamaño mínimo establecido para Box mediante Modifier.size o Modifier.constrain.
El orden de declaración de los elementos en Box determina su orden visual: el primer elemento abajo, el último arriba. Para un control preciso, use Modifier.zIndex — un elemento con un valor más alto se dibuja sobre los demás.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también