Bu sayfada, Oluştur uygulamanızda yazı tiplerini nasıl ayarlayacağınız açıklanmaktadır.
Yazı tipini ayarla
Text
, composable'da kullanılan yazı tipinin ayarlanmasına izin veren bir fontFamily
parametresi içerir. Varsayılan olarak serif, sans-serif, monospace ve italik yazı tipi aileleri dahildir:
@Composable fun DifferentFonts() { Column { Text("Hello World", fontFamily = FontFamily.Serif) Text("Hello World", fontFamily = FontFamily.SansSerif) } }
res/font
klasöründe tanımlanan özel yazı tipleriyle çalışmak için fontFamily
özelliğini kullanabilirsiniz:
Bu örnekte, bu yazı tipi dosyalarına göre ve Font
işlevini kullanarak bir fontFamily
öğesini nasıl tanımlayacağınız gösterilmektedir:
val firaSansFamily = FontFamily( Font(R.font.firasans_light, FontWeight.Light), Font(R.font.firasans_regular, FontWeight.Normal), Font(R.font.firasans_italic, FontWeight.Normal, FontStyle.Italic), Font(R.font.firasans_medium, FontWeight.Medium), Font(R.font.firasans_bold, FontWeight.Bold) )
Bu fontFamily
öğesini Text
bileşeninize iletebilirsiniz. Bir fontFamily
farklı ağırlıklar içerebileceğinden, metninize uygun ağırlığı seçmek için fontWeight
'yi manuel olarak ayarlayabilirsiniz:
Column { Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Light) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Normal) Text( text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Normal, fontStyle = FontStyle.Italic ) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Medium) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Bold) }
Uygulamanızın tamamında yazı tipini nasıl ayarlayacağınızı öğrenmek için Oluşturma'daki özel tasarım sistemleri başlıklı makaleyi inceleyin.
İndirilebilir yazı tipleri
Oluştur 1.2.0 sürümünden itibaren, Google yazı tiplerini asenkron olarak indirip uygulamanızda kullanmak için Oluştur uygulamanızdaki indirilebilir yazı tipleri API'sini kullanabilirsiniz.
Özel sağlayıcılar tarafından sağlanan indirilebilir yazı tipleri şu anda desteklenmemektedir.
İndirilebilir yazı tiplerini programatik olarak kullanma
Bir yazı tipini uygulamanızdan programatik olarak indirmek için aşağıdaki adımları uygulayın:
- Bağımlılığı ekleyin:
Groovy
dependencies { ... implementation "androidx.compose.ui:ui-text-google-fonts:1.7.5" }
Kotlin
dependencies { ... implementation("androidx.compose.ui:ui-text-google-fonts:1.7.5") }
GoogleFont.Provider
sınıfını Google Fonts'un kimlik bilgileriyle başlatın: Sağlayıcının aldığı parametreler şunlardır:val provider = GoogleFont.Provider( providerAuthority = "com.google.android.gms.fonts", providerPackage = "com.google.android.gms", certificates = R.array.com_google_android_gms_fonts_certs )
- Google Fonts için yazı tipi sağlayıcı yetkilisi.
- Sağlayıcının kimliğini doğrulamak için kullanılan yazı tipi sağlayıcı paketi.
- Sağlayıcının kimliğini doğrulamak için sertifikalara ait karma oluşturma dizisi listesi. Google Fonts sağlayıcısı için gereken karma oluşturma işlemlerini, Jetchat örnek uygulamasındaki
font_certs.xml
dosyasında bulabilirsiniz.
FontFamily
tanımlayın: Yazı tipinizle ilgili diğer parametreleri (ör. kalınlık ve stil)// ... import androidx.compose.ui.text.googlefonts.GoogleFont import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider) )
FontWeight
veFontStyle
ile sorgulayabilirsiniz:// ... import androidx.compose.ui.text.googlefonts.GoogleFont import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font( googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold, style = FontStyle.Italic ) )
FontFamily
değerini, metin derlenebilir işlevinizde kullanılacak şekilde yapılandırın:
Text( fontFamily = fontFamily, text = "Hello World!" )
FontFamily
öğenizi kullanmak için Yazı biçimi de tanımlayabilirsiniz:
val MyTypography = Typography( bodyMedium = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.Normal, fontSize = 12.sp/*...*/ ), bodyLarge = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.Bold, letterSpacing = 2.sp, /*...*/ ), headlineMedium = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.SemiBold/*...*/ ), /*...*/ )
Ardından, yazı tipini uygulamanızın temasına göre ayarlayın:
MyAppTheme( typography = MyTypography )/*...*/
Material3 ile birlikte Compose'da indirilebilir yazı tiplerini uygulayan bir uygulama örneği için Jetchat örnek uygulamasını inceleyin.
Yedek yazı tipleri ekleme
Yazı tipinin düzgün indirilememesi ihtimaline karşı yazı tipiniz için bir yedek zinciri belirleyebilirsiniz. Örneğin, indirilebilir yazı tipinizi şu şekilde tanımladıysanız:
// ... import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider), Font(googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold) )
Yazı tipinizin varsayılanlarını her iki kalınlık için de şu şekilde tanımlayabilirsiniz:
// ... import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider), Font(resId = R.font.my_font_regular), Font(googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold), Font(resId = R.font.my_font_regular_bold, weight = FontWeight.Bold) )
Doğru içe aktarma işlemlerini eklediğinizden emin olun.
FontFamily
bu şekilde tanımlandığında ağırlık başına bir tane olmak üzere iki zincir içeren bir FontFamily
oluşturulur. Yükleme mekanizması, önce online yazı tipini, ardından yerel R.font
kaynak klasörünüzdeki yazı tipini çözmeye çalışır.
Uygulamanızda hata ayıklama
Yazı tipinin doğru şekilde indirilip indirilmediğini doğrulamanıza yardımcı olması için bir hata ayıklama eş anlamlı işleyicisi tanımlayabilirsiniz. Herkese açık kullanıcı adınız, yazı tipi eşzamanlı olarak yüklenemediğinde ne yapılacağını belirtir.
Bir CoroutineExceptionHandler
oluşturarak başlayın:
val handler = CoroutineExceptionHandler { _, throwable -> // process the Throwable Log.e(TAG, "There has been an issue: ", throwable) }
Çözümleyicinin yeni işleyiciyi kullanması için bunu createFontFamilyResolver
yöntemine iletin:
CompositionLocalProvider( LocalFontFamilyResolver provides createFontFamilyResolver(LocalContext.current, handler) ) { Column { Text( text = "Hello World!", style = MaterialTheme.typography.bodyMedium ) } }
Sağlayıcının kullanılabilir olup olmadığını ve sertifikalarının doğru şekilde yapılandırılıp yapılandırılmadığını test etmek için sağlayıcının isAvailableOnDevice
API'sini de kullanabilirsiniz. Bunu yapmak için sağlayıcı yanlış yapılandırılmışsa yanlış değerini döndüren isAvailableOnDevice
yöntemini çağırabilirsiniz.
val context = LocalContext.current LaunchedEffect(Unit) { if (provider.isAvailableOnDevice(context)) { Log.d(TAG, "Success!") } }
Uyarılar
Google Yazı Tipleri'nin yeni yazı tiplerini Android'de kullanıma sunması birkaç ay sürer.
Bir yazı tipinin fonts.google.com sitesine eklenmesi ile indirilebilir yazı tipleri API'si üzerinden (View (View) veya Compose'da) kullanıma sunulması arasında zaman farkı var. Yeni eklenen yazı tipleri, uygulamanızda IllegalStateException
ile yüklenmeye çalışabilir.
Geliştiricilerin bu hatayı diğer yazı tipi yükleme hatalarından ayırt etmesine yardımcı olmak için, Oluştur'daki istisna için açıklayıcı mesajlar ekledik. Bu değişiklikleri buradan inceleyebilirsiniz.
Sorunla karşılaşırsanız sorun izleyiciyi kullanarak bildirin.
Değişken yazı tiplerini kullanma
Değişken yazı tipi, bir yazı tipi dosyasının farklı stiller içermesine olanak tanıyan bir yazı tipi biçimidir. Değişken yazı tipleriyle, tercih ettiğiniz stili oluşturmak için eksenleri (veya parametreleri) değiştirebilirsiniz. Bu eksenler kalınlık, genişlik, eğiklik ve italik gibi standart veya değişken yazı tipleri arasında farklılık gösteren özel olabilir.
Normal yazı tipi dosyaları yerine değişken yazı tipleri kullandığınızda birden fazla yerine tek bir yazı tipi dosyanız olur.
Değişken yazı tipleri hakkında daha fazla bilgi için Google Fonts Bilgi, mevcut değişken yazı tiplerinin tüm kataloğu ve her yazı tipi için desteklenen eksenlerin tablosunu inceleyin.
Bu doküman, Compose uygulamanızda bir değişken yazı tipini nasıl uygulayacağınızı gösterir.
Değişken yazı tipi yükleme
Kullanmak istediğiniz değişken yazı tipini (ör. Roboto Flex) indirip uygulamanızdaki
app/res/font
klasörüne yerleştirin .ttf
dosyası, yazı tipinin değişken yazı tipi sürümüdür ve yazı tipi dosyanızın adı tamamen küçük harftir ve özel karakter içermez.Değişken yazı tipi yüklemek için
res/font/
dizinine yerleştirilmiş yazı tipini kullanarak birFontFamily
tanımlayın:// In Typography.kt @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(950), FontVariation.width(30f), FontVariation.slant(-6f), ) ) )
FontVariation
API; ağırlık, genişlik ve eğim gibi standart yazı tipi eksenlerini yapılandırmanıza olanak tanır. Bunlar, tüm değişken yazı tiplerinde kullanılabilen standart eksenlerdir. Yazı tipinin kullanılacağı yere göre yazı tipi için farklı yapılandırmalar oluşturabilirsiniz.Değişken yazı tipleri yalnızca Android O ve sonraki sürümlerde kullanılabilir. Bu nedenle, bir koruma çubuğu ekleyin ve uygun bir yedek yapılandırın:
// In Typography.kt val default = FontFamily( /* * This can be any font that makes sense */ Font( R.font.robotoflex_static_regular ) ) @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(950), FontVariation.width(30f), FontVariation.slant(-6f), ) ) ) } else { default }
Daha kolay yeniden kullanım için ayarları bir sabit değer grubuna çıkarın ve yazı tipi ayarlarını şu sabit değerlerle değiştirin:
// VariableFontDimension.kt object DisplayLargeVFConfig { const val WEIGHT = 950 const val WIDTH = 30f const val SLANT = -6f const val ASCENDER_HEIGHT = 800f const val COUNTER_WIDTH = 500 } @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(DisplayLargeVFConfig.WEIGHT), FontVariation.width(DisplayLargeVFConfig.WIDTH), FontVariation.slant(DisplayLargeVFConfig.SLANT), ) ) ) } else { default }
Materyal Tasarım 3 tipografisini
FontFamily
kullanacak şekilde yapılandırın:// Type.kt val Typography = Typography( displayLarge = TextStyle( fontFamily = displayLargeFontFamily, fontSize = 50.sp, lineHeight = 64.sp, letterSpacing = 0.sp, /***/ ) )
Bu örnekte, farklı varsayılan yazı tipi ayarlarına ve önerilen kullanım alanlarına sahip
displayLarge
Material 3 yazı tipi kullanılmaktadır. Örneğin, ekrandaki en büyük metin olduğu için kısa ve kritik metinler içindisplayLarge
kullanmalısınız.Material 3 ile yazı tipinizi özelleştirmek için
TextStyle
vefontFamily
'nin varsayılan değerlerini değiştirebilirsiniz. Yukarıdaki snippet'te, her yazı tipi ailesinin yazı tipi ayarlarını özelleştirmek içinTextStyle
örneklerini yapılandırırsınız.Yazı tipinizi tanımladığınıza göre M3'e iletin
MaterialTheme
:MaterialTheme( colorScheme = MaterialTheme.colorScheme, typography = Typography, content = content )
Son olarak, bir
Text
bileşeni kullanın ve stili, tanımlanmış yazı tipi stillerindenMaterialTheme.typography.displayLarge
biri olarak belirtin:@Composable @Preview fun CardDetails() { MyCustomTheme { Card( shape = RoundedCornerShape(8.dp), elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { Column( modifier = Modifier.padding(16.dp) ) { Text( text = "Compose", style = MaterialTheme.typography.displayLarge, modifier = Modifier.padding(bottom = 8.dp), maxLines = 1 ) Text( text = "Beautiful UIs on Android", style = MaterialTheme.typography.headlineMedium, modifier = Modifier.padding(bottom = 8.dp), maxLines = 2 ) Text( text = "Jetpack Compose is Android’s recommended modern toolkit for building native UI. It simplifies and accelerates UI development on Android. Quickly bring your app to life with less code, powerful tools, and intuitive Kotlin APIs.", style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(bottom = 8.dp), maxLines = 3 ) } } } }
Her
Text
bileşeni, Material temasının stili aracılığıyla yapılandırılır ve farklı bir değişken yazı tipi yapılandırması içerir. M3MaterialTheme
composable'ına sağlanan yazı tipini almak içinMaterialTheme.typography
öğesini kullanabilirsiniz.
Özel eksenler
Yazı tiplerinde özel eksenler de olabilir. Bunlar, yazı tipi dosyasının içinde tanımlanır.
Örneğin, Roboto Flex yazı tipinin artan yüksekliği ("YTAS"
) ekseni vardır. Bu eksen, küçük harfli artan öğelerin yüksekliğini ayarlarken sayaç genişliği ("XTRA"
) her bir harfin genişliğini ayarlar.
Bu eksenlerin değerini FontVariation
ayarlarıyla değiştirebilirsiniz.
Bir yazı tipi için yapılandırabileceğiniz özel eksenler hakkında daha fazla bilgi için her yazı tipinin desteklenen eksenler tablosunu inceleyin.
Özel eksenler kullanmak için özel
ascenderHeight
vecounterWidth
eksenleri için işlevler tanımlayın:fun ascenderHeight(ascenderHeight: Float): FontVariation.Setting { require(ascenderHeight in 649f..854f) { "'Ascender Height' must be in 649f..854f" } return FontVariation.Setting("YTAS", ascenderHeight) } fun counterWidth(counterWidth: Int): FontVariation.Setting { require(counterWidth in 323..603) { "'Counter width' must be in 323..603" } return FontVariation.Setting("XTRA", counterWidth.toFloat()) }
Bu işlevler şunları yapar:
- Kabul edebilecekleri değerler için kısıtlamalar belirleyin. Değişken yazı tipleri kataloğunda görebileceğiniz gibi,
ascenderHeight (YTAS)
için minimum değer649f
, maksimum değer ise854f
'tir. - Yapılandırmanın yazı tipine eklenmeye hazır olması için yazı tipi ayarını geri döndürün.
FontVariation.Setting()
yönteminde, eksen adı (YTAS, XTRA
) sabit kodlanır ve değeri parametre olarak alır.
- Kabul edebilecekleri değerler için kısıtlamalar belirleyin. Değişken yazı tipleri kataloğunda görebileceğiniz gibi,
Yazı tipi yapılandırmasıyla eksenleri kullanarak, yüklenen her
Font
için ek parametreler iletin:@OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(DisplayLargeVFConfig.WEIGHT), FontVariation.width(DisplayLargeVFConfig.WIDTH), FontVariation.slant(DisplayLargeVFConfig.SLANT), ascenderHeight(DisplayLargeVFConfig.ASCENDER_HEIGHT), counterWidth(DisplayLargeVFConfig.COUNTER_WIDTH) ) ) ) } else { default }
Küçük harflerin üst çıkıntılarının yüksekliğinin arttığını ve diğer metnin daha geniş olduğunu görebilirsiniz:
Ek kaynaklar
Daha fazla bilgi için değişken yazı tipleri hakkındaki şu blog yayınını inceleyin:
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Oluşturma bölümündeki kaynaklar
- Metni biçimlendirme
- Oluşturma bölümündeki Material Design 2