En Compose, puedes encadenar varios modificadores para cambiar el aspecto y de un elemento componible. Estas cadenas de modificadores pueden afectar las restricciones que se pasan. a los elementos componibles, que definen los límites de ancho y alto.
En esta página, se describe cómo los modificadores encadenados afectan las restricciones y, a su vez, la medición y la ubicación de los elementos componibles.
Modificadores en el árbol de IU
Para comprender cómo se influyen entre sí los modificadores, es útil visualizar cómo aparecen en el árbol de la IU, que se genera durante la fase de composición. Para obtener más información, consulta la sección Composición.
En el árbol de IU, puedes visualizar los modificadores como nodos wrappers para el diseño. nodos:

Si agregas más de un modificador a un elemento componible, se crea una cadena de modificadores. Cuando encadenas varios modificadores, cada nodo de modificador une el resto de la cadena y el nodo de diseño. Por ejemplo, cuando encadenas un clip
y un
modificador size
, el nodo modificador clip
une el nodo modificador size
,
que luego une el nodo de diseño Image
.
En la fase de diseño, el algoritmo que recorre el árbol sigue siendo el mismo, pero también se visita cada nodo modificador. De esta manera, un modificador puede cambiar el tamaño y la ubicación del modificador o nodo de diseño que une.
Como se muestra en la Figura 2, la implementación de los elementos componibles Image
y Text
consisten en una cadena de modificadores que unen un solo nodo de diseño. Las implementaciones de Row
y Column
son simplemente nodos de diseño que describen cómo organizar sus elementos secundarios.

En resumen:
- Los modificadores unen un solo modificador o nodo de diseño.
- Los nodos de diseño pueden distribuir varios nodos secundarios.
En las siguientes secciones, se describe cómo usar este modelo mental para razonar sobre el encadenamiento de modificadores y cómo influye en el tamaño de los elementos componibles.
Restricciones en la fase de diseño
La fase de diseño sigue un algoritmo de tres pasos para encontrar cada diseño. ancho, alto y coordenada x, y:
- Medir elementos secundarios: Un nodo mide sus elementos secundarios, si los hay.
- Decide tu propio tamaño: En función de esas mediciones, un nodo decide por su cuenta. de tamaño del ensamble.
- Colocar elementos secundarios: Cada nodo secundario se coloca en relación con la posición de un nodo.
Constraints
ayuda a encontrar los tamaños correctos para los nodos durante los primeros dos.
pasos del algoritmo. Las restricciones definen los límites mínimos y máximos para el ancho y la altura de un nodo. Cuando el nodo decide su tamaño, su tamaño medido debe estar dentro de este rango de tamaño.
Tipos de restricciones
Una restricción puede ser una de las siguientes:
- Con límites: El nodo tiene un ancho y una altura máximos y mínimos.

- No delimitado: El nodo no está restringido a ningún tamaño. Los límites máximos de ancho y altura se establecen en infinito.

- Exacto: Se le solicita al nodo que siga un requisito de tamaño exacto. Los límites mínimo y máximo se establecen en el mismo valor.

- Combinación: El nodo sigue una combinación de los tipos de restricciones anteriores. Por ejemplo, una restricción podría limitar el ancho y, al mismo tiempo, permitir una altura máxima ilimitada, o bien establecer un ancho exacto, pero proporcionar una altura limitada.

En la siguiente sección, se describe cómo se pasan estas restricciones de un elemento superior a un hijo o hija.
Cómo se pasan las restricciones de un elemento superior a uno secundario
Durante el primer paso del algoritmo que se describe en Restricciones en la fase de diseño, las restricciones se pasan de superior a inferior en el árbol de la IU.
Cuando un nodo superior mide sus elementos secundarios, proporciona estas restricciones a cada uno un niño para decirles qué tan grandes o pequeños pueden ser. Luego, cuando decide su propio tamaño, también se adhiere a las restricciones que pasaron por de sus propios padres.
En un nivel alto, el algoritmo funciona de la siguiente manera:
- Para decidir el tamaño que realmente desea ocupar, el nodo raíz del árbol de la IU mide sus elementos secundarios y reenvía las mismas restricciones a su primer elemento secundario.
- Si el elemento secundario es un modificador que no afecta la medición, reenvía las restricciones al siguiente modificador. Las restricciones se pasan a la cadena de modificadores tal como están, a menos que se alcance un modificador que afecte la medición. Luego, se vuelve a ajustar el tamaño de las restricciones según corresponda.
- Una vez que se llega a un nodo que no tiene elementos secundarios (denominado "nodo hoja"), decide su tamaño en función de las restricciones que se pasaron y muestra este tamaño resuelto a su elemento superior.
- El elemento superior adapta sus restricciones en función de las mediciones de este elemento secundario y llama al siguiente elemento secundario con estas restricciones ajustadas.
- Una vez que se miden todos los elementos secundarios de un elemento superior, el nodo superior decide su tamaño y se lo comunica a su propio elemento superior.
- De esta manera, todo el árbol se recorre primero en profundidad. Con el tiempo, todos los nodos deciden sus tamaños y se completa el paso de medición.
Para obtener un ejemplo detallado, consulta Restricciones y orden de los modificadores. video.
Modificadores que afectan las restricciones
En la sección anterior, aprendiste que algunos modificadores pueden afectar la restricción de tamaño del ensamble. En las siguientes secciones, se describen los modificadores específicos que afectan restricciones.
Modificador size
El modificador size
declara el tamaño preferido del contenido.
Por ejemplo, 200dp
debe renderizar el siguiente árbol de IU en un contenedor de 300dp
. Las restricciones están delimitadas, lo que permite anchos entre 100dp
y
300dp
y alturas entre 100dp
y 200dp
:

El modificador size
adapta las restricciones entrantes para que coincidan con el valor que se le pasa.
En este ejemplo, el valor es 150dp
:

size
ajusta las restricciones a 150dp
.Si el ancho y la altura son más pequeños que el límite de restricción más pequeño o más grandes que el límite de restricción más grande, el modificador coincide con las restricciones pasadas lo más cerca posible y, al mismo tiempo, se adhiere a las restricciones pasadas:

size
se adhiere a la restricción pasada lo más cerca posible.Ten en cuenta que encadenar varios modificadores size
no funciona. El primer modificador size
establece las restricciones mínimas y máximas en un valor fijo. Incluso si el segundo modificador de tamaño solicita un tamaño más pequeño o más grande, aún debe cumplir con los límites exactos que se pasan, de modo que no anule esos valores:

size
, en la que se pasa el segundo valor
en (50dp
) no anula el primer valor (100dp
).Modificador requiredSize
Usa el modificador requiredSize
en lugar de size
si necesitas que tu nodo anule las restricciones entrantes. El modificador requiredSize
reemplaza
las restricciones entrantes y pasa el tamaño que especificas como límites exactos.
Cuando el tamaño se vuelve a pasar al árbol, el nodo secundario se centra en la espacio disponible:

requiredSize
anula las restricciones entrantes del modificador size
.Modificadores width
y height
El modificador size
adapta el ancho y la altura de las restricciones. Con
el modificador width
, puedes establecer un ancho fijo, pero no definir la altura.
De manera similar, con el modificador height
, puedes establecer una altura fija, pero dejar
ancho indeciso:

width
y height
que configuran un ancho fijo
y altura, respectivamente.Modificador sizeIn
El modificador sizeIn
te permite establecer restricciones mínimas y máximas exactas para el ancho y la altura. Usa el modificador sizeIn
si necesitas un control detallado
sobre las restricciones.

sizeIn
con minWidth
, maxWidth
, minHeight
y
Se estableció maxHeight
.Ejemplos
En esta sección, se muestra y explica el resultado de varios fragmentos de código con modificadores encadenados.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .size(50.dp) )
Este fragmento produce el siguiente resultado:
- El modificador
fillMaxSize
cambia las restricciones para establecer ancho y altura mínimos al valor máximo:300dp
de ancho y200dp
de altura. - Aunque el modificador
size
quiere usar un tamaño de50dp
, aún necesita para cumplir con las restricciones mínimas entrantes. Por lo tanto, el modificadorsize
también muestra los límites de restricción exactos de300
por200
, ignora el valor proporcionado en el modificadorsize
. Image
sigue estos límites y informa un tamaño de300
por200
, que se pasa hasta la parte superior del árbol.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .wrapContentSize() .size(50.dp) )
Este fragmento produce el siguiente resultado:
- El modificador
fillMaxSize
adapta las restricciones para establecer el ancho y la altura mínimos en el valor máximo:300dp
en ancho y200dp
en altura. - El modificador
wrapContentSize
restablece las restricciones mínimas. Entonces, si bienfillMaxSize
generó restricciones corregidas,wrapContentSize
lo restablece. debido a limitaciones delimitadas. El siguiente nodo ahora puede ocupar todo el espacio nuevamente o ser más pequeño que todo el espacio. - El modificador
size
establece las restricciones en los límites mínimos y máximos de50
. Image
se resuelve en un tamaño de50
por50
, y el modificadorsize
lo reenvía.- El modificador
wrapContentSize
tiene una propiedad especial. Toma su secundario y lo coloca en el centro de los límites mínimos disponibles que se que se le pasa. Por lo tanto, el tamaño que comunica a sus elementos superiores es igual a los límites mínimos que se le pasaron.
Combinando solo tres modificadores, puedes definir un tamaño para el elemento componible y centrarlo en su elemento superior.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .clip(CircleShape) .padding(10.dp) .size(100.dp) )
Este fragmento produce el siguiente resultado:
- El modificador
clip
no cambia las restricciones.- El modificador
padding
reduce las restricciones máximas. - El modificador
size
establece todas las restricciones en100dp
. Image
cumple con esas restricciones y informa un tamaño de100
por100dp
.- El modificador
padding
agrega10dp
en todos los tamaños, por lo que aumenta la cantidad informada ancho y alto por20dp
. - Ahora, en la fase de dibujo, el modificador
clip
actúa en un lienzo de120
por120dp
. Por lo tanto, crea una máscara circular de ese tamaño. - Luego, el modificador
padding
inserta su contenido en10dp
en todos los tamaños, por lo que reduce el tamaño del lienzo a100
en100dp
. - El
Image
se dibuja en ese lienzo. La imagen se recorta según el círculo original de120dp
, por lo que el resultado no es redondo.
- El modificador