Oluşturma bölümünde, bir bileşenin görünümünü ve tarzını değiştirmek için birden fazla değiştiriciyi birbirine bağlayabilirsiniz. Bu değiştirici zincirleri, genişlik ve yükseklik sınırlarını tanımlayan, birleştirilebilir öğelere iletilen kısıtlamaları etkileyebilir.
Bu sayfada, zincirlenmiş değiştiricilerin kısıtlamaları ve dolayısıyla bileşenlerin ölçümünü ve yerleşimini nasıl etkilediği açıklanmaktadır.
Kullanıcı arayüzü ağacındaki değiştiriciler
Değiştiricilerin birbirini nasıl etkilediğini anlamak için, derleme aşamasında oluşturulan kullanıcı arayüzü ağacında nasıl göründüklerini görselleştirmek faydalıdır. Daha fazla bilgi için Beste bölümüne bakın.
Kullanıcı arayüzü ağacında, değiştiricileri düzen düğümleri için sarmalayıcı düğümler olarak görselleştirebilirsiniz:
Bir bileşiğe birden fazla değiştirici eklemek, değiştirici zinciri oluşturur. Birden fazla değiştiriciyi zincirlediğinizde her değiştirici düğümü zincirin geri kalanını ve içindeki düzen düğümünü sarar. Örneğin, bir clip
ve size
değiştiriciyi zincirlediğinizde clip
değiştirici düğümü, size
değiştirici düğümünü sarar. Bu düğüm de Image
düzen düğümünü sarar.
Düzenleme aşamasında, ağacı gezen algoritma aynı kalır ancak her değiştirici düğümü de ziyaret edilir. Bu sayede, değiştirici, sarmaladığı değiştiricinin veya düzen düğümünün boyut koşullarını ve yerleşimini değiştirebilir.
Şekil 2'de gösterildiği gibi, Image
ve Text
bileşenlerinin kendileri tek bir düzen düğümünü sarmalayan bir değiştirici zincirinden oluşur. Row
ve Column
'ün uygulamaları, alt öğelerinin nasıl yerleştirileceğini açıklayan basit düzen düğümleridir.
Özetlemek gerekirse:
- Değiştiriciler tek bir değiştiriciyi veya düzen düğümünü sarar.
- Düzenleme düğümleri birden fazla alt düğüm düzenleyebilir.
Aşağıdaki bölümlerde, değiştirici zincirleme hakkında akıl yürütmek ve bu işlemin birleştirilebilir öğelerin boyutunu nasıl etkilediği için bu zihinsel modelin nasıl kullanılacağı açıklanmaktadır.
Düzenleme aşamasındaki kısıtlamalar
Düzenleme aşaması, her düzen düğümünün genişliğini, yüksekliğini ve x, y koordinatını bulmak için üç adımlı bir algoritma izler:
- Alt öğeleri ölçme: Bir düğüm, varsa alt öğelerini ölçer.
- Kendi boyutunu belirleme: Bir düğüm, bu ölçümlere göre kendi boyutuna karar verir.
- Alt öğeleri yerleştirme: Her alt öğe, düğümün kendi konumuna göre yerleştirilir.
Constraints
, algoritmanın ilk iki adımında düğümler için doğru boyutları bulmanıza yardımcı olur. Kısıtlamalar, bir düğümün genişliği ve yüksekliği için minimum ve maksimum sınırları tanımlar. Düğüm boyutuna karar verdiğinde, ölçülen boyutu bu boyut aralığına girmelidir.
Kısıtlama türleri
Kısıtlamalar aşağıdakilerden biri olabilir:
- Sınırlı: Nodun maksimum ve minimum genişliği ve yüksekliği vardır.
- Sınırsız: Düğüm herhangi bir boyutla kısıtlanmamıştır. Maksimum genişlik ve yükseklik sınırları sonsuz olarak ayarlanır.
- Tam: Nod'dan tam bir boyut koşuluna uyması istenir. Minimum ve maksimum sınırlar aynı değere ayarlanır.
- Kombinasyon: Düğüm, yukarıdaki kısıtlama türlerinin bir kombinasyonunu izler. Örneğin, bir kısıtlama, sınırsız maksimum yüksekliğe izin verirken genişliği sınırlayabilir veya tam genişliği ayarlayabilir ancak sınırlı bir yükseklik sağlayabilir.
Sonraki bölümde bu kısıtlamaların üst öğeden alt öğeye nasıl aktarıldığı açıklanmaktadır.
Kısıtlamalar üst öğeden alt öğeye nasıl aktarılır?
Düzenleme aşamasındaki kısıtlamalar bölümünde açıklanan algoritmanın ilk adımında, kısıtlamalar kullanıcı arayüzü ağacında üst öğeden alt öğeye aktarılır.
Bir üst öğe, alt öğelerini ölçerken her alt öğeye ne kadar büyük veya küçük olmalarına izin verildiğini bildirmek için bu kısıtlamaları sağlar. Ardından, kendi boyutuna karar verirken kendi ebeveynleri tarafından iletilen kısıtlamalara da uyar.
Algoritma genel olarak aşağıdaki şekilde çalışır:
- Kullanıcı arayüzü ağacındaki kök düğüm, kaplamak istediği gerçek boyuta karar vermek için alt öğelerini ölçer ve aynı kısıtlamaları ilk alt öğesine iletir.
- Alt öğe, ölçümü etkilemeyen bir değiştiriciyse kısıtlamaları bir sonraki değiştiriciye iletir. Ölçümü etkileyen bir değiştiriciye ulaşılmadıkça kısıtlamalar, değiştirici zincirine olduğu gibi iletilir. Daha sonra kısıtlamalar buna göre yeniden boyutlandırılır.
- Alt öğesi olmayan bir düğüme ("yaprak düğüm" olarak adlandırılır) ulaşıldığında, düğüm boyutuna, iletilen kısıtlamalara göre karar verir ve bu çözüldü boyutu üst öğesine döndürür.
- Üst öğe, kısıtlamalarını bu alt öğenin ölçümlerine göre uyarlar ve sonraki alt öğesini bu ayarlanmış kısıtlamalarla çağırır.
- Bir üst öğenin tüm alt öğeleri ölçüldükten sonra üst öğe kendi boyutuna karar verir ve bunu kendi üst öğesine iletir.
- Bu sayede ağacın tamamı derinlik öncelikli olarak taranabilir. Sonunda tüm düğümler boyutlarına karar verir ve ölçüm adımı tamamlanır.
Ayrıntılı bir örnek için Kısıtlamalar ve değiştirici sırası videosuna bakın.
Kısıtlamaları etkileyen değiştiriciler
Önceki bölümde, bazı değiştiricilerin kısıtlama boyutunu etkileyebileceğini öğrendiniz. Aşağıdaki bölümlerde, kısıtlamaları etkileyen belirli değiştiriciler açıklanmaktadır.
size
değiştirici
size
değiştirici, içeriğin tercih edilen boyutunu belirtir.
Örneğin, aşağıdaki kullanıcı arayüzü ağacı 200dp
tarafından 300dp
kapsayıcısında oluşturulmalıdır. Sınırlamalar, 100dp
ile 300dp
arasında genişlik ve 100dp
ile 200dp
arasında yükseklik değerlerine izin verecek şekilde belirlenmiştir:
size
değiştiricisi, gelen kısıtlamaları kendisine iletilen değerle eşleşecek şekilde uyarlar.
Bu örnekte değer 150dp
'tür:
Genişlik ve yükseklik en küçük kısıtlama sınırından küçük veya en büyük kısıtlama sınırından büyükse değiştirici, iletilen kısıtlamalara mümkün olduğunca yakın bir şekilde eşleşirken iletilen kısıtlamalara da bağlı kalır:
Birden fazla size
değiştiriciyi zincirleme işleminin işe yaramadığını unutmayın. İlk size
değiştirici, hem minimum hem de maksimum kısıtlamaları sabit bir değere ayarlar. İkinci boyut değiştirici daha küçük veya daha büyük bir boyut istese bile iletilen tam sınırlara uyması gerekir. Bu nedenle, bu değerleri geçersiz kılmaz:
requiredSize
değiştirici
Nodunuzun gelen kısıtlamaları geçersiz kılması gerekiyorsa size
yerine requiredSize
değiştiricisini kullanın. requiredSize
değiştiricisi, gelen kısıtlamaları değiştirir ve belirttiğiniz boyutu tam sınırlar olarak iletir.
Boyut ağaca geri aktarıldığında alt düğüm, kullanılabilir alana ortalanır:
width
ve height
değiştiricileri
size
değiştiricisi, kısıtlamaların hem genişliğini hem de yüksekliğini uyarlar. width
değiştiricisiyle sabit bir genişlik ayarlayabilir ancak yüksekliği kararsız bırakabilirsiniz.
Benzer şekilde, height
değiştiricisiyle sabit bir yükseklik ayarlayabilir ancak genişliği kararsız bırakabilirsiniz:
sizeIn
değiştirici
sizeIn
değiştiricisi, genişlik ve yükseklik için tam minimum ve maksimum sınırlamalar belirlemenize olanak tanır. Kısıtlamalar üzerinde ayrıntılı kontrole ihtiyacınız varsa sizeIn
değiştiricisini kullanın.
Örnekler
Bu bölümde, zincirlenmiş değiştiricilere sahip çeşitli kod snippet'lerinin çıkışı gösterilip açıklanmaktadır.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .size(50.dp) )
Bu snippet aşağıdaki çıktıyı oluşturur:
fillMaxSize
değiştiricisi, hem minimum genişliği hem de yüksekliği maksimum değere (genişlikte300dp
, yükseklikte200dp
) ayarlayacak şekilde kısıtlamaları değiştirir.size
değiştirici50dp
boyutunu kullanmak istese bile gelen minimum kısıtlamalara uyması gerekir. Bu nedenlesize
değiştirici,size
değiştiricide sağlanan değeri etkili bir şekilde yok sayarak300
'un200
'ye göre tam kısıtlama sınırlarını da döndürür.Image
bu sınırları izler ve300
x200
boyutunu raporlar. Bu boyut, ağacın en üst kısmına kadar iletilir.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .wrapContentSize() .size(50.dp) )
Bu snippet aşağıdaki çıktıyı oluşturur:
fillMaxSize
değiştirici, hem minimum genişliği hem de yüksekliği maksimum değere (genişlik için300dp
, yükseklik için200dp
) ayarlayacak şekilde kısıtlamaları uyarlar.wrapContentSize
değiştiricisi, minimum kısıtlamaları sıfırlar. Bu nedenle,fillMaxSize
sabit kısıtlamalara neden olurkenwrapContentSize
sınırlanmış kısıtlamalara geri sıfırlar. Aşağıdaki düğüm artık alanın tamamını kaplayacak veya alanın tamamından daha küçük olacak şekilde ayarlanabilir.size
değiştiricisi,50
için minimum ve maksimum sınırları ayarlayarak kısıtlamaları belirler.Image
,50
boyutunda50
boyutunda bir boyuta çözünür vesize
değiştirici bunu iletir.wrapContentSize
değiştiricinin özel bir özelliği vardır. Çocuğunu alır ve kendisine iletilen kullanılabilir minimum sınırların ortasına yerleştirir. Bu nedenle, üst öğelerine ilettiği boyut, kendisine iletilen minimum sınırlara eşittir.
Yalnızca üç değiştiriciyi birleştirerek, derlenebilir öğe için bir boyut tanımlayabilir ve öğeyi üst öğesinin ortasına yerleştirebilirsiniz.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .clip(CircleShape) .padding(10.dp) .size(100.dp) )
Bu snippet aşağıdaki çıktıyı oluşturur:
clip
değiştiricisi, kısıtlamaları değiştirmez.padding
değiştiricisi, maksimum kısıtlamaları düşürür.size
değiştiricisi tüm kısıtlamaları100dp
olarak ayarlar.Image
bu kısıtlamalara uyar ve100
boyutunda100dp
raporlar.padding
değiştiricisi tüm boyutlara10dp
ekler. Bu nedenle, bildirilen genişlik ve yüksekliği20dp
artırır.- Artık çizim aşamasında
clip
değiştirici,120dp
tarafından120
kanvas üzerinde işlem yapar. Böylece bu boyutta bir daire maskesi oluşturur. padding
değiştiricisi, içeriğini tüm boyutlarda10dp
kadar içe yerleştirir. Böylece kanvas boyutunu100dp
kadar100
olarak düşürür.Image
, bu tuvale çizilir. Resim,120dp
orijinal dairesine göre kırpılır. Bu nedenle, sonuç yuvarlak olmayan bir sonuçtur.