Typeface — nedir, yazı tipi çeşitleri ve Android’de çalışma

Yazar: IT Sectr Yayınlanma: 2026-07-23 Okuma süresi: 9 dk

Typeface — android.graphics paketinden bir Android SDK sınıfıdır, bir yazı tipinin görünümünü temsil eder ve TextView ile diğer UI bileşenlerinde metin özelleştirme için kullanılır. Typeface, yazı tipi ailesini, ağırlığını (normal, bold) ve stilini (normal, italic) tanımlar. Google Developers’a göre Typeface, TTF, OTF dosyalarından, XML yazı tiplerinden ve sistem kaynaklarından yüklemeyi destekler. Android uygulamalarında tipografi yönetimi için merkezi sınıftır.

Önemli Noktalar

  • Typeface — aile ve stil ile yazı tipi görünümünü temsil eden Android sınıfı
  • Yerleşik stiller: Typeface.NORMAL, BOLD, ITALIC, BOLD_ITALIC
  • Yazı tipleri yüklenir XML kaynaklarından, TTF/OTF dosyalarından, assets veya sistem klasörlerinden
  • Android 8.0+ res/font içindeki XML kaynakları üzerinden yazı tipi yüklemeyi destekler
  • Typeface.create() belirtilen aile ve stil ile bir örnek oluşturur

Typeface Nedir?

Typeface — yazı tipi bilgilerini kapsülleyen bir Android sınıfıdır: ailesi (Roboto, Arial, Serif) ve stil değiştiricileri (bold, italic). iOS’taki UIFont’un aksine Typeface, boyut bilgisi içermez — metin boyutu TextView’daki textSize özelliği veya Spannable’daki TextStyle aracılığıyla ayrı ayrı ayarlanır. Typeface yalnızca yazı tipinin görünümünden ve ailesinden sorumludur.

Sınıf tüm API seviyelerinde kullanılabilir. Android 4.4’ten önce Typeface yalnızca sınırlı bir sistem yazı tipi kümesini destekliyordu: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF. Android 8.0 (API 26)’dan itibaren XML kaynakları üzerinden özel yazı tiplerini yükleme desteği eklendi ve Android 10, değişken yazı tipleri desteğini ekledi.

Yerleşik Typeface Sabitleri

Android, birkaç yerleşik Typeface örneği sağlar: Typeface.DEFAULT — sistem yazı tipi Roboto (Material) veya Noto (AOSP), DEFAULT_BOLD — kalın sürüm, MONOSPACE — kod için sabit genişlikli yazı tipi, SERIF — serif yazı tipi (Noto Serif), SANS_SERIF — sans-serif (Noto Sans). Bu sabitler bağlam olmadan kullanılabilir ve dosya okuma izinleri gerektirmez.

Sistemde Typeface

Android sistemi, sistem UI, başlıklar, altyazılar ve bildirimler dahil olmak üzere tüm metni işlemek için Typeface kullanır. Her uygulama, varsayılan yazı tipini tema (android:fontFamily) veya programlama yoluyla setTypeface() ile geçersiz kılabilir. Typeface, TextView’dan türetilen tüm bileşenlere uygulanır: düğmeler, EditText ve özel görünümler.

Kaynaklardan Typeface Oluşturma

Android 8.0+, res/font’a yazı tipleri eklemeye ve bunları XML kaynakları aracılığıyla kullanmaya izin verir. Yazı tipi dosyası (TTF veya OTF) res/font içine yerleştirilir ve ardından R.font.font_name referansı oluşturulur. Typeface, ResourcesCompat.getFont(context, R.font.font_name) aracılığıyla yüklenir. Bu yöntem tercih edilir çünkü yazı tipi APK’ya derlenir ve ProGuard derleme sistemlerini destekler.

Kaynak yaklaşımı ayrıca res/font içindeki bir XML dosyası aracılığıyla yazı tipi ailelerini de destekler: farklı stiller (regular, bold, italic) için birden çok dosya belirtebilirsiniz ve setTypeface çağrıldığında sistem otomatik olarak uygun dosyayı seçer. Bu, tipografiyi basitleştirir — temada fontFamily’yi ayarlamanız yeterlidir ve Android otomatik olarak doğru dosyayı seçer.

Typeface.create Kullanımı

Typeface.create(Typeface family, int style) yöntemi, belirtilen aile ve stil ile bir yazı tipi örneği oluşturur. Ailede istenen stil zaten varsa, mevcut örnek döndürülür. Stil eksikse, Android onu sentezler — temel yazı tipine yapay kalın veya yapay italik uygular.

kotlin
val boldTypeface = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD)
val italicTypeface = Typeface.create(Typeface.MONOSPACE, Typeface.ITALIC)
val customTypeface = ResourcesCompat.getFont(context, R.font.montserrat_regular)
textView.typeface = boldTypeface

Sentezlenen yapay kalın, ince yazı tiplerinde düşük kaliteli görünebilir. En iyi sonuç için gerçek bir kalın yazı tipi stiline sahip bir yazı tipi dosyası kullanın. Typeface.create(), var olmayan bir stil ile istisna fırlatmaz, bunun yerine mevcut en yakın varyantı döndürür.

Dosya ve Assets’ten Typeface

Assets’ten Typeface yüklemek için Typeface.createFromAsset(assetManager, path) kullanın. Yazı tipi, src/main/assets/fonts/ dizinine yerleştirilir ve yol, assets’e göre belirtilir. Bu yöntem tüm Android sürümlerinde çalışır ancak yazı tipi ailelerini desteklemez ve her stil için belirli bir dosya belirtilmesini gerektirir.

Typeface.createFromFile(File) yöntemi, dosya sistemindeki herhangi bir dosyadan bir yazı tipi yükler. Bu, ağdan indirilen veya uygulamanın iç depolama alanına kopyalanan yazı tipleri için kullanışlıdır. createFromFile ayrıca bağlam gerektirmez, bu da arka plan görevleri için uygundur, ancak dosyanın okunabilir olması gerekir.

Assets’ten Önbellek ile Yükleme

createFromAsset aracılığıyla Typeface’i tekrar tekrar yüklemek, yinelenen nesnelerin oluşturulmasına yol açabilir. Her createFromAsset çağrısı dosyayı yeniden yükler. Anahtarın dosya yolu ve değerin yüklenen örnek olduğu bir HashMap kullanarak Typeface önbelleği uygulanması önerilir. Bu, özellikle farklı yazı tipi türlerine sahip listeler için önemlidir.

kotlin
object TypefaceCache {
    private val cache = mutableMapOf<String, Typeface>()
    fun getTypeface(context: Context, filename: String): Typeface {
        return cache.getOrPut(filename) {
            Typeface.createFromAsset(context.assets, "fonts/$filename")
        }
    }
}
// Usage
val typeface = TypefaceCache.getTypeface(context, "Roboto-Bold.ttf")

Bellek içi önbellek, bir yazı tipinin uygulama oturumu başına yalnızca bir kez yüklenmesini sağlar. Yapılandırma değişikliklerinde (ekran döndürme), önbellek bir companion nesnesinde bulunduğu için kalıcı olur. Bellek azaldığında önbelleği temizlemek için WeakHashMap kullanın veya onTrimMemory’yi dinleyin.

Typeface’i TextView’a Uygulama

Typeface, TextView’a setTypeface(Typeface tf) veya setTypeface(Typeface tf, int style) yöntemiyle uygulanır. İkinci seçenek, geçerli yazı tipine göre stili (bold/italic) değiştirmeye izin verir. XML’de, android:fontFamily özelliği bir yazı tipine veya sistem ailesine referansla kullanılır. Programlama yoluyla ayarlama için setTypeface(monospaceTypeface) çağrısı, yazı tipini belirtilenle değiştirir.

Typeface, TextView’ın tamamını etkiler. Tek bir satırda farklı yazı tipleri gerekiyorsa TypefaceSpan ile SpannableString kullanın. TypefaceSpan, Typeface veya aileyi kabul eder ve bir karakter aralığına uygulanır. İç içe bileşenler olmadan tek bir TextView içinde yazı tiplerini karıştırmanın tek yolu budur.

Kısmi Metin için TypefaceSpan

TypefaceSpan’i yalnızca dizenin bir kısmına uygulayın. Örneğin, metindeki bir değişken değeri sabit genişlikli olmalı, metnin geri kalanı sistem yazı tipinde kalmalıdır. Bir SpannableString oluşturun ve istenen aralıkta MONOSPACE Typeface ile bir TypefaceSpan ayarlayın. Metnin geri kalanı orijinal TextView yazı tipini korur.

kotlin
val text = "Code: variableName"
val spannable = SpannableString(text)
spannable.setSpan(
    TypefaceSpan(Typeface.MONOSPACE),
    5, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
spannable.setSpan(
    ForegroundColorSpan(Color.BLUE),
    5, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable

“variableName” metni mavi sabit genişlikli yazı tipinde görünecek, “Code:” kelimesi ise sistem yazı tipinde kalacaktır. TypefaceSpan, metnin her bir bölümü üzerinde hassas kontrol için diğer herhangi bir span ile birleştirilebilir.

Typeface ile Özel Yazı Tipleri

Android, birkaç yazı tipi biçimini destekler: TrueType (TTF), OpenType (OTF) ve Android 10’dan itibaren Web Open Font Format (WOFF2). TTF ve OTF, özel yazı tipleri için ana biçimlerdir. XML yazı tipleri (Font Family) ayrı bir biçim değil, her stil için hangi dosyanın kullanılacağının açıklaması olarak hizmet eder.

res/font aracılığıyla özel bir yazı tipi kullanmak için, regular, bold ve italic için yazı tipi dosyalarının yollarını belirten bir aile XML dosyası oluşturun. Ardından uygulama temasında android:fontFamily="@font/custom_family" belirtin. Bu temayı kullanan tüm TextView örnekleri, her stil için otomatik olarak doğru yazı tipini alır.

İndirilen Yazı Tiplerini Yükleme

Bir yazı tipi ağdan indirilirse, filesDir veya cacheDir’e kaydedin ve Typeface.createFromFile ile yükleyin. Yüklemeden sonra TextView’daki Typeface’i güncelleyin. Zaman uyumsuz yükleme için coroutine veya DownloadManager kullanın ve tamamlandıktan sonra Handler aracılığıyla UI iş parçacığına gönderin. Bu, isteğe bağlı olarak yüklenen özel tipografiye sahip uygulamalar için tipik bir senaryodur.

kotlin
// Save font file to internal storage
val fontFile = File(context.cacheDir, "downloaded-font.otf")
fontFile.outputStream().use { output ->
    // inputStream from network
    inputStream.copyTo(output)
}
// Create Typeface from file
val downloadedTypeface = Typeface.createFromFile(fontFile)
textView.typeface = downloadedTypeface

Yüklemeden önce dosyanın kullanılabilirliğini kontrol edin: dosya bozuksa veya geçersizse, Typeface.createFromFile bir RuntimeException fırlatır. Çağrının try-catch ile sarılması ve hata durumunda varsayılan sistem yazı tipine dönülmesi önerilir.

Jetpack Compose’da Typeface

Jetpack Compose’da Android SDK’nın Typeface’i doğrudan kullanılmaz. Bunun yerine Compose, tipografi için FontFamily ve FontWeight sağlar. FontFamily, Font.Resource ve Font.File aracılığıyla yüklenir. Compose’un tipografi sistemi MaterialTheme.typography ile tanımlanır ve her stile (h1, body1, button) özel bir FontFamily atanabilir.

Kaynaklardan bir yazı tipi yüklemek için Compose, Font(R.font.font_name, weight, style) kullanır. Assets’ten bir yazı tipi, Font(assetPath = "fonts/custom.otf", weight, style) aracılığıyla yüklenir. Yazı tipi tanımlandıktan sonra Typography’ye iletilir ve ardından MaterialTheme.typography.bodyLarge ve benzer stiller aracılığıyla uygulanır.

Typeface’i Compose Yazı Tipine Dönüştürme

Android SDK aracılığıyla oluşturulmuş mevcut bir Typeface’iniz varsa, TypefaceAdapter aracılığıyla veya Typeface’e dayalı bir FontFamily oluşturarak Compose’da kullanılabilir. Typeface’i Typeface.create’den alın ve FontFamily.Custom(listOf(Font(typeface)))’a iletin. Ancak Font.Resource ile yerel yaklaşım önerilir çünkü Compose için daha iyi optimize edilmiştir.

Performans ve Önbellekleme

Yazı tiplerini dosyalardan yüklemek potansiyel olarak pahalı bir işlemdir. Typeface.createFromAsset veya Typeface.createFromFile çağrısının her biri dosyayı diskten okur, ayrıştırır ve bir Typeface nesnesi oluşturur. 1-2 MB boyutundaki yazı tipleri için bu, soğuk başlangıçta 10-50 ms sürer. Özel yazı tiplerine sahip uygulamalar için Typeface önbellekleme zorunlu bir uygulamadır.

Android SDK, createFromAsset veya createFromFile aracılığıyla oluşturulan yazı tiplerini önbelleğe almaz. Zygote sürecinde önceden yüklenen sistem yazı tiplerinin aksine, özel yazı tipleri her erişimde yüklenir. Anahtar olarak bir yazı tipi tanımlayıcısıyla LruCache veya ConcurrentHashMap kullanılması önerilir. 10-20 örneklik bir önbellek boyutu, tipik bir uygulama yazı tipi setini kapsar.

Font Family ile Optimizasyon (API 26+)

Android 8.0+, XML Font Family aracılığıyla yazı tipi yüklemeyi optimize eder. XML düzeninde android:fontFamily="@font/my_family" belirtildiğinde, Android yazı tipini tembel olarak yükler — yalnızca bileşen görünür hale geldiğinde. Sistem ayrıca ResourcesCompat.getFont() ile yüklenen yazı tiplerini küresel bir süreç önbelleğinde saklar. Bu, kaynak yaklaşımını en verimli hale getirir.

RecyclerView’da Typeface

RecyclerView bağdaştırıcılarında Typeface kullanırken, yazı tipini onBindViewHolder yönteminde yüklememek önemlidir. Bağdaştırıcıyı oluştururken bir kez yükleyin veya önceden yüklenmiş Typeface ile bir ViewHolder kullanın. Her liste öğesi benzersiz bir yazı tipi gerektiriyorsa, WeakHashMap kullanarak bir önbellek uygulayın ve bellekten tasarruf etmek için görünür konumların ötesine kaydırırken temizleyin.

Sıkça Sorulan Sorular

Android’de Typeface ve FontFamily arasındaki fark nedir?

Typeface — programlama amaçlı kullanım için somut bir yazı tipi örneğidir. FontFamily — farklı stiller (regular, bold, italic) için yazı tipi dosyalarından oluşan bir grubu tanımlayan XML kaynağıdır. Çalışma zamanında FontFamily, ResourcesCompat.getFont aracılığıyla Typeface’e dönüştürülür. Typeface, FontFamily’yi atlayarak doğrudan bir dosyadan oluşturulabilir.

Bağlam olmadan Typeface nasıl yüklenir?

Typeface.createFromFile(File) veya Typeface.DEFAULT kullanın. Bu yöntemler, dosya sistemi veya yerleşik sabitlerle çalıştıkları için bağlam gerektirmez. Assets veya kaynaklardan yükleme için, AssetManager ve uygulama kaynaklarına erişim gerektiğinden bağlam gereklidir.

Typeface WebView’de kullanılabilir mi?

Hayır, WebView yazı tiplerini belirtmek için CSS font-family özelliğini kullanır. WebView’de özel bir yazı tipi kullanmak için yazı tipi dosyasını assets’e yerleştirin ve CSS’de @font-face aracılığıyla belirtin. Typeface Android SDK, yalnızca yerel UI bileşenleriyle (TextView ve ondan türeyenler) çalışır.

Typeface değişken yazı tiplerini destekler mi?

Evet, Android 10’dan (API 29) itibaren. Değişken yazı tipleri ResourcesCompat.getFont veya Typeface.createFromFile aracılığıyla yüklenir. Değişken eksenlerini (weight, width) yapılandırmak için Compose’da FontStyle veya XML özniteliklerini kullanın. Programlama yoluyla eksen değişiklikleri yalnızca Skia’nın düşük seviyeli API’leri aracılığıyla yapılabilir.

setTypeface neden bazı yazı tipleri için çalışmaz?

En yaygın nedenler: yazı tipi dosyası projede eksik, dosya adı yanlış, yazı tipi bozuk veya dosyada bulunmayan sentezlenmiş bir stil kullanılıyor. Dosyanın res/font veya assets’e eklendiğini ve kaynak yaklaşımı durumunda adının uzantısız belirtildiğini kontrol edin.

Özet

  • Typeface — aile ve stil ile yazı tipini temsil eden Android sınıfı
  • Yerleşik sabitler: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF
  • Yükleme ResourcesCompat.getFont, Typeface.createFromAsset, createFromFile aracılığıyla
  • XML Font Family (API 26+) — özel yazı tipleri için tercih edilen yöntem
  • TypefaceSpan, SpannableString aracılığıyla metnin bir kısmına yazı tipi uygulamaya izin verir
  • Typeface önbellekleme zorunludur — HashMap veya LruCache kullanın
  • Compose’da Android SDK Typeface’i yerine FontFamily ve FontWeight kullanın

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun