Typeface — bu nima, shrift turlari va Android da ishlash

Muallif: IT Sectr Nashr etilgan: 2026-07-23 O'qish vaqti: 9 daq

Typeface — android.graphics paketidan Android SDK sinfi bo‘lib, shriftning ko‘rinishini ifodalaydi va TextView hamda boshqa UI komponentlarida matnni sozlash uchun ishlatiladi. Typeface shrift oilasini, uning og‘irligini (normal, bold) va uslubini (normal, italic) belgilaydi. Google Developers ga ko‘ra, Typeface TTF, OTF, XML shriftlari va tizim resurslaridan yuklashni qo‘llab-quvvatlaydi. Bu Android ilovalarida tipografiyani boshqarish uchun markaziy sinfdir.

Asosiy ma’lumotlar

  • Typeface — oila va uslub bilan shrift ko‘rinishini ifodalovchi Android sinfi
  • Ichki uslublar: Typeface.NORMAL, BOLD, ITALIC, BOLD_ITALIC
  • Shriftlar yuklanadi XML resurslari, TTF/OTF fayllari, assets yoki tizim papkalaridan
  • Android 8.0+ res/font da XML resurslari orqali shrift yuklashni qo‘llab-quvvatlaydi
  • Typeface.create() ko‘rsatilgan oila va uslub bilan namuna yaratadi

Typeface nima?

Typeface — Android sinfi bo‘lib, shrift haqidagi ma’lumotni kapsulalashtiradi: uning oilasi (Roboto, Arial, Serif) va uslub modifikatorlari (qalinlik, kursiv). iOS dagi UIFont dan farqli o‘laroq, Typeface o‘lcham haqida ma’lumotni o‘z ichiga olmaydi — matn o‘lchami TextView dagi textSize xususiyati yoki Spannable dagi TextStyle orqali alohida o‘rnatiladi. Typeface faqat shriftning ko‘rinishi va garniturasi uchun javobgardir.

Sinf barcha API darajalarida mavjud. Android 4.4 gacha Typeface faqat cheklangan tizim shriftlari to‘plamini qo‘llab-quvvatlagan: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF. Android 8.0 (API 26) dan boshlab XML resurslari orqali maxsus shriftlarni yuklash qo‘llab-quvvatlandi, Android 10 esa variativ shriftlarni qo‘shdi.

Ichki Typeface konstantalari

Android bir nechta ichki Typeface namunalarini taqdim etadi: Typeface.DEFAULT — tizim shrifti Roboto (Material) yoki Noto (AOSP), DEFAULT_BOLD — qalin versiya, MONOSPACE — kod uchun monoshirin shrift, SERIF — serif shrifti (Noto Serif), SANS_SERIF — sans-serif (Noto Sans). Bu konstantalar kontekstsiz mavjud va fayl o‘qish ruxsatini talab qilmaydi.

Tizimda Typeface

Android tizimi barcha matnni ko‘rsatish uchun Typeface dan foydalanadi, jumladan tizim UI, sarlavhalar, yorliqlar va bildirishnomalar. Har bir ilova standart shriftni mavzu (android:fontFamily) yoki dasturiy ravishda setTypeface() orqali bekor qilishi mumkin. Typeface TextView dan meros olgan barcha komponentlarga qo‘llaniladi: tugmalar, EditText va maxsus ko‘rinishlar.

Resurslardan Typeface yaratish

Android 8.0+ res/font ga shriftlar qo‘shish va ularni XML resurslari orqali ishlatish imkonini beradi. Shrift fayli (TTF yoki OTF) res/font ga joylashtiriladi, so‘ng R.font.font_name havolasi yaratiladi. Typeface ResourcesCompat.getFont(context, R.font.font_name) orqali yuklanadi. Bu usul afzal, chunki shrift APK ga kompilyatsiya qilinadi va ProGuard sxemalarini qo‘llab-quvvatlaydi.

Resurs usuli shuningdek res/font dagi XML fayli orqali shrift oilalarini (font family) qo‘llab-quvvatlaydi: turli ko‘rinishlar (regular, bold, italic) uchun bir nechta fayl ko‘rsatilishi mumkin va tizim setTypeface chaqiruvida avtomatik ravishda kerakli faylni tanlaydi. Bu tipografiyani soddalashtiradi — mavzuda fontFamily ni o‘rnatish kifoya, Android esa mos faylni o‘zi tanlaydi.

Typeface.create yaratish

Typeface.create(Typeface family, int style) metodi ko‘rsatilgan oila va uslub bilan shrift namunasini yaratadi. Agar oilada so‘ralgan uslub mavjud bo‘lsa, mavjud namuna qaytariladi. Uslub mavjud bo‘lmasa, Android uni sintez qiladi — asosiy shriftga soxta qalinlik yoki sun’iy kursiv qo‘llaydi.

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

Pseudo-bold sintezlangan shrifti yupqa shriftlarda sifatsiz ko‘rinishi mumkin. Yaxshiroq natija uchun haqiqiy bold ko‘rinishiga ega shrift faylidan foydalaning. Typeface.create() mavjud bo‘lmagan uslub bilan istisno tashlamaydi, eng yaqin mavjud variantni qaytaradi.

Fayl va assets dan Typeface

Assets dan Typeface yuklash uchun Typeface.createFromAsset(assetManager, path) ishlatiladi. Shrift src/main/assets/fonts/ papkasiga joylashtiriladi, yo‘l assets ga nisbatan ko‘rsatiladi. Bu usul Android ning barcha versiyalarida ishlaydi, lekin shrift oilalarini qo‘llab-quvvatlamaydi va har bir ko‘rinish uchun aniq fayl ko‘rsatilishini talab qiladi.

Typeface.createFromFile(File) metodi fayl tizimidagi istalgan fayldan shrift yuklaydi. Bu tarmoqdan yuklab olingan yoki ilovaning ichki xotirasiga nusxalangan shriftlar uchun foydalidir. createFromFile shuningdek kontekst talab qilmaydi, bu fon vazifalari uchun qulay, lekin fayl o‘qilishi mumkin bo‘lishi kerak.

Keshlash bilan assets dan yuklash

createFromAsset orqali assets dan Typeface ni takroriy yuklash takrorlanadigan ob’ektlarning paydo bo‘lishiga olib kelishi mumkin. Har bir createFromAsset chaqiruvi faylni qayta yuklaydi. Kalit fayl yo‘li, qiymat esa yuklangan namuna bo‘lgan HashMap orqali Typeface keshi joriy etish tavsiya etiladi. Bu, ayniqsa, turli shrift turlari bo‘lgan ro‘yxatlar uchun muhimdir.

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")
        }
    }
}
// Foydalanish
val typeface = TypefaceCache.getTypeface(context, "Roboto-Bold.ttf")

Xotiradagi kesh bir shriftning ilova sessiyasi davomida faqat bir marta yuklanishini ta’minlaydi. Konfiguratsiya o‘zgarishida (ekran aylanishi) kesh saqlanadi, chunki u companion ob’ektida joylashgan. Xotira yetishmovchiligida keshi tozalash uchun WeakHashMap dan foydalaning yoki onTrimMemory ni tinglang.

Typeface ni TextView ga qo‘llash

Typeface TextView ga setTypeface(Typeface tf) yoki setTypeface(Typeface tf, int style) metodi orqali qo‘llaniladi. Ikkinchi variant joriy shriftga nisbatan uslubni (bold/italic) o‘zgartirish imkonini beradi. XML da android:fontFamily atributi shriftga yoki tizim oilasiga havola bilan ishlatiladi. Dasturiy o‘rnatish uchun setTypeface(monospaceTypeface) chaqiruvi shriftni ko‘rsatilganga o‘zgartiradi.

Typeface butun TextView matniga ta’sir qiladi. Agar bir qatorda boshqa shrift kerak bo‘lsa, SpannableString bilan TypefaceSpan ishlatiladi. TypefaceSpan Typeface yoki family ni qabul qiladi va belgilar diapazoniga qo‘llaniladi. Bu ichki komponentlarsiz bir TextView ichida shriftlarni aralashtirishning yagona yo‘lidir.

Matnning bir qismi uchun TypefaceSpan

TypefaceSpan ni faqat satrning bir qismiga qo‘llang. Masalan, matndagi o‘zgaruvchining qiymati monoshirin shrift bilan, qolgan matn esa tizim shrifti bilan ko‘rsatilishi kerak. SpannableString yaratiladi va kerakli diapazonga MONOSPACE Typeface bilan TypefaceSpan o‘rnatiladi. Matnning qolgan qismi TextView ning asl shrifti bilan qoladi.

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” matni monoshirin shrift bilan ko‘k rangda, “Kod:” so‘zi esa tizim shrifti bilan ko‘rsatiladi. TypefaceSpan matnning har bir qismi ustidan aniq nazorat qilish uchun istalgan boshqa spanlar bilan birlashtirilishi mumkin.

Typeface orqali maxsus shriftlar

Android bir nechta shrift formatlarini qo‘llab-quvvatlaydi: TrueType (TTF), OpenType (OTF) va Android 10 dan boshlab Web Open Font Format (WOFF2). TTF va OTF maxsus shriftlar uchun asosiy formatlardir. XML shriftlari (Font Family) alohida format emas, balki har bir ko‘rinish uchun qaysi fayldan foydalanishni tavsiflovchi tavsifdir.

res/font orqali maxsus shriftdan foydalanish uchun regular, bold va italic uchun shrift fayllari yo‘llarini ko‘rsatuvchi XML oila faylini yarating. So‘ng ilova mavzusida android:fontFamily="@font/custom_family" ni o‘rnating. Bu mavzudan foydalanadigan barcha TextView lar avtomatik ravishda har bir uslub uchun to‘g‘ri ko‘rinishni oladi.

Yuklab olingan shriftlarni yuklash

Agar shrift tarmoqdan yuklab olinsa, uni filesDir yoki cacheDir da saqlang va Typeface.createFromFile orqali yuklang. Yuklashdan so‘ng TextView da Typeface ni yangilang. Asinxron yuklash uchun coroutine yoki DownloadManager dan foydalaning, tugagandan so‘ng esa Handler orqali UI oqimiga yuboring. Bu talab bo‘yicha yuklanadigan maxsus tipografiyaga ega ilovalar uchun odatiy stsenariydir.

kotlin
// Shrift faylini ichki xotiraga saqlash
val fontFile = File(context.cacheDir, "downloaded-font.otf")
fontFile.outputStream().use { output ->
    // tarmoqdan kirish oqimi
    inputStream.copyTo(output)
}
// Fayldan Typeface yaratish
val downloadedTypeface = Typeface.createFromFile(fontFile)
textView.typeface = downloadedTypeface

Yuklashdan oldin faylning mavjudligini tekshiring: agar fayl buzilgan yoki haqiqiy emas bo‘lsa, Typeface.createFromFile RuntimeException tashlaydi. Chaqiruvni try-catch blokiga o‘rash va xato holatida standart tizim shriftini qoldirish tavsiya etiladi.

Jetpack Compose da Typeface

Jetpack Compose da Android SDK Typeface bevosita ishlatilmaydi. Buning o‘rniga Compose tipografiya uchun FontFamily va FontWeight ni taqdim etadi. FontFamily Font.Resource va Font.File orqali yuklanadi. Compose tipografiya tizimi MaterialTheme.typography orqali o‘rnatiladi, bu erda har bir uslubga (h1, body1, button) maxsus FontFamily tayinlanishi mumkin.

Resources dan shrift yuklash uchun Compose Font(R.font.font_name, weight, style) dan foydalanadi. Assets dan shrift Font(assetPath = "fonts/custom.otf", weight, style) orqali yuklanadi. Shrift aniqlangandan so‘ng, u Typography ga uzatiladi, so‘ngra MaterialTheme.typography.bodyLarge va shunga o‘xshash uslublar orqali qo‘llaniladi.

Typeface ni Compose shriftiga aylantirish

Android SDK orqali yaratilgan tayyor Typeface mavjud bo‘lsa, uni Compose da TypefaceAdapter yoki Typeface asosida FontFamily yaratish orqali ishlatish mumkin. Buning uchun Typeface ni Typeface.create dan oling va FontFamily.Custom(listOf(Font(typeface))) ga uzating. Biroq, Font.Resource bilan native yondashuvdan foydalanish tavsiya etiladi, chunki u Compose uchun yaxshiroq optimallashtirilgan.

Samaradorlik va keshlash

Fayllardan shriftlarni yuklash potentsial ravishda qimmat operatsiyadir. Har bir Typeface.createFromAsset yoki Typeface.createFromFile chaqiruvi faylni diskdan o‘qiydi, uni tahlil qiladi va Typeface ob’ektini yaratadi. 1-2 MB hajmdagi shriftlar uchun bu sovuq ishga tushirishda 10-50 ms vaqt oladi. Maxsus shriftlari bo‘lgan ilovalar uchun Typeface keshlash majburiy amaliyotdir.

Android SDK createFromAsset yoki createFromFile orqali yaratilgan shriftlarni keshlab qo‘ymaydi. Zygote jarayonida oldindan yuklangan tizim shriftlaridan farqli o‘laroq, maxsus shriftlar har bir murojaatda yuklanadi. Shrift identifikatoridan kalit sifatida foydalanib LruCache yoki ConcurrentHashMap dan foydalanish tavsiya etiladi. Kesh hajmi — ilovaning odatiy shrift to‘plamini qoplaydigan 10-20 namuna.

Font Family (API 26+) orqali optimallashtirish

Android 8.0+ XML Font Family orqali shrift yuklashni optimallashtiradi. XML tartibida android:fontFamily="@font/my_family" ko‘rsatilganda, Android shriftni dangasa yuklaydi — faqat komponent ko‘rinadigan bo‘lganda. Tizim shuningdek ResourcesCompat.getFont() orqali yuklangan shriftlarni jarayonning global keshlarida saqlaydi. Bu resurs usulini eng samarali qiladi.

RecyclerView da Typeface

RecyclerView adapterlarida Typeface dan foydalanishda shriftni onBindViewHolder metodida yuklamaslik muhimdir. Yuklashni adapter yaratilganda bir marta chaqiring yoki oldindan yuklangan Typeface bilan ViewHolder dan foydalaning. Agar ro‘yxatning har bir elementi noyob shriftni talab qilsa, WeakHashMap orqali keshni joriy eting va xotirani tejash uchun ko‘rinadigan pozitsiyalardan tashqariga aylantirishda uni tozalang.

Tez-tez beriladigan savollar

Android da Typeface va FontFamily o‘rtasidagi farq nima?

Typeface — dasturiy foydalanish uchun aniq shrift namunasidir. FontFamily — turli ko‘rinishlar (regular, bold, italic) uchun shrift fayllari guruhini tavsiflovchi XML resursidir. Ish vaqtida FontFamily ResourcesCompat.getFont orqali Typeface ga aylantiriladi. Typeface FontFamily ni chetlab o‘tib, to‘g‘ridan-to‘g‘ri fayldan yaratilishi mumkin.

Kontekstsiz Typeface ni qanday yuklash mumkin?

Typeface.createFromFile(File) yoki Typeface.DEFAULT dan foydalaning. Bu usullar kontekstni talab qilmaydi, chunki ular fayl tizimi yoki ichki konstantalar bilan ishlaydi. Assets yoki resurslardan yuklash uchun kontekst majburiydir, chunki AssetManager va ilova resurslariga kirish kerak.

Typeface ni WebView da ishlatish mumkinmi?

Yo‘q, WebView shriftlarni ko‘rsatish uchun CSS font-family xususiyatidan foydalanadi. WebView da maxsus shriftni ishlatish uchun shrift faylini assets ga joylashtiring va CSS da @font-face orqali ko‘rsating. Android SDK Typeface faqat native UI komponentlari (TextView va vorislari) bilan ishlaydi.

Typeface variativ shriftlarni qo‘llab-quvvatlaydimi?

Ha, Android 10 (API 29) dan boshlab. Variativ shriftlar ResourcesCompat.getFont yoki Typeface.createFromFile orqali yuklanadi. O‘zgaruvchanlik o‘qlarini (weight, width) sozlash uchun Compose da FontStyle yoki XML atributlari ishlatiladi. Dasturiy ravishda o‘qni faqat past darajadagi Skia API orqali o‘zgartirish mumkin.

Nega setTypeface ba‘zi shriftlar uchun ishlamaydi?

Eng ko‘p uchraydigan sabablar: shrift fayli loyihada yo‘q, noto‘g‘ri fayl nomi ko‘rsatilgan, shrift buzilgan yoki faylda mavjud bo‘lmagan sintezlangan uslub ishlatilmoqda. Faylning res/font yoki assets ga qo‘shilganligini va resurs usulida uning nomi kengaytmasiz ko‘rsatilganligini tekshiring.

Xulosa

  • Typeface — oila va ko‘rinish uslubi bilan shriftni ifodalovchi Android sinfi
  • Ichki konstantalar: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF
  • Yuklash ResourcesCompat.getFont, Typeface.createFromAsset, createFromFile orqali
  • XML Font Family (API 26+) — maxsus shriftlar uchun afzal usul
  • TypefaceSpan SpannableString orqali shriftni matnning bir qismiga qo‘llash imkonini beradi
  • Typeface keshlash majburiydir — HashMap yoki LruCache dan foydalaning
  • Compose da Android SDK Typeface o‘rniga FontFamily va FontWeight dan foydalaning

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing