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 — 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
// 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.
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.
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.
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.
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.
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
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.
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.
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).
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.
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
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.
Baca juga