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) اور Android 10 سے Web Open Font Format (WOFF2)۔ 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں