Kullanıcı tarafından ölçeklendirilebilen içerikleri destekleme

Uygulamanızda ölçeklenebilir içeriği desteklemek için yakınlaştırmak için parmakla sıkıştırma hareketlerini uygulayın. Bu, erişilebilirliği iyileştirmek için platform genelinde tutarlı olan standart bir yöntemdir. Kullanıcıların metin ve kullanıcı arayüzü öğelerinin boyutunu ihtiyaçlarına göre sezgisel olarak ayarlamasına olanak tanır. Uygulamanız, ayrıntılı kontrol ve bağlamsal davranışla özel ölçeklendirme davranışı tanımlayabilir. Bu davranış, kullanıcılara ekran büyütme gibi sistem düzeyinde bir özellikten daha hızlı keşfettikleri bir deneyim sunar.

Ölçeklendirme stratejisi seçme

Bu kılavuzda ele alınan stratejiler, kullanıcı arayüzünün ekran genişliğine uyacak şekilde yeniden akmasına ve yeniden düzenlenmesine neden olur. Bu özellik, uzun metin satırlarını okumak için gerekli olan yatay kaydırma ve sinir bozucu "zig-zag" hareketini ortadan kaldırarak önemli bir erişilebilirlik avantajı sağlar.

Daha fazla bilgi: Araştırmalar, az gören kullanıcılar için içeriğin yeniden akıtılmasının, iki boyutlu kaydırma gerektiren arayüzlere kıyasla çok daha okunabilir ve gezinmesi kolay olduğunu doğrulamaktadır. Daha fazla bilgi için Mobil Cihazlarda Pan-and-Scan ve Yeniden Akıtılabilir İçerik Karşılaştırması başlıklı makaleyi inceleyin.

Tüm öğeleri veya yalnızca metin öğelerini ölçeklendirme

Aşağıdaki tabloda, her ölçeklendirme stratejisinin görsel etkisi gösterilmektedir.

Strateji Yoğunluk ölçekleme Yazı tipi ölçeklendirme

Davranış

Her şeyi orantılı olarak ölçeklendirir. İçerik, kapsayıcısına sığacak şekilde yeniden düzenlenir. Böylece kullanıcı, tüm içeriği görmek için yatay olarak kaydırma yapmak zorunda kalmaz.

Yalnızca metin öğelerini etkiler. Genel düzen ve metin olmayan bileşenler aynı boyutta kalır.

Ölçekler

Tüm görsel öğeler: Metin, bileşenler (düğmeler, simgeler), resimler ve düzen aralığı (dolgu, kenar boşlukları)

Yalnızca metin

Gösterim

Öneriler

Görsel farklılıkları gördüğünüze göre, aşağıdaki tablo avantaj ve dezavantajları değerlendirmenize ve içeriğiniz için en iyi stratejiyi seçmenize yardımcı olur.

Kullanıcı arayüzü türü

Önerilen strateji

Akıl Yürütme (Reasoning)

Okuma odaklı düzenler

Örnekler: Haber makaleleri, mesajlaşma uygulamaları

Yoğunluk veya yazı tipi ölçeklendirme

Satır içi resimler de dahil olmak üzere tüm içerik alanını ölçeklendirmek için yoğunluk ölçeklendirmesi tercih edilir.

Yalnızca metnin ölçeklendirilmesi gerekiyorsa yazı tipi ölçeklendirme basit bir alternatiftir.

Görsel olarak yapılandırılmış düzenler

Örnekler: uygulama mağazaları, sosyal medya feed'leri

Yoğunluk ölçeklendirme

Carousel'lerde veya ızgaralarda resimler ile metin arasındaki görsel ilişkileri korur. Yeniden akıtma özelliği, iç içe yerleştirilmiş kaydırma öğeleriyle çakışacak olan yatay kaydırmayı önler.

Jetpack Compose'da ölçeklendirme hareketlerini algılama

Kullanıcı tarafından ölçeklendirilebilen içeriği desteklemek için öncelikle çoklu dokunma hareketlerini algılamanız gerekir. Jetpack Compose'da bunu Modifier.transformable kullanarak yapabilirsiniz.

transformable değiştiricisi, son hareket etkinliğinden bu yana zoomChange değişimini sağlayan üst düzey bir API'dir. Bu, durum güncelleme mantığını doğrudan birikime (ör. scale *= zoomChange) indirgeyerek bu kılavuzda ele alınan uyarlanabilir ölçeklendirme stratejileri için ideal hale getirir.

Pratiğe aktarma örnekleri

Aşağıdaki örneklerde, yoğunluk ölçeklendirme ve yazı tipi ölçeklendirme stratejilerinin nasıl uygulanacağı gösterilmektedir.

Yoğunluk ölçekleme

Bu yaklaşım, bir kullanıcı arayüzü alanının temel density değerini ölçeklendirir. Sonuç olarak, dolgu, aralık ve bileşen boyutları dahil olmak üzere tüm düzene dayalı ölçümler, ekran boyutu veya çözünürlüğü değişmiş gibi ölçeklendirilir. Metin boyutu yoğunluğa da bağlı olduğundan orantılı olarak ölçeklendirilir. Bu strateji, belirli bir alandaki tüm öğeleri eşit şekilde büyütmek, kullanıcı arayüzünüzün genel görsel ritmini ve oranlarını korumak istediğinizde etkilidir.

private class DensityScalingState(
    // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x.
    private val minScale: Float = 0.75f,
    private val maxScale: Float = 3.5f,
    private val currentDensity: Density
) {
    val transformableState = TransformableState { zoomChange, _, _ ->
        scaleFactor.floatValue =
            (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale)
    }
    val scaleFactor = mutableFloatStateOf(1f)
    fun scaledDensity(): Density {
        return Density(
            currentDensity.density * scaleFactor.floatValue,
            currentDensity.fontScale
        )
    }
}

Yazı tipi ölçeklendirme

Bu strateji daha hedeflidir ve yalnızca fontScale faktörünü değiştirir. Sonuç olarak yalnızca metin öğeleri büyür veya küçülür. Kapsayıcılar, dolgu ve simgeler gibi diğer tüm düzen bileşenleri ise sabit boyutta kalır. Bu strateji, okuma yoğun uygulamalarda metin okunabilirliğini artırmak için uygundur.

class FontScaleState(
    // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x.
    private val minScale: Float = 0.75f,
    private val maxScale: Float = 3.5f,
    private val currentDensity: Density
) {
    val transformableState = TransformableState { zoomChange, _, _ ->
        scaleFactor.floatValue =
            (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale)
    }
    val scaleFactor = mutableFloatStateOf(1f)
    fun scaledFont(): Density {
        return Density(
            currentDensity.density,
            currentDensity.fontScale * scaleFactor.floatValue
        )
    }
}

Paylaşılan demo kullanıcı arayüzü

Bu, farklı ölçeklendirme davranışlarını vurgulamak için önceki iki örnekte de kullanılan paylaşılan DemoCard composable'dır.

@Composable
private fun DemoCard() {
    Card(
        modifier = Modifier
            .width(360.dp)
            .padding(16.dp),
        shape = RoundedCornerShape(12.dp)
    ) {
        Column(
            modifier = Modifier.padding(16.dp),
            verticalArrangement = Arrangement.spacedBy(16.dp)
        ) {
            Text("Demo Card", style = MaterialTheme.typography.headlineMedium)
            var isChecked by remember { mutableStateOf(true) }
            Row(verticalAlignment = Alignment.CenterVertically) {
                Text("Demo Switch", Modifier.weight(1f), style = MaterialTheme.typography.bodyLarge)
                Switch(checked = isChecked, onCheckedChange = { isChecked = it })
            }
            Row(verticalAlignment = Alignment.CenterVertically) {
                Icon(Icons.Filled.Person, "Icon", Modifier.size(32.dp))
                Spacer(Modifier.width(8.dp))
                Text("Demo Icon", style = MaterialTheme.typography.bodyLarge)
            }
            Row(
                Modifier.fillMaxWidth(),
                horizontalArrangement = Arrangement.SpaceBetween
            ) {
                Box(
                    Modifier
                        .width(100.dp)
                        .weight(1f)
                        .height(80.dp)
                        .background(Color.Blue)
                )
                Box(
                    Modifier
                        .width(100.dp)
                        .weight(1f)
                        .height(80.dp)
                        .background(Color.Red)
                )
            }
            Text(
                "Demo Text: Lorem ipsum dolor sit amet, consectetur adipiscing elit," +
                    " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
                style = MaterialTheme.typography.bodyMedium,
                textAlign = TextAlign.Justify
            )
        }
    }
}

İpuçları ve dikkat edilmesi gereken noktalar

Daha iyi ve erişilebilir bir deneyim oluşturmak için aşağıdaki önerileri göz önünde bulundurun:

  • Hareketle ölçeklendirme kontrolleri dışında seçenekler sunun: Bazı kullanıcılar hareketlerle ilgili sorun yaşayabilir. Bu kullanıcıları desteklemek için ölçeği ayarlamak veya sıfırlamak üzere hareketlere dayanmayan alternatif bir yöntem sunmayı düşünebilirsiniz.
  • Tüm ölçeklere uygun geliştirme: Kullanıcı arayüzünüzü hem uygulama içi ölçeklendirmeye hem de sistem genelindeki yazı tipi veya ekran ayarlarına göre test edin. Uygulamanızın düzenlerinin, içerikleri bozmadan, çakıştırmadan veya gizlemeden doğru şekilde uyum sağladığını kontrol edin. Uyarlanabilir düzenler oluşturma hakkında daha fazla bilgi edinin.