Typeface — Android SDK का एक वर्ग है जो android.graphics पैकेज से आता है और फ़ॉन्ट के डिजाइन को दर्शाता है, जिसका उपयोग TextView और अन्य UI घटकों में टेक्स्ट अनुकूलन के लिए किया जाता है। Typeface फ़ॉन्ट परिवारों, उसके वजन (normal, bold) और शैली (normal, italic) को परिभाषित करता है। Google Developers के अनुसार, Typeface TTF, OTF फ़ाइलों, XML फ़ॉन्ट और सिस्टम संसाधनों से लोडिंग का समर्थन करता है। यह Android एप्लिकेशनों में टाइपोग्राफी प्रबंधन के लिए केंद्रीय वर्ग है।
मुख्य बातें
Typeface — एक Android वर्ग है जो फ़ॉन्ट की जानकारी को समेटता है: उसका परिवार (Roboto, Arial, Serif) और शैली संशोधक (bold, italic). iOS में UIFont के विपरीत, Typeface में आकार की जानकारी नहीं होती — टेक्स्ट का आकार TextView में textSize प्रॉपर्टी या Spannable में TextStyle के माध्यम से अलग से सेट किया जाता है। Typeface केवल फ़ॉन्ट के डिजाइन और परिवार के लिए उत्तरदायी है।
यह वर्ग सभी API स्तरों पर उपलब्ध है। Android 4.4 से पहले, Typeface केवल सीमित सिस्टम फ़ॉन्ट का समर्थन करता था: DEFAULT, DEFAULT_BOLD, MONOSPACE, SERIF, SANS_SERIF। Android 8.0 (API 26) से शुरू करते हुए, XML संसाधनों के माध्यम से कस्टम फ़ॉन्ट लोडिंग का समर्थन जोड़ा गया, और Android 10 ने वेरिएबल फ़ॉन्ट का समर्थन जोड़ा।
Android कई निर्मित Typeface उदाहरण प्रदान करता है: Typeface.DEFAULT — सिस्टम फ़ॉन्ट Roboto (Material) या Noto (AOSP), DEFAULT_BOLD — बोल्ड संस्करण, MONOSPACE — कोड के लिए मोनोस्पेस फ़ॉन्ट, SERIF — सेरिफ़ फ़ॉन्ट (Noto Serif), SANS_SERIF — बिना सेरिफ़ के (Noto Sans)। ये स्थिरांक बिना कंटेक्स्ट के उपलब्ध हैं और फ़ाइल पढ़ने की अनुमति की आवश्यकता नहीं है।
Android सिस्टम सभी टेक्स्ट को रेंडर करने के लिए Typeface का उपयोग करता है, जिसमें सिस्टम UI, शीर्षक, कैप्शन और नोटिफिकेशन शामिल हैं। प्रत्येक एप्लिकेशन थीम (android:fontFamily) या प्रोग्रामात्मक रूप से setTypeface() के माध्यम से डिफ़ॉल्ट फ़ॉन्ट को ओवरराइड कर सकती है। Typeface TextView से प्राप्त सभी घटकों पर लागू होता है: बटन, EditText और कस्टम व्यूज़।
Android 8.0+ res/font में फ़ॉन्ट जोड़ने और XML संसाधनों के माध्यम से उपयोग करने की अनुमति देता है। फ़ॉन्ट फ़ाइल (TTF या OTF) को res/font में रखा जाता है, जिसके बाद R.font.font_name संदर्भ बनाया जाता है। Typeface को ResourcesCompat.getFont(context, R.font.font_name) के माध्यम से लोड किया जाता है। यह तरीका बेहतर है क्योंकि फ़ॉन्ट APK में संकलित होता है और ProGuard निर्माण प्रणालियों का समर्थन करता है।
संसाधन दृष्टिकोण res/font में XML फ़ाइल के माध्यम से फ़ॉन्ट परिवारों का भी समर्थन करता है: आप विभिन्न डिजाइन (regular, bold, italic) के लिए अनेक फ़ाइलें निर्दिष्ट कर सकते हैं और setTypeface कॉल करने पर सिस्टम स्वचालित रूप से उपयुक्त फ़ाइल का चयन करेगा। यह टाइपोग्राफी को सरल बनाता है — थीम में fontFamily सेट करें, और Android स्वचालित रूप से सही फ़ाइल का चयन करेगा।
Typeface.create(Typeface family, int style) विधि निर्दिष्ट परिवार और शैली के साथ एक फ़ॉन्ट उदाहरण बनाती है। यदि परिवार में पहले से ही अनुरोधित शैली है, तो मौजूदा उदाहरण लौटाया जाता है। यदि शैली गैरमौजूद है, तो Android इसे संश्लेषित करता है — मूल फ़ॉन्ट पर नकली बोल्ड या कृत्रिम इटालिक लागू करता है।
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
संश्लेषित नकली बोल्ड पतले फ़ॉन्ट पर घटिया दिख सकता है। बेहतर परिणाम के लिए, वास्तविक bold डिजाइन वाली फ़ॉन्ट फ़ाइल का उपयोग करें। Typeface.create() गैरमौजूद शैली के साथ कोई अपवाद नहीं फेंकता, बल्कि निकटतम उपलब्ध विकल्प लौटाता है।
assets से Typeface लोड करने के लिए Typeface.createFromAsset(assetManager, path) का उपयोग करें। फ़ॉन्ट src/main/assets/fonts/ निर्देशिका में रखा जाता है, और पथ assets के सापेक्ष निर्दिष्ट किया जाता है। यह तरीका Android के सभी संस्करणों पर काम करता है, लेकिन फ़ॉन्ट परिवारों का समर्थन नहीं करता और प्रत्येक डिजाइन के लिए एक विशिष्ट फ़ाइल निर्दिष्ट करने की आवश्यकता होती है।
Typeface.createFromFile(File) विधि फ़ाइल सिस्टम पर किसी भी फ़ाइल से फ़ॉन्ट लोड करती है। यह नेटवर्क से डाउनलोड किए गए या एप्लिकेशन के आंतरिक स्टोरेज में कपी किए गए फ़ॉन्ट के लिए उपयोगी है। createFromFile को भी कंटेक्स्ट की आवश्यकता नहीं है, जो बैकग्राउंड कार्यों के लिए सुविधाजनक है, लेकिन फ़ाइल पढ़ने योग्य होनी चाहिए।
createFromAsset के माध्यम से Typeface को बार-बार लोड करना डप्लिकेट ऑब्जेक्ट निर्माण का कारण बन सकता है। प्रत्येक createFromAsset कॉल फ़ाइल को फिर से लोड करता है। HashMap का उपयोग करके Typeface कैश लागू करने की अनुशंसा की जाती है, जहाँ की फ़ाइल पथ है और मान लोड किया गया उदाहरण है। यह विशेष रूप से विभिन्न फ़ॉन्ट प्रकारों की सूचियों के लिए महत्वपूर्ण है।
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")
मेमरी में कैश यह सुनिश्चित करता है कि एक फ़ॉन्ट एप्लिकेशन सत्र में केवल एक बार लोड होता है। कॉन्फ़िगरेशन परिवर्तन (स्क्रीन रोटेशन) पर, कैश बना रहता है क्योंकि यह एक companion ऑब्जेक्ट में होता है। कम मेमरी पर कैश साफ करने के लिए, WeakHashMap का उपयोग करें या onTrimMemory को सुनें।
Typeface को TextView में setTypeface(Typeface tf) या setTypeface(Typeface tf, int style) विधि के माध्यम से लागू किया जाता है। दूसरा विकल्प वर्तमान फ़ॉन्ट के सापेक्ष शैली (bold/italic) को बदलने की अनुमति देता है। XML में, android:fontFamily एट्रिब्यूट का उपयोग फ़ॉन्ट या सिस्टम परिवार के संदर्भ के साथ किया जाता है। प्रोग्रामात्मक सेटप के लिए, setTypeface(monospaceTypeface) कॉल करने से फ़ॉन्ट बदल जाता है।
Typeface पूरे TextView टेक्स्ट को प्रभावित करता है। यदि एक लाइन में अलग-अलग फ़ॉन्ट की आवश्यकता है, तो TypefaceSpan के साथ SpannableString का उपयोग करें। TypefaceSpan Typeface या परिवार को स्वीकार करता है और एक वर्ण सीमा पर लागू होता है। बिना नेस्टेड घटकों के एक TextView के अंदर फ़ॉन्ट मिलाने का यह एकमात्र तरीका है।
TypefaceSpan को स्ट्रिंग के केवल एक भाग पर लागू करें। उदाहरण के लिए, टेक्स्ट में एक चर मान मोनोस्पेस होना चाहिए जबकि बाकी टेक्स्ट सिस्टम फ़ॉन्ट में रहे। एक SpannableString बनाएं और MONOSPACE Typeface के साथ TypefaceSpan को आवश्यक सीमा पर सेट करें। बाकी का टेक्स्ट मूल 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
टेक्स्ट “variableName” नीले रंग में मोनोस्पेस फ़ॉन्ट में दिखाई देगा, जबकि शब्द “Code:” सिस्टम फ़ॉन्ट में रहेगा। TypefaceSpan को टेक्स्ट के प्रत्येक खंड पर सटीक नियंत्रण के लिए किसी भी अन्य स्पैन के साथ जोड़ा जा सकता है।
Android कई फ़ॉन्ट फ़ॉर्मेटों का समर्थन करता है: TrueType (TTF), OpenType (OTF) और Web Open Font Format (WOFF2) Android 10 से शुरू होता है। TTF और OTF कस्टम फ़ॉन्ट के लिए मुख्य फ़ॉर्मेट हैं। XML फ़ॉन्ट (Font Family) कोई अलग फ़ॉर्मेट नहीं हैं, बल्कि यह बताने का कार्य करते हैं कि प्रत्येक डिजाइन के लिए कौन सी फ़ाइल का उपयोग करना है।
res/font के माध्यम से कस्टम फ़ॉन्ट का उपयोग करने के लिए, एक परिवार XML फ़ाइल बनाएं जो regular, bold और italic के लिए फ़ॉन्ट फ़ाइलों के पथ निर्दिष्ट करती है। फिर एप्लिकेशन थीम में, android:fontFamily="@font/custom_family" निर्दिष्ट करें। इस थीम का उपयोग करने वाले सभी TextView उदाहरण स्वचालित रूप से प्रत्येक शैली के लिए सही डिजाइन प्राप्त करेंगे।
यदि कोई फ़ॉन्ट नेटवर्क से डाउनलोड किया जाता है, तो उसे filesDir या cacheDir में सेव करें और Typeface.createFromFile के माध्यम से लोड करें। लोड करने के बाद, TextView में Typeface अपडेट करें। असांक्रोनस लोडिंग के लिए, coroutine या DownloadManager का उपयोग करें, और पूरा होने पर, Handler के माध्यम से UI थ्रेड में पोस्ट करें। यह मांग पर लोड की जाने वाली कस्टम टाइपोग्राफी वाले एप्लिकेशनों का एक विशिष्ट परिदृश्य है।
// 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
लोड करने से पहले, फ़ाइल की उपलब्धता जाँचें: यदि फ़ाइल दूषित या अवैध है, तो Typeface.createFromFile RuntimeException फेंकता है। कॉल को try-catch में लपेटने और त्रुटि की स्थिति में डिफ़ॉल्ट सिस्टम फ़ॉन्ट पर लौटने की अनुशंसा की जाती है।
Jetpack Compose में, Android SDK का Typeface सीधे उपयोग नहीं किया जाता। इसके बजाय, Compose टाइपोग्राफी के लिए FontFamily और FontWeight प्रदान करता है। FontFamily को Font.Resource और Font.File के माध्यम से लोड किया जाता है। Compose का टाइपोग्राफी सिस्टम MaterialTheme.typography के माध्यम से परिभाषित होता है, जहाँ प्रत्येक शैली (h1, body1, button) को एक कस्टम FontFamily दिया जा सकता है।
संसाधनों से फ़ॉन्ट लोड करने के लिए, Compose Font(R.font.font_name, weight, style) का उपयोग करता है। assets से एक फ़ॉन्ट Font(assetPath = "fonts/custom.otf", weight, style) के माध्यम से लोड किया जाता है। फ़ॉन्ट को परिभाषित करने के बाद, उसे Typography में भेजा जाता है, और फिर MaterialTheme.typography.bodyLarge और समान शैलियों के माध्यम से लागू किया जाता है।
यदि आपके पास Android SDK के माध्यम से बनाया गया एक मौजूदा Typeface है, तो इसे Compose में TypefaceAdapter के माध्यम से या Typeface पर आधारित FontFamily बनाकर उपयोग किया जा सकता है। Typeface.create से Typeface प्राप्त करें और FontFamily.Custom(listOf(Font(typeface))) में भेजें। हालांकि, Font.Resource के साथ देसी दृष्टिकोण की सिफारिश की जाती है क्योंकि यह Compose के लिए बेहतर ऑप्टिमाइज़्ड है।
फ़ाइलों से फ़ॉन्ट लोड करना एक संभावित महंगा ऑपरेशन है। Typeface.createFromAsset या Typeface.createFromFile पर प्रत्येक कॉल फ़ाइल को डिस्क से पढ़ता है, उसे पार्स करता है और एक Typeface ऑब्जेक्ट बनाता है। 1-2 MB के फ़ॉन्ट के लिए, कोल्ड स्टार्ट पर इसमें 10-50 मिलीसेकंड लगते हैं। कस्टम फ़ॉन्ट वाले एप्लिकेशनों के लिए Typeface कैशिंग अनिवार्य अभ्यास है।
Android SDK createFromAsset या createFromFile के माध्यम से बनाए गए फ़ॉन्ट को कैश नहीं करता है। सिस्टम फ़ॉन्ट के विपरीत, जो Zygote प्रक्रिया में प्रीलोड होते हैं, कस्टम फ़ॉन्ट हर बार एक्सेस पर लोड होते हैं। LruCache या फ़ॉन्ट पहचानकर्ता के साथ ConcurrentHashMap का उपयोग करने की अनुशंसा की जाती है। 10-20 उदाहरणों का कैश आकार एक विशिष्ट एप्लिकेशन फ़ॉन्ट सेट को कवर करता है।
Android 8.0+ XML Font Family के माध्यम से फ़ॉन्ट लोडिंग को ऑप्टिमाइज़ करता है। XML लेआउट में android:fontFamily="@font/my_family" निर्दिष्ट करने पर, Android फ़ॉन्ट को आलस तरीके से लोड करता है — केवल जब घटक दिखाई देने लगता है। सिस्टम ResourcesCompat.getFont() के माध्यम से लोड किए गए फ़ॉन्ट को वैश्विक प्रक्रिया कैश में संग्रहीत करता है। यह संसाधन दृष्टिकोण को सबसे अधिक प्रदर्शनशील बनाता है।
RecyclerView एडाप्टर में Typeface का उपयोग करते समय, onBindViewHolder में फ़ॉन्ट लोड न करना महत्वपूर्ण है। एडाप्टर बनाते समय एक बार लोड करें या प्रीलोड किए गए Typeface के साथ ViewHolder का उपयोग करें। यदि प्रत्येक सूची आइटम को एक अनोखा फ़ॉन्ट चाहिए, तो WeakHashMap का उपयोग करके कैश लागू करें और मेमरी बचाने के लिए दिखने वाली स्थितियों के पार स्क्रॉल करने पर इसे साफ करें।
अक्सर पूछे जाने वाले प्रश्न
Typeface — प्रोग्रामात्मक उपयोग के लिए एक विशिष्ट फ़ॉन्ट उदाहरण है। FontFamily — एक XML संसाधन है जो विभिन्न डिजाइन (regular, bold, italic) के लिए फ़ॉन्ट फ़ाइलों के समूह का वर्णन करता है। रनटाइम पर, FontFamily को ResourcesCompat.getFont के माध्यम से Typeface में परिवर्तित किया जाता है। Typeface को FontFamily को दरकिनार करते हुए सीधे फ़ाइल से बनाया जा सकता है।
Typeface.createFromFile(File) या Typeface.DEFAULT का उपयोग करें। ये विधियाँ कंटेक्स्ट की आवश्यकता नहीं होती क्योंकि ये फ़ाइल सिस्टम या निर्मित स्थिरांकों के साथ काम करती हैं। assets या संसाधनों से लोड करने के लिए, कंटेक्स्ट आवश्यक है क्योंकि AssetManager और एप्लिकेशन संसाधनों तक पहुँच की आवश्यकता होती है।
नहीं, WebView फ़ॉन्ट निर्दिष्ट करने के लिए CSS font-family प्रॉपर्टी का उपयोग करता है। WebView में कस्टम फ़ॉन्ट का उपयोग करने के लिए, फ़ॉन्ट फ़ाइल को assets में रखें और CSS में @font-face के माध्यम से निर्दिष्ट करें। Typeface Android SDK केवल देसी UI घटकों (TextView और उसके वंशज) के साथ काम करता है।
हाँ, Android 10 (API 29) से शुरू होता है। वेरिएबल फ़ॉन्ट ResourcesCompat.getFont या Typeface.createFromFile के माध्यम से लोड किए जाते हैं। भिन्नता अक्षों (weight, width) को कॉन्फ़िगर करने के लिए, Compose में FontStyle या XML एट्रिब्यूट का उपयोग करें। अक्ष में प्रोग्रामात्मक परिवर्तन केवल Skia के निम्न-स्तरीय API के माध्यम से किया जा सकता है।
सबसे सामान्य कारण: परियोजना से फ़ॉन्ट फ़ाइल गैरमौजूद है, फ़ाइल का नाम गलत है, फ़ॉन्ट दूषित है, या फ़ाइल में मौजूद नहीं है जो संश्लेषित शैली का उपयोग किया गया है। सत्यापित करें कि फ़ाइल res/font या assets में जोड़ी गई है, और संसाधन दृष्टिकोण के मामले में उसका नाम बिना एक्सटेंशन के निर्दिष्ट किया गया है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें