In Compose können Sie mehrere Modifikatoren miteinander verketten, um das Design einer zusammensetzbaren Funktion zu ändern. Diese Modifikatorketten können sich auf die Einschränkungen auswirken, die an Composables übergeben werden und die Breiten- und Höhenbegrenzungen definieren.
Auf dieser Seite wird beschrieben, wie sich verkettete Modifikatoren auf Einschränkungen und damit auf die Messung und Platzierung von Composables auswirken.
Modifikatoren im UI-Baum
Um zu verstehen, wie sich Modifikatoren gegenseitig beeinflussen, ist es hilfreich, sich vorzustellen, wie sie in der UI-Struktur angezeigt werden, die während der Kompositionsphase generiert wird. Weitere Informationen finden Sie im Abschnitt Zusammensetzung.
In der UI-Struktur können Sie Modifikatoren als Wrapper-Knoten für die Layoutknoten visualisieren:
Wenn Sie einer zusammensetzbaren Funktion mehr als einen Modifikator hinzufügen, wird eine Kette von Modifikatoren erstellt. Wenn Sie mehrere Modifikatoren verketten, umschließt jeder Modifikatorknoten den Rest der Kette und den Layoutknoten darin. Wenn Sie beispielsweise einen clip- und einen size-Modifikator verketten, umschließt der clip-Modifikatorknoten den size-Modifikatorknoten, der wiederum den Image-Layoutknoten umschließt.
In der Layoutphase bleibt der Algorithmus, der den Baum durchläuft, gleich, aber jeder Modifikatorknoten wird ebenfalls besucht. So kann ein Modifikator die Größenanforderungen und die Platzierung des Modifikators oder Layoutknotens ändern, den er umschließt.
Wie in Abbildung 2 dargestellt, besteht die Implementierung der Composables Image und Text aus einer Kette von Modifikatoren, die einen einzelnen Layoutknoten umschließen.
Die Implementierungen von Row und Column sind Layoutknoten, die beschreiben, wie ihre untergeordneten Elemente angeordnet werden sollen.

Zusammenfassung:
- Modifikatoren umschließen einen einzelnen Modifikator- oder Layoutknoten.
- Layoutknoten können mehrere untergeordnete Knoten enthalten.
In den folgenden Abschnitten wird beschrieben, wie Sie dieses mentale Modell verwenden, um über die Verkettung von Modifikatoren nachzudenken und wie sich diese auf die Größe von Composables auswirkt.
Einschränkungen in der Layoutphase
Die Layoutphase folgt einem dreistufigen Algorithmus, um die Breite, Höhe und x, y-Koordinate jedes Layoutknotens zu ermitteln:
- Untergeordnete Elemente messen: Ein Knoten misst seine untergeordneten Elemente, falls vorhanden.
- Eigene Größe festlegen: Basierend auf diesen Messungen entscheidet ein Knoten über seine eigene Größe.
- Untergeordnete Elemente platzieren: Jedes untergeordnete Element wird relativ zur Position des Knotens platziert.
Constraints hilft dabei, in den ersten beiden Schritten des Algorithmus die richtigen Größen für die Knoten zu finden. Einschränkungen definieren die Mindest- und Höchstgrenzen für die Breite und Höhe eines Knotens. Wenn der Knoten seine Größe festlegt, sollte die gemessene Größe innerhalb dieses Größenbereichs liegen.
Einschränkungstypen
Eine Einschränkung kann eine der folgenden sein:
- Begrenzt: Der Knoten hat eine maximale und minimale Breite und Höhe.
- Unbegrenzt: Der Knoten ist nicht auf eine bestimmte Größe beschränkt. Die maximale Breite und Höhe sind auf unendlich festgelegt.
- Genau: Der Knoten muss eine genaue Größenanforderung erfüllen. Die Mindest- und Höchstgrenzen sind auf denselben Wert festgelegt.
- Kombination: Der Knoten folgt einer Kombination der vorherigen Einschränkungstypen. Eine Einschränkung könnte beispielsweise die Breite begrenzen, aber eine unbegrenzte maximale Höhe zulassen, oder eine genaue Breite festlegen, aber eine begrenzte Höhe vorgeben.
Im nächsten Abschnitt wird beschrieben, wie diese Einschränkungen von einem übergeordneten Element an ein untergeordnetes Element übergeben werden.
So werden Einschränkungen vom übergeordneten an das untergeordnete Element weitergegeben
Im ersten Schritt des Algorithmus, der unter Einschränkungen in der Layoutphase beschrieben wird, werden Einschränkungen im UI-Baum von übergeordneten an untergeordnete Elemente weitergegeben.
Wenn ein übergeordneter Knoten seine untergeordneten Knoten misst, stellt er jedem untergeordneten Knoten diese Einschränkungen zur Verfügung, damit sie wissen, wie groß oder klein sie sein dürfen. Wenn es dann seine eigene Größe festlegt, hält es sich auch an die Einschränkungen, die von seinen eigenen übergeordneten Elementen übergeben wurden.
Auf übergeordneter Ebene funktioniert der Algorithmus so:
- Um die Größe zu bestimmen, die er tatsächlich einnehmen möchte, misst der Stammknoten im UI-Baum seine untergeordneten Elemente und leitet dieselben Einschränkungen an sein erstes untergeordnetes Element weiter.
- Wenn das untergeordnete Element ein Modifikator ist, der sich nicht auf die Messung auswirkt, werden die Einschränkungen an den nächsten Modifikator weitergeleitet. Die Einschränkungen werden unverändert in der Modifikatorkette weitergegeben, bis ein Modifikator erreicht wird, der sich auf die Messung auswirkt. Die Einschränkungen werden dann entsprechend angepasst.
- Sobald ein Knoten erreicht wird, der keine untergeordneten Elemente hat (ein sogenannter „Blattknoten“), wird seine Größe anhand der übergebenen Einschränkungen bestimmt und diese aufgelöste Größe an das übergeordnete Element zurückgegeben.
- Das übergeordnete Element passt seine Einschränkungen basierend auf den Messungen dieses untergeordneten Elements an und ruft das nächste untergeordnete Element mit diesen angepassten Einschränkungen auf.
- Sobald alle untergeordneten Elemente eines übergeordneten Elements gemessen wurden, entscheidet der übergeordnete Knoten über seine eigene Größe und teilt diese seinem eigenen übergeordneten Element mit.
- Auf diese Weise wird der gesamte Baum nach dem Tiefensuchverfahren durchlaufen. Schließlich haben alle Knoten ihre Größe festgelegt und der Messschritt ist abgeschlossen.
Ein ausführliches Beispiel findest du im Video Constraints and modifier order.
Modifikatoren, die sich auf Einschränkungen auswirken
Im vorherigen Abschnitt haben Sie gelernt, dass sich einige Modifikatoren auf die Größe von Einschränkungen auswirken können. In den folgenden Abschnitten werden bestimmte Modifikatoren beschrieben, die sich auf Einschränkungen auswirken.
Der size-Modifikator
Der Modifikator size deklariert die bevorzugte Größe des Inhalts.
Der folgende UI-Baum sollte beispielsweise in einem Container mit 300dp von 200dp gerendert werden. Die Einschränkungen sind begrenzt und erlauben Breiten zwischen 100dp und 300dp sowie Höhen zwischen 100dp und 200dp:
Der Modifikator size passt eingehende Einschränkungen an den übergebenen Wert an.
In diesem Beispiel ist der Wert 150dp:
size-Modifikator, der Einschränkungen auf 150dp anpasst.Wenn die Breite und Höhe kleiner als die kleinste Einschränkungsgrenze oder größer als die größte Einschränkungsgrenze sind, gleicht der Modifikator die übergebenen Einschränkungen so genau wie möglich ab, hält sich aber an die übergebenen Einschränkungen:
size-Modifikator, der die übergebene Einschränkung so genau wie möglich einhält.Beachten Sie, dass das Verketten mehrerer size-Modifikatoren nicht funktioniert. Der erste size-Modifikator legt sowohl die Mindest- als auch die Höchstbeschränkung auf einen festen Wert fest. Auch wenn der zweite Größenmodifikator eine kleinere oder größere Größe anfordert, muss er sich an die genauen Grenzen halten, die übergeben wurden. Diese Werte werden also nicht überschrieben:
size-Modifikatoren, bei der der zweite übergebene Wert (50dp) den ersten Wert (100dp) nicht überschreibt.Der requiredSize-Modifikator
Verwenden Sie den Modifikator requiredSize anstelle von size, wenn der Knoten die eingehenden Einschränkungen überschreiben soll. Der Modifikator requiredSize ersetzt die eingehenden Einschränkungen und übergibt die von Ihnen angegebene Größe als genaue Grenzen.
Wenn die Größe im Baum nach oben weitergegeben wird, wird der untergeordnete Knoten im verfügbaren Bereich zentriert:
requiredSize-Modifikator überschreibt eingehende Einschränkungen des size-Modifikators.Die Modifikatoren width und height
Der Modifikator size passt sowohl die Breite als auch die Höhe der Einschränkungen an. Mit dem Modifikator width können Sie eine feste Breite festlegen, die Höhe jedoch unbestimmt lassen.
Mit dem Modifikator height können Sie eine feste Höhe festlegen, die Breite jedoch unbestimmt lassen:
width und der Modifikator height legen eine feste Breite bzw. Höhe fest.Der sizeIn-Modifikator
Mit dem Modifikator sizeIn können Sie genaue Mindest- und Höchstwerte für Breite und Höhe festlegen. Verwenden Sie den Modifikator sizeIn, wenn Sie die Einschränkungen genau steuern möchten.
sizeIn mit den festgelegten Werten minWidth, maxWidth, minHeight und maxHeight.Beispiele
In diesem Abschnitt wird die Ausgabe mehrerer Code-Snippets mit verketteten Modifikatoren gezeigt und erläutert.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .size(50.dp) )
Dieses Snippet liefert folgende Ausgabe:
Image füllt die maximale Größe als Ergebnis der Modifikatorkette aus.- Der Modifikator
fillMaxSizeändert die Einschränkungen, sodass sowohl die minimale Breite als auch die minimale Höhe auf den maximalen Wert festgelegt werden –300dpfür die Breite und200dpfür die Höhe. - Obwohl der Modifikator
sizeeine Größe von50dpverwenden möchte, muss er sich an die eingehenden Mindesteinschränkungen halten. Der Modifikatorsizegibt also auch die genauen Einschränkungsgrenzen von300mal200aus und ignoriert den im Modifikatorsizeangegebenen Wert. - Das
Imagefolgt diesen Grenzen und meldet eine Größe von300x200, die im Baum nach oben weitergegeben wird.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .wrapContentSize() .size(50.dp) )
Dieses Snippet liefert folgende Ausgabe:
Image ist zentriert und auf 50dp festgelegt.- Der Modifikator
fillMaxSizepasst die Einschränkungen so an, dass sowohl die Mindestbreite als auch die Mindesthöhe auf den Höchstwert festgelegt werden –300dpfür die Breite und200dpfür die Höhe. - Mit dem Modifikator
wrapContentSizewerden die Mindesteinschränkungen zurückgesetzt. WährendfillMaxSizealso zu festen Einschränkungen geführt hat, wird es durchwrapContentSizewieder auf begrenzte Einschränkungen zurückgesetzt. Der folgende Knoten kann jetzt wieder den gesamten Platz einnehmen oder kleiner als der gesamte Platz sein. - Der Modifikator
sizelegt die Einschränkungen auf die Mindest- und Höchstgrenzen von50fest. - Der
Imagewird in eine Größe von50×50aufgelöst und dersize-Modifikator leitet dies weiter. - Der Modifikator
wrapContentSizehat ein spezielles Attribut. Es nimmt sein untergeordnetes Element und platziert es in der Mitte der verfügbaren Mindestgrenzen, die an es übergeben wurden. Die Größe, die es an seine übergeordneten Elemente weitergibt, entspricht also den Mindestgrenzen, die an es übergeben wurden.
Wenn Sie nur drei Modifikatoren kombinieren, können Sie eine Größe für das Composable festlegen und es im übergeordneten Element zentrieren.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .clip(CircleShape) .padding(10.dp) .size(100.dp) )
Dieses Snippet liefert folgende Ausgabe:
- Der Modifikator
clipändert die Einschränkungen nicht. - Der Modifikator
paddingsenkt die maximalen Einschränkungen. - Der Modifikator
sizesetzt alle Einschränkungen auf100dp. - Das
Imagehält sich an diese Einschränkungen und meldet eine Größe von100dpx100dp. - Der Modifikator
paddingfügt der vonImagegemeldeten Größe auf allen Seiten10dphinzu. Das Layout mit Padding meldet also eine Breite und Höhe von120dp. - In der Zeichenphase wirkt sich der
clip-Modifikator auf eine Canvas von120dpx120dpaus. Es wird eine kreisförmige Maske dieser Größe erstellt. - Der Modifikator
paddingrückt dann den Inhalt auf allen Seiten um10dpein, wodurch die Canvas-Größe fürImageauf100dpmal100dpreduziert wird. - Das
Imagewird in diesem kleineren Canvas gezeichnet. Das Bild wird basierend auf dem ursprünglichen Kreis von120dpzugeschnitten, sodass das Ergebnis nicht rund ist.