Compose'da, bir composable'ın 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, composable'lara iletilen ve genişlik ile yükseklik sınırlarını tanımlayan kısıtlamaları etkileyebilir.
Bu sayfada, zincirleme değiştiricilerin kısıtlamaları ve dolayısıyla composable'ların ö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 birbirlerini nasıl etkilediğini anlamak için oluşturma aşamasında oluşturulan kullanıcı arayüzü ağacında nasıl göründüklerini görselleştirmek faydalı olur. Daha fazla bilgi için Oluşturma 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 composable'a birden fazla değiştirici eklediğinizde değiştirici zinciri oluşturulur. 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ü sarmalar. Örneğin, bir clip ve bir size değiştiriciyi zincirlediğinizde clip değiştirici düğümü, size değiştirici düğümünü sarmalar. Bu düğüm de Image düzen düğümünü sarmalar.
Düzen aşamasında, ağaçta gezinen 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 gereksinimlerini ve yerleşimini değiştirebilir.
Şekil 2'de gösterildiği gibi, Image ve Text composable'larının uygulanması, tek bir düzen düğümünü sarmalayan bir değiştirici zincirinden oluşur.
Row ve Column uygulamaları, alt öğelerinin nasıl düzenleneceğini açıklayan düzen düğümleridir.
Özetlemek gerekirse:
- Değiştiriciler, tek bir değiştiriciyi veya düzen düğümünü sarmalar.
- Düzen düğümleri, birden fazla alt düğümü düzenleyebilir.
Aşağıdaki bölümlerde, değiştirici zincirleme ve bunun composable'ların boyutunu nasıl etkilediği hakkında akıl yürütmek için bu zihinsel modelin nasıl kullanılacağı açıklanmaktadır.
Yerleşim aşamasındaki kısıtlamalar
Düzen 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 kullanır:
- Alt öğeleri ölçme: Düğüm, varsa alt öğelerini ölçer.
- Kendi boyutuna karar verme: Düğüm, bu ölçümlere göre kendi boyutuna karar verir.
- Alt öğeleri yerleştirme: Her alt düğüm, bir düğümün kendi konumuna göre yerleştirilir.
Constraints, algoritmanın ilk iki adımında düğümler için doğru boyutların bulunmasına 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ığında olmalıdır.
Kısıtlama türleri
Kısıtlama aşağıdakilerden biri olabilir:
- Sınırlı: Düğümün maksimum ve minimum genişliği ve yüksekliği vardır.
- Sınırsız: Düğüm herhangi bir boyutla sınırlı değildir. Maksimum genişlik ve yükseklik sınırları sonsuz olarak ayarlanır.
- Tam: Düğümden tam bir boyut koşuluna uyması istenir. Minimum ve maksimum sınırlar aynı değere ayarlanmıştır.
- Kombinasyon: Düğüm, önceki kısıtlama türlerinin bir kombinasyonunu izler. Örneğin, bir kısıtlama genişliği sınırlarken sınırsız bir maksimum yüksekliğe izin verebilir veya tam bir genişlik ayarlayabilir ancak sınırlı bir yükseklik sağlayabilir.
Bir 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üzen 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 düğüm, alt öğelerini ölçerken her bir alt öğeye bu kısıtlamaları sağlayarak ne kadar büyük veya küçük olmalarına izin verildiğini bildirir. Ardından, kendi boyutuna karar verirken kendi üst öğeleri tarafından iletilen kısıtlamalara da uyar.
Algoritma genel olarak şu şekilde çalışır:
- Kullanıcı arayüzü ağacındaki kök düğüm, kaplamak istediği 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. Kısıtlamalar, ölçümü etkileyen bir değiştiriciye ulaşılmadığı sürece değiştirici zincirine olduğu gibi aktarılır. 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, iletilen kısıtlamalara göre boyutuna karar verir ve bu çözümlenmiş boyutu üst öğesine döndürür.
- Üst öğe, kısıtlamalarını bu alt öğenin ölçümlerine göre uyarlar ve bir sonraki alt öğesini bu ayarlanmış kısıtlamalarla çağırır.
- Bir üst öğenin tüm alt öğeleri ölçüldükten sonra üst düğüm kendi boyutuna karar verir ve bunu kendi üst öğesine iletir.
- Bu şekilde, tüm ağaç derinlik öncelikli olarak taranır. 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ı videosunu izleyin.
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ştiricisi
size değiştiricisi, içeriğin tercih edilen boyutunu belirtir.
Örneğin, aşağıdaki kullanıcı arayüzü ağacı 300dp x 200dp boyutunda bir kapsayıcıda oluşturulmalıdır. Sınırlamalar, 100dp ile 300dp arasındaki genişliklere ve 100dp ile 200dp arasındaki yüksekliklere izin verir:
size değiştiricisi, gelen kısıtlamaları kendisine iletilen değerle eşleşecek şekilde uyarlar.
Bu örnekte değer 150dp:
size değiştiricisi, kısıtlamaları 150dp olarak ayarlıyor.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 uymaya devam ederken iletilen kısıtlamalarla mümkün olduğunca eşleşir:
size değiştirici.Birden fazla size değiştiricisini zincirlemenin işe yaramayacağı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:
size değiştiriciden oluşan bir zincir. Bu zincirde, iletilen ikinci değer (50dp) ilk değerin (100dp) üzerine yazılmaz.requiredSize değiştiricisi
Düğümünüzün 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ğaçta yukarı doğru iletildiğinde alt düğüm, kullanılabilir alanda ortalanır:
requiredSize değiştiricisi, size değiştiricisinden gelen kısıtlamaları geçersiz kılıyor.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 belirlemeden bırakabilirsiniz.
Benzer şekilde, height değiştiricisiyle sabit bir yükseklik ayarlayabilir ancak genişliği belirlemeden bırakabilirsiniz:
width değiştiricisi ve height değiştiricisi, sırasıyla sabit bir genişlik ve yükseklik ayarlar.sizeIn değiştiricisi
sizeIn değiştiricisi, genişlik ve yükseklik için tam minimum ve maksimum kısıtlamalar belirlemenize olanak tanır. Kısıtlamalar üzerinde ayrıntılı kontrol gerekiyorsa sizeIn değiştiricisini kullanın.
sizeIn değiştirici; minWidth, maxWidth, minHeight ve maxHeight ayarlanmış.Örnekler
Bu bölümde, zincirleme değiştiriciler içeren çeşitli kod snippet'lerinin çıkışı gösterilir ve açıklanır.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .size(50.dp) )
Bu snippet aşağıdaki çıkışı üretir:
Image, değiştirici zinciri sonucunda maksimum boyutu doldurur.fillMaxSizedeğiştiricisi, hem minimum genişliği hem de yüksekliği maksimum değere (300dpgenişlik ve200dpyükseklik) ayarlamak için kısıtlamaları değiştirir.sizedeğiştiricisi50dpboyutunu kullanmak istese de gelen minimum kısıtlamalara uyması gerekir. Bu nedenle,sizedeğiştirici,sizedeğiştiricide sağlanan değeri etkili bir şekilde yok sayarak300x200boyutundaki tam kısıtlama sınırlarını da verir.Imagebu sınırlara uyar ve300x200boyutunu bildirir. Bu boyut, ağacın en üstüne kadar iletilir.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .wrapContentSize() .size(50.dp) )
Bu snippet aşağıdaki çıkışı üretir:
Image ortalanır ve 50dp olarak boyutlandırılır.fillMaxSizedeğiştiricisi, kısıtlamaları hem minimum genişliği hem de yüksekliği maksimum değere (genişlikte300dpve yükseklikte200dp) ayarlayacak şekilde uyarlar.wrapContentSizedeğiştiricisi, minimum kısıtlamaları sıfırlar.fillMaxSize, sabit kısıtlamalarla sonuçlanırkenwrapContentSize, sınırlı kısıtlamalara geri döndürür. Sonraki düğüm artık tüm alanı kaplayabilir veya tüm alandan daha küçük olabilir.sizedeğiştiricisi, kısıtlamaları50için minimum ve maksimum sınırlara ayarlar.Image,50x50boyutuna çözümlenir vesizedeğiştirici bunu iletir.wrapContentSizedeğiştiricisinin özel bir özelliği vardır. Alt öğesini alır ve kendisine iletilen minimum sınırların merkezine yerleştirir. Bu nedenle, üst öğelerine ilettiği boyut, kendisine iletilen minimum sınırlara eşittir.
Yalnızca üç değiştiriciyi birleştirerek composable için bir boyut tanımlayabilir ve üst öğesinde ortalayabilirsiniz.
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .clip(CircleShape) .padding(10.dp) .size(100.dp) )
Bu snippet aşağıdaki çıkışı üretir:
clipdeğiştiricisi, kısıtlamaları değiştirmez.paddingdeğiştiricisi, maksimum kısıtlamaları azaltır.sizedeğiştiricisi, tüm kısıtlamaları100dpolarak ayarlar.Imagebu kısıtlamalara uyar ve100dpx100dpboyutunu bildirir.paddingdeğiştiricisi,Imagetarafından bildirilen boyuta her taraftan10dpekler. Bu nedenle, dolgulu düzen120dpgenişlik ve yükseklik bildirir.- Çizim aşamasında
clipdeğiştiricisi,120dpx120dpboyutundaki bir tuval üzerinde çalışır. Bu boyutta bir daire maskesi oluşturur. paddingdeğiştiricisi, içeriğini her taraftan10dpkadar içe doğru kaydırır. Bu daImageiçin tuval boyutunu100dpx100dpdeğerine düşürür.Image, bu daha küçük tuvalde çizilir. Resim, orijinal120dpdairesine göre kırpılır. Bu nedenle, sonuç dairesel olmaz.