Typeface — android.graphics paketindən Android SDK sinfi olub, şriftin təsvirini təmsil edir və TextView və digər UI komponentlərində mətnin fərdiləşdirilməsi üçün istifadə olunur. Typeface şrift ailəsini, onun çəkisini (normal, bold) və stilini (normal, italic) müəyyən edir. Google Developers-a görə, Typeface TTF, OTF, XML şriftlərindən və sistem resurslarından yükləməni dəstəkləyir. Bu, Android proqramlarında tipografiyanı idarə etmək üçün mərkəzi sinifdir.
Əsas məqamlar
Typeface — Android sinfi olub, şrift haqqında məlumatı encapsulate edir: onun ailəsi (Roboto, Arial, Serif) və stil modifikatorları (qalınlıq, kursiv). iOS-dakı UIFont-dan fərqli olaraq, Typeface ölçü haqqında məlumat ehtiva etmir — mətnin ölçüsü ayrıca TextView-də textSize xassəsi və ya Spannable-da TextStyle vasitəsilə təyin edilir. Typeface yalnız şriftin təsviri və garniturasına cavabdehdir.
Sinif bütün API səviyyələrində mövcuddur. Android 4.4-ə qədər Typeface yalnız məhdud sistem şriftləri dəstini dəstəkləyirdi: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF. Android 8.0-dan (API 26) başlayaraq XML resursları vasitəsilə fərdi şriftlərin yüklənməsi dəstəyi əlavə edildi, Android 10 isə variativ şriftləri dəstəklədi.
Android bir neçə daxili Typeface nümunəsi təqdim edir: Typeface.DEFAULT — sistem şrifti Roboto (Material) və ya Noto (AOSP), DEFAULT_BOLD — qalın versiya, MONOSPACE — kod üçün monospace şrift, SERIF — serif şrifti (Noto Serif), SANS_SERIF — sans-serif (Noto Sans). Bu sabitlər kontekst olmadan əlçatandır və fayl oxuma icazəsi tələb etmir.
Android sistemi bütün mətnin render edilməsi üçün Typeface-dən istifadə edir, o cümlədən sistem UI, başlıqlar, etiketlər və bildirişlər. Hər bir proqram tema (android:fontFamily) və ya proqramlı şəkildə setTypeface() vasitəsilə standart şrifti ləğv edə bilər. Typeface TextView-dən miras alan bütün komponentlərə tətbiq olunur: düymələr, EditText və fərdi görünüşlər.
Android 8.0+ res/font-a şriftlər əlavə etməyə və onları XML resursları vasitəsilə istifadə etməyə imkan verir. Şrift faylı (TTF və ya OTF) res/font qovluğuna yerləşdirilir, sonra R.font.font_name istinadı yaradılır. Typeface ResourcesCompat.getFont(context, R.font.font_name) vasitəsilə yüklənir. Bu üsul üstünlük təşkil edir, çünki şrift APK-ya kompilyasiya olunur və ProGuard sxemlərini dəstəkləyir.
Resurs üsulu həmçinin res/font-da XML faylı vasitəsilə şrift ailələrini (font family) dəstəkləyir: müxtəlif təsvirlər (regular, bold, italic) üçün bir neçə fayl göstərilə bilər və sistem setTypeface çağırışında avtomatik olaraq lazımi faylı seçir. Bu tipografiyanı sadələşdirir — temada fontFamily təyin etmək kifayətdir, Android isə uyğun faylı özü seçir.
Typeface.create(Typeface family, int style) metodu göstərilən ailə və stil ilə şrift nümunəsi yaradır. Əgər ailədə tələb olunan stil artıq varsa, mövcud nümunə qaytarılır. Stil yoxdursa, Android onu sintez edir — əsas şriftə saxta qalınlıq və ya süni kursiv tətbiq edir.
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
Sintezləşdirilmiş pseudo-bold nazik şriftlərdə keyfiyyətsiz görünə bilər. Daha yaxşı nəticə üçün həqiqi bold təsviri olan şrift faylından istifadə edin. Typeface.create() mövcud olmayan stil ilə istisna atmır, ən yaxın mövcud variantı qaytarır.
Assets-dən Typeface yükləmək üçün Typeface.createFromAsset(assetManager, path) istifadə olunur. Şrift src/main/assets/fonts/ qovluğuna yerləşdirilir, yol assets-ə nisbətən göstərilir. Bu üsul Android-in bütün versiyalarında işləyir, lakin şrift ailələrini dəstəkləmir və hər bir təsvir üçün konkret fayl göstərilməsini tələb edir.
Typeface.createFromFile(File) metodu fayl sistemindəki ixtiyari fayldan şrift yükləyir. Bu, şəbəkədən endirilən və ya proqramın daxili yaddaşına kopyalanan şriftlər üçün faydalıdır. createFromFile həmçinin kontekst tələb etmir, bu fon tapşırıqları üçün əlverişlidir, lakin fayl oxuna bilən olmalıdır.
createFromAsset vasitəsilə assets-dən Typeface-in təkrar yüklənməsi təkrarlanan obyektlərin yaranmasına səbəb ola bilər. Hər createFromAsset çağırışı faylı yenidən yükləyir. Açarın fayl yolu, dəyərin isə yüklənmiş nümunə olduğu HashMap vasitəsilə Typeface keşi tətbiq etmək tövsiyə olunur. Bu, xüsusilə müxtəlif şrift növləri olan siyahılar üçün aktualdır.
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")
}
}
}
// İstifadə
val typeface = TypefaceCache.getTypeface(context, "Roboto-Bold.ttf")
Yaddaşdakı keş bir şriftin proqram sessiyası ərzində yalnız bir dəfə yüklənməsini təmin edir. Konfiqurasiya dəyişikliyində (ekranın fırlanması) keş saxlanılır, çünki companion obyektində yerləşir. Yaddaş çatışmazlığı zamanı keşi təmizləmək üçün WeakHashMap istifadə edin və ya onTrimMemory-i dinləyin.
Typeface TextView-ə setTypeface(Typeface tf) və ya setTypeface(Typeface tf, int style) metodu vasitəsilə tətbiq olunur. İkinci variant cari şriftə nisbətən stili (bold/italic) dəyişməyə imkan verir. XML-də android:fontFamily atributu şriftə və ya sistem ailəsinə istinadla istifadə olunur. Proqramlı quraşdırma üçün setTypeface(monospaceTypeface) çağırışı şrifti göstərilənə dəyişəcək.
Typeface bütün TextView mətninə təsir edir. Bir sətirdə fərqli şrift tələb olunarsa, SpannableString ilə TypefaceSpan istifadə olunur. TypefaceSpan Typeface və ya family qəbul edir və simvol diapazonuna tətbiq olunur. Bu, iç-içə komponentlər olmadan bir TextView daxilində şriftləri qarışdırmağın yeganə yoludur.
TypefaceSpan-i yalnız sətrin bir hissəsinə tətbiq edin. Məsələn, mətndə dəyişənin dəyəri monospace şrifti ilə, qalan mətn isə sistem şrifti ilə göstərilməlidir. SpannableString yaradılır və lazımi diapazona MONOSPACE Typeface ilə TypefaceSpan təyin edilir. Mətnin qalan hissəsi TextView-in orijinal şrifti ilə qalır.
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” mətni monospace şrifti ilə mavi rəngdə, “Kod:” sözü isə sistem şrifti ilə göstəriləcək. TypefaceSpan mətnin hər bir hissəsinə dəqiq nəzarət üçün istənilən digər spanlarla birləşdirilə bilər.
Android bir neçə şrift formatını dəstəkləyir: TrueType (TTF), OpenType (OTF) və Android 10-dan etibarən Web Open Font Format (WOFF2). TTF və OTF fərdi şriftlər üçün əsas formatlardır. XML şriftləri (Font Family) ayrıca format deyil, hər bir təsvir üçün hansı faylın istifadə ediləcəyini təsvir edən təyinatdır.
res/font vasitəsilə fərdi şriftdən istifadə etmək üçün regular, bold və italic üçün şrift fayllarının yollarını göstərən XML ailə faylı yaradın. Sonra proqramın temamında android:fontFamily="@font/custom_family" təyin edin. Bu temadan istifadə edən bütün TextView-lər avtomatik olaraq hər bir stil üçün düzgün təsviri alacaq.
Şrift şəbəkədən endirilirsə, onu filesDir və ya cacheDir-də saxlayın və Typeface.createFromFile vasitəsilə yükləyin. Yüklənmədən sonra TextView-də Typeface-i yeniləyin. Asinxron yükləmə üçün coroutine və ya DownloadManager istifadə edin, bitdikdən sonra isə Handler vasitəsilə UI axınına göndərin. Bu, tələb əsasında yüklənən fərdi tipografiyası olan proqramlar üçün tipik ssenaridir.
// Şrift faylını daxili yaddaşa saxla
val fontFile = File(context.cacheDir, "downloaded-font.otf")
fontFile.outputStream().use { output ->
// şəbəkədən giriş axını
inputStream.copyTo(output)
}
// Fayldan Typeface yarat
val downloadedTypeface = Typeface.createFromFile(fontFile)
textView.typeface = downloadedTypeface
Yükləmədən əvvəl faylın əlçatanlığını yoxlayın: fayl zədələnmiş və ya etibarsızdırsa, Typeface.createFromFile RuntimeException atacaq. Çağırışı try-catch blokuna almaq və xəta halında standart sistem şriftini buraxmaq tövsiyə olunur.
Jetpack Compose-da Android SDK Typeface birbaşa istifadə olunmur. Bunun əvəzinə Compose tipografiya üçün FontFamily və FontWeight təqdim edir. FontFamily Font.Resource və Font.File vasitəsilə yüklənir. Compose tipografiya sistemi MaterialTheme.typography vasitəsilə təyin edilir, burada hər bir stile (h1, body1, button) fərdi FontFamily təyin edilə bilər.
Resources-dan şrift yükləmək üçün Compose Font(R.font.font_name, weight, style) istifadə edir. Assets-dən şrift Font(assetPath = "fonts/custom.otf", weight, style) vasitəsilə yüklənir. Şrift təyin edildikdən sonra Typography-ə ötürülür, sonra MaterialTheme.typography.bodyLarge və oxşar stillər vasitəsilə tətbiq olunur.
Android SDK vasitəsilə yaradılmış hazır Typeface varsa, onu Compose-da TypefaceAdapter və ya Typeface əsasında FontFamily yaratmaqla istifadə etmək olar. Bunun üçün Typeface-i Typeface.create-dən alın və FontFamily.Custom(listOf(Font(typeface))) vasitəsilə ötürün. Bununla belə, Font.Resource ilə native yanaşmadan istifadə etmək tövsiyə olunur, çünki Compose üçün daha yaxşı optimallaşdırılıb.
Fayllardan şrift yükləmək potensial olaraq bahalı əməliyyatdır. Hər Typeface.createFromAsset və ya Typeface.createFromFile çağırışı faylı diskdən oxuyur, onu pars edir və Typeface obyekti yaradır. 1-2 MB ölçülü şriftlər üçün bu, soyuq başlanğıcda 10-50 ms çəkə bilər. Fərdi şriftləri olan proqramlar üçün Typeface keşləməsi məcburi təcrübədir.
Android SDK createFromAsset və ya createFromFile vasitəsilə yaradılan şriftləri keşləmir. Zygote prosesində əvvəlcədən yüklənən sistem şriftlərindən fərqli olaraq, fərdi şriftlər hər müraciətdə yüklənir. Şrift identifikatorundan açar kimi istifadə edərək LruCache və ya ConcurrentHashMap istifadə etmək tövsiyə olunur. Keş ölçüsü — proqramın tipik şrift dəstini əhatə edən 10-20 nümunə.
Android 8.0+ XML Font Family vasitəsilə şrift yükləməsini optimallaşdırır. XML düzümündə android:fontFamily="@font/my_family" göstərildikdə, Android şrifti tənbəl şəkildə yükləyir — yalnız komponent görünən olduqda. Sistem həmçinin ResourcesCompat.getFont() vasitəsilə yüklənən şriftləri prosesin qlobal keşində saxlayır. Bu, resurs üsulunu ən performanslı edir.
RecyclerView adapterlərində Typeface istifadə edərkən şrifti onBindViewHolder metodunda yükləməmək vacibdir. Yükləməni adapter yaradılarkən bir dəfə çağırın və ya əvvəlcədən yüklənmiş Typeface ilə ViewHolder istifadə edin. Siyahının hər bir elementi unikal şrift tələb edirsə, WeakHashMap vasitəsilə keş tətbiq edin və yaddaşa qənaət etmək üçün görünən mövqelərdən kənara sürüşdürmə zamanı onu təmizləyin.
Tez-tez verilən suallar
Typeface — proqram istifadəsi üçün konkret şrift nümunəsidir. FontFamily — müxtəlif təsvirlər (regular, bold, italic) üçün şrift faylları qrupunu təsvir edən XML resursudur. Runtime-da FontFamily ResourcesCompat.getFont vasitəsilə Typeface-ə çevrilir. Typeface FontFamily-ni keçərək birbaşa fayldan yaradıla bilər.
Typeface.createFromFile(File) və ya Typeface.DEFAULT istifadə edin. Bu metodlar kontekst tələb etmir, çünki fayl sistemi və ya daxili sabitlərlə işləyir. Assets və ya resurslardan yükləmək üçün kontekst mütləqdir, çünki AssetManager və proqram resurslarına giriş tələb olunur.
Xeyr, WebView şriftləri göstərmək üçün CSS font-family xassəsindən istifadə edir. WebView-da fərdi şrift istifadə etmək üçün şrift faylını assets-ə yerləşdirin və CSS-də @font-face vasitəsilə göstərin. Android SDK Typeface yalnız native UI komponentləri (TextView və varisləri) ilə işləyir.
Bəli, Android 10-dan (API 29) etibarən. Variativ şriftlər ResourcesCompat.getFont və ya Typeface.createFromFile vasitəsilə yüklənir. Dəyişkənlik oxlarını (weight, width) tənzimləmək üçün Compose-da FontStyle və ya XML atributları istifadə olunur. Proqramlı şəkildə oxu yalnız aşağı səviyyəli Skia API vasitəsilə dəyişmək olar.
Ən çox yayılmış səbəblər: şrift faylı layihədə yoxdur, səhv fayl adı göstərilib, şrift zədələnib və ya faylda olmayan sintezləşdirilmiş stil istifadə olunur. Faylın res/font və ya assets-ə əlavə edildiyini və resurs üsulu vəziyyətində adının genişlənmə olmadan göstərildiyini yoxlayın.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun