Typeface — apa itu, jenis font dan bekerja di Android

Penulis: IT Sectr Diterbitkan: 2026-07-23 Waktu membaca: 9 mnt

Typeface — adalah kelas Android SDK dari paket android.graphics yang mewakili bentuk huruf dan digunakan untuk kustomisasi teks di TextView dan komponen UI lainnya. Typeface menentukan keluarga font, beratnya (normal, bold) dan gayanya (normal, italic). Menurut Google Developers, Typeface mendukung pemuatan dari file TTF, OTF, font XML, dan sumber daya sistem. Ini adalah kelas sentral untuk mengelola tipografi di aplikasi Android.

Poin Utama

  • Typeface — kelas Android untuk representasi bentuk huruf dengan keluarga dan gaya
  • Gaya bawaan: Typeface.NORMAL, BOLD, ITALIC, BOLD_ITALIC
  • Font dimuat dari sumber XML, file TTF/OTF, assets atau folder sistem
  • Android 8.0+ mendukung pemuatan font melalui sumber XML di res/font
  • Typeface.create() membuat instance dengan keluarga dan gaya yang ditentukan

Apa itu Typeface?

Typeface — adalah kelas Android yang merangkum informasi tentang font: keluarganya (Roboto, Arial, Serif) dan pengubah gaya (ketebalan, miring). Tidak seperti UIFont di iOS, Typeface tidak berisi informasi tentang ukuran — ukuran teks diatur secara terpisah melalui properti textSize di TextView atau TextStyle di Spannable. Typeface hanya bertanggung jawab atas bentuk dan garnitur font.

Kelas ini tersedia di semua level API. Hingga Android 4.4, Typeface hanya mendukung serangkaian font sistem terbatas: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF. Mulai Android 8.0 (API 26) dukungan untuk memuat font kustom melalui sumber XML ditambahkan, dan Android 10 menambahkan dukungan untuk font variabel.

Konstanta Typeface bawaan

Android menyediakan beberapa instance Typeface bawaan: Typeface.DEFAULT — font sistem Roboto (Material) atau Noto (AOSP), DEFAULT_BOLD — versi tebal, MONOSPACE — font monospace untuk kode, SERIF — font bergaris (Noto Serif), SANS_SERIF — font tanpa garis (Noto Sans). Konstanta ini tersedia tanpa konteks dan tidak memerlukan izin baca file.

Typeface di sistem

Sistem Android menggunakan Typeface untuk merender semua teks, termasuk UI sistem, judul, label, dan notifikasi. Setiap aplikasi dapat menimpa font default melalui tema (android:fontFamily) atau secara terprogram melalui setTypeface(). Typeface diterapkan ke semua komponen yang mewarisi dari TextView: tombol, EditText, dan tampilan kustom.

Membuat Typeface dari sumber

Android 8.0+ memungkinkan menambahkan font ke res/font dan menggunakannya melalui sumber XML. File font (TTF atau OTF) ditempatkan di res/font, setelah itu referensi R.font.font_name dibuat. Typeface dimuat melalui ResourcesCompat.getFont(context, R.font.font_name). Metode ini lebih disukai karena font dikompilasi ke dalam APK dan mendukung sistem tata letak ProGuard.

Metode sumber juga mendukung keluarga font (font family) melalui file XML di res/font: beberapa file dapat ditentukan untuk tampilan berbeda (regular, bold, italic) dan sistem secara otomatis memilih file yang tepat saat pemanggilan setTypeface. Ini menyederhanakan tipografi — cukup atur fontFamily di tema, dan Android akan memilih file yang tepat.

Membuat Typeface.create

Metode Typeface.create(Typeface family, int style) membuat instance font dengan keluarga dan gaya yang ditentukan. Jika keluarga sudah memiliki gaya yang diminta, instance yang ada dikembalikan. Jika gaya tidak ada, Android mensintesisnya — menerapkan pseudo-tebal atau miring buatan ke font dasar.

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-tebal yang disintesis mungkin terlihat berkualitas rendah pada font tipis. Untuk hasil yang lebih baik, gunakan file font dengan tampilan bold asli. Typeface.create() dengan gaya yang tidak ada tidak melempar pengecualian, tetapi mengembalikan varian terdekat yang tersedia.

Typeface dari file dan assets

Untuk memuat Typeface dari assets gunakan Typeface.createFromAsset(assetManager, path). Font ditempatkan di direktori src/main/assets/fonts/, dan jalur ditentukan relatif terhadap assets. Metode ini berfungsi di semua versi Android, tetapi tidak mendukung keluarga font dan memerlukan penentuan file spesifik untuk setiap tampilan.

Metode Typeface.createFromFile(File) memuat font dari file sembarang di sistem file. Ini berguna untuk font yang diunduh dari jaringan atau disalin ke penyimpanan internal aplikasi. createFromFile juga tidak memerlukan konteks, yang nyaman untuk tugas latar belakang, tetapi file harus dapat dibaca.

Memuat dari assets dengan caching

Pemuatan berulang Typeface dari assets melalui createFromAsset dapat menyebabkan pembuatan objek duplikat. Setiap panggilan createFromAsset memuat file lagi. Disarankan untuk mengimplementasikan cache Typeface melalui HashMap, di mana kuncinya adalah jalur file dan nilainya adalah instance yang dimuat. Ini sangat penting untuk daftar dengan berbagai jenis font.

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

Cache di memori memastikan bahwa satu font dimuat hanya sekali per sesi aplikasi. Saat perubahan konfigurasi (rotasi layar), cache dipertahankan karena berada di objek companion. Untuk membersihkan cache saat kekurangan memori, gunakan WeakHashMap atau dengarkan onTrimMemory.

Menerapkan Typeface ke TextView

Typeface diterapkan ke TextView melalui metode setTypeface(Typeface tf) atau setTypeface(Typeface tf, int style). Varian kedua memungkinkan mengubah gaya (bold/italic) relatif terhadap font saat ini. Di XML, atribut android:fontFamily digunakan dengan referensi ke font atau keluarga sistem. Untuk pengaturan terprogram, panggilan setTypeface(monospaceTypeface) akan mengganti font dengan yang ditentukan.

Typeface mempengaruhi seluruh teks TextView. Jika font berbeda diperlukan dalam satu baris, SpannableString dengan TypefaceSpan digunakan. TypefaceSpan menerima Typeface atau family dan diterapkan ke rentang karakter. Ini adalah satu-satunya cara mencampur font di dalam satu TextView tanpa komponen bersarang.

TypefaceSpan untuk bagian teks

Terapkan TypefaceSpan hanya ke bagian string. Misalnya, nilai variabel dalam teks harus ditampilkan dengan font monospace, dan sisanya dengan font sistem. SpannableString dibuat, dan pada rentang yang diinginkan diatur TypefaceSpan dengan MONOSPACE Typeface. Sisa teks tetap dengan font asli TextView.

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

Teks “variableName” akan ditampilkan dengan font monospace warna biru, dan kata “Kod:” akan tetap dengan font sistem. TypefaceSpan dapat dikombinasikan dengan span lain untuk kontrol yang tepat atas setiap bagian teks.

Font kustom melalui Typeface

Android mendukung beberapa format font: TrueType (TTF), OpenType (OTF) dan Web Open Font Format (WOFF2) mulai Android 10. TTF dan OTF adalah format utama untuk font kustom. Font XML (Font Family) bukan format terpisah, melainkan deskripsi file mana yang digunakan untuk setiap tampilan.

Untuk menggunakan font kustom melalui res/font buat file XML keluarga yang menentukan jalur ke file font untuk regular, bold, dan italic. Kemudian di tema aplikasi, atur android:fontFamily="@font/custom_family". Semua TextView yang menggunakan tema ini akan secara otomatis mendapatkan tampilan yang benar untuk setiap gaya.

Memuat font yang diunduh

Jika font diunduh dari jaringan, simpan di filesDir atau cacheDir dan muat melalui Typeface.createFromFile. Setelah dimuat, perbarui Typeface di TextView. Untuk pemuatan asinkron, gunakan coroutine atau DownloadManager, dan setelah selesai, kirim ke thread UI melalui Handler. Ini adalah skenario tipikal untuk aplikasi dengan tipografi kustom yang dimuat sesuai permintaan.

kotlin
// Simpan file font ke penyimpanan internal
val fontFile = File(context.cacheDir, "downloaded-font.otf")
fontFile.outputStream().use { output ->
    // aliran input dari jaringan
    inputStream.copyTo(output)
}
// Buat Typeface dari file
val downloadedTypeface = Typeface.createFromFile(fontFile)
textView.typeface = downloadedTypeface

Sebelum memuat, periksa ketersediaan file: jika file rusak atau tidak valid, Typeface.createFromFile akan melempar RuntimeException. Disarankan untuk membungkus panggilan dalam try-catch dan jika terjadi kesalahan, pertahankan font sistem default.

Typeface di Jetpack Compose

Di Jetpack Compose, Typeface Android SDK tidak digunakan secara langsung. Sebagai gantinya, Compose menyediakan FontFamily dan FontWeight untuk tipografi. FontFamily dimuat melalui Font.Resource dan Font.File. Sistem tipografi Compose diatur melalui MaterialTheme.typography, di mana setiap gaya (h1, body1, button) dapat diberikan FontFamily kustom.

Untuk memuat font dari resources, Compose menggunakan Font(R.font.font_name, weight, style). Font dari assets dimuat melalui Font(assetPath = "fonts/custom.otf", weight, style). Setelah font ditentukan, font tersebut diteruskan ke Typography, kemudian diterapkan melalui MaterialTheme.typography.bodyLarge dan gaya serupa.

Konversi Typeface ke font Compose

Jika ada Typeface siap pakai yang dibuat melalui Android SDK, dapat digunakan di Compose melalui TypefaceAdapter atau dengan membuat FontFamily berdasarkan Typeface. Untuk ini, dapatkan Typeface dari Typeface.create dan teruskan ke FontFamily.Custom(listOf(Font(typeface))). Namun, disarankan menggunakan pendekatan native dengan Font.Resource karena lebih optimal untuk Compose.

Kinerja dan caching

Memuat font dari file adalah operasi yang berpotensi mahal. Setiap panggilan Typeface.createFromAsset atau Typeface.createFromFile membaca file dari disk, memparse-nya, dan membuat objek Typeface. Untuk font berukuran 1-2 MB, ini memakan waktu 10-50 ms pada startup dingin. Caching Typeface adalah praktik wajib untuk aplikasi dengan font kustom.

Android SDK tidak me-cache font yang dibuat melalui createFromAsset atau createFromFile. Tidak seperti font sistem yang dimuat sebelumnya dalam proses Zygote, font kustom dimuat setiap kali diakses. Disarankan menggunakan LruCache atau ConcurrentHashMap dengan kunci dari pengidentifikasi font. Ukuran cache — 10-20 instance, yang mencakup set font tipikal aplikasi.

Optimasi melalui Font Family (API 26+)

Android 8.0+ mengoptimalkan pemuatan font melalui XML Font Family. Saat menentukan android:fontFamily="@font/my_family" di tata letak XML, Android memuat font secara malas — hanya ketika komponen menjadi terlihat. Sistem juga me-cache font yang dimuat melalui ResourcesCompat.getFont() di cache global proses. Ini membuat metode sumber paling berkinerja.

Typeface di RecyclerView

Saat menggunakan Typeface di adapter RecyclerView penting untuk tidak memuat font di metode onBindViewHolder. Panggil pemuatan sekali saat pembuatan adapter atau gunakan ViewHolder dengan Typeface yang sudah dimuat sebelumnya. Jika setiap item daftar memerlukan font unik, implementasikan cache melalui WeakHashMap dan bersihkan saat scroll melewati posisi yang terlihat untuk menghemat memori.

Pertanyaan Umum

Apa perbedaan Typeface dan FontFamily di Android?

Typeface — adalah instance font konkret untuk penggunaan terprogram. FontFamily — sumber XML yang mendeskripsikan grup file font untuk tampilan berbeda (regular, bold, italic). Saat runtime, FontFamily dikonversi ke Typeface melalui ResourcesCompat.getFont. Typeface dapat dibuat langsung dari file, melewati FontFamily.

Bagaimana cara memuat Typeface tanpa konteks?

Gunakan Typeface.createFromFile(File) atau Typeface.DEFAULT. Metode ini tidak memerlukan konteks karena bekerja dengan sistem file atau konstanta bawaan. Untuk memuat dari assets atau sumber, konteks wajib diperlukan karena akses ke AssetManager dan sumber daya aplikasi.

Bisakah Typeface digunakan di WebView?

Tidak, WebView menggunakan properti CSS font-family untuk menentukan font. Untuk menggunakan font kustom di WebView, tempatkan file font di assets dan tentukan melalui @font-face di CSS. Typeface Android SDK hanya bekerja dengan komponen UI native (TextView dan turunannya).

Apakah Typeface mendukung font variabel?

Ya, mulai Android 10 (API 29). Font variabel dimuat melalui ResourcesCompat.getFont atau Typeface.createFromFile. Untuk menyesuaikan sumbu variabilitas (weight, width) gunakan FontStyle di Compose atau atribut XML. Mengubah sumbu secara terprogram hanya dimungkinkan melalui API tingkat rendah Skia.

Mengapa setTypeface tidak berfungsi untuk beberapa font?

Penyebab paling umum: file font tidak ada di proyek, nama file salah, font rusak, atau menggunakan gaya sintesis yang tidak ada di file. Periksa apakah file telah ditambahkan ke res/font atau assets dan apakah namanya ditentukan tanpa ekstensi dalam kasus metode sumber.

Ringkasan

  • Typeface — kelas Android untuk representasi font dengan keluarga dan gaya bentuk
  • Konstanta bawaan: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF
  • Pemuatan melalui ResourcesCompat.getFont, Typeface.createFromAsset, createFromFile
  • XML Font Family (API 26+) — metode pilihan untuk font kustom
  • TypefaceSpan memungkinkan menerapkan font ke bagian teks melalui SpannableString
  • Caching Typeface wajib — gunakan HashMap atau LruCache
  • Di Compose gunakan FontFamily dan FontWeight alih-alih Typeface Android SDK

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga