এই পৃষ্ঠায় আপনার কম্পোজ অ্যাপে কীভাবে ফন্ট সেট করতে হয় তা বর্ণনা করা হয়েছে।
ফন্ট সেট করুন
Text একটি fontFamily প্যারামিটার রয়েছে, যা কম্পোজেবলে ব্যবহৃত ফন্ট সেট করার সুযোগ দেয়। ডিফল্টরূপে, serif, sans-serif, monospace এবং cursive ফন্ট ফ্যামিলিগুলো অন্তর্ভুক্ত থাকে।
@Composable fun DifferentFonts() { Column { Text("Hello World", fontFamily = FontFamily.Serif) Text("Hello World", fontFamily = FontFamily.SansSerif) } }

আপনি res/font ফোল্ডারে সংজ্ঞায়িত কাস্টম ফন্ট এবং টাইপফেস নিয়ে কাজ করার জন্য fontFamily অ্যাট্রিবিউটটি ব্যবহার করতে পারেন:

এই উদাহরণটি দেখায় কিভাবে আপনি ঐ ফন্ট ফাইলগুলির উপর ভিত্তি করে এবং Font ফাংশনটি ব্যবহার করে একটি fontFamily সংজ্ঞায়িত করবেন:
val firaSansFamily = FontFamily( Font(R.font.firasans_light, FontWeight.Light), Font(R.font.firasans_regular, FontWeight.Normal), Font(R.font.firasans_italic, FontWeight.Normal, FontStyle.Italic), Font(R.font.firasans_medium, FontWeight.Medium), Font(R.font.firasans_bold, FontWeight.Bold) )
আপনি এই fontFamily আপনার Text কম্পোজেবলে পাস করতে পারেন। যেহেতু একটি fontFamily বিভিন্ন ওয়েট থাকতে পারে, তাই আপনি আপনার টেক্সটের জন্য সঠিক ওয়েট নির্বাচন করতে ম্যানুয়ালি fontWeight সেট করতে পারেন:
Column { Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Light) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Normal) Text( text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Normal, fontStyle = FontStyle.Italic ) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Medium) Text(text = "text", fontFamily = firaSansFamily, fontWeight = FontWeight.Bold) }

আপনার পুরো অ্যাপে টাইপোগ্রাফি কীভাবে সেট করতে হয় তা জানতে, Compose-এর Custom design systems দেখুন।
ডাউনলোডযোগ্য ফন্ট
Compose 1.2.0 থেকে, আপনি আপনার Compose অ্যাপে ডাউনলোডযোগ্য ফন্ট এপিআই (API) ব্যবহার করে অ্যাসিঙ্ক্রোনাসভাবে গুগল ফন্ট ডাউনলোড করতে এবং আপনার অ্যাপে সেগুলো ব্যবহার করতে পারবেন।
কাস্টম প্রোভাইডারদের দেওয়া ডাউনলোডযোগ্য ফন্টের জন্য সমর্থন বর্তমানে উপলব্ধ নেই।
ডাউনলোডযোগ্য ফন্ট প্রোগ্রাম্যাটিকভাবে ব্যবহার করুন
আপনার অ্যাপের ভেতর থেকে প্রোগ্রাম্যাটিকভাবে একটি ফন্ট ডাউনলোড করতে, এই ধাপগুলো অনুসরণ করুন:
- নির্ভরতা যোগ করুন:
গ্রুভি
dependencies { ... implementation "androidx.compose.ui:ui-text-google-fonts:1.10.5" }
কোটলিন
dependencies { ... implementation("androidx.compose.ui:ui-text-google-fonts:1.10.5") }
- গুগল ফন্টের ক্রেডেনশিয়াল ব্যবহার করে
GoogleFont.Providerচালু করুন: প্রোভাইডার যে প্যারামিটারগুলো গ্রহণ করে তা হলো:val provider = GoogleFont.Provider( providerAuthority = "com.google.android.gms.fonts", providerPackage = "com.google.android.gms", certificates = R.array.com_google_android_gms_fonts_certs )
- গুগল ফন্টসের ফন্ট সরবরাহকারী কর্তৃপক্ষ।
- প্রদানকারীর পরিচয় যাচাই করার জন্য ফন্ট প্রদানকারী প্যাকেজ।
- প্রোভাইডারের পরিচয় যাচাই করার জন্য সার্টিফিকেটগুলোর হ্যাশ সেটের একটি তালিকা। আপনি Jetchat স্যাম্পল অ্যাপের
font_certs.xmlফাইলে Google Fonts প্রোভাইডারের জন্য প্রয়োজনীয় হ্যাশগুলো খুঁজে পাবেন।
- একটি
FontFamilyসংজ্ঞায়িত করুন : আপনি// ... import androidx.compose.ui.text.googlefonts.GoogleFont import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider) )
FontWeightএবংFontStyleব্যবহার করে যথাক্রমে আপনার ফন্টের ওজন এবং স্টাইলের মতো অন্যান্য প্যারামিটার সম্পর্কে জানতে পারেন:// ... import androidx.compose.ui.text.googlefonts.GoogleFont import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font( googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold, style = FontStyle.Italic ) )
- আপনার টেক্সট কম্পোজেবল ফাংশনে ব্যবহার করার জন্য
FontFamilyকনফিগার করুন:
Text( fontFamily = fontFamily, text = "Hello World!" )

আপনি আপনার FontFamily ব্যবহার করার জন্য টাইপোগ্রাফিও নির্ধারণ করতে পারেন:
val MyTypography = Typography( bodyMedium = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.Normal, fontSize = 12.sp/*...*/ ), bodyLarge = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.Bold, letterSpacing = 2.sp, /*...*/ ), headlineMedium = TextStyle( fontFamily = fontFamily, fontWeight = FontWeight.SemiBold/*...*/ ), /*...*/ )
এরপর, আপনার অ্যাপের থিম অনুযায়ী টাইপোগ্রাফি সেট করুন:
MyAppTheme( typography = MyTypography )/*...*/
Material3- এর সাথে Compose-এ ডাউনলোডযোগ্য ফন্ট প্রয়োগকারী একটি অ্যাপের উদাহরণের জন্য, Jetchat নমুনা অ্যাপটি দেখুন।
ফলব্যাক ফন্ট যোগ করুন
আপনার ফন্টটি সঠিকভাবে ডাউনলোড না হলে, তার জন্য আপনি একাধিক বিকল্প ব্যবস্থা নির্ধারণ করতে পারেন। উদাহরণস্বরূপ, যদি আপনার ডাউনলোডযোগ্য ফন্টটি এইভাবে সংজ্ঞায়িত করা থাকে:
// ... import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider), Font(googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold) )
আপনি উভয় ওয়েটের জন্য আপনার ফন্টের ডিফল্ট মানগুলো এইভাবে নির্ধারণ করতে পারেন:
// ... import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.googlefonts.Font // ... val fontName = GoogleFont("Lobster Two") val fontFamily = FontFamily( Font(googleFont = fontName, fontProvider = provider), Font(resId = R.font.my_font_regular), Font(googleFont = fontName, fontProvider = provider, weight = FontWeight.Bold), Font(resId = R.font.my_font_regular_bold, weight = FontWeight.Bold) )
নিশ্চিত করুন যে আপনি সঠিক ইম্পোর্টগুলো যোগ করছেন।
এইভাবে FontFamily নির্ধারণ করলে এমন একটি FontFamily তৈরি হয় যাতে দুটি চেইন থাকে, প্রতিটি ওয়েটের জন্য একটি করে। লোডিং প্রক্রিয়াটি প্রথমে অনলাইন ফন্টটি এবং তারপরে আপনার স্থানীয় R.font রিসোর্স ফোল্ডারে অবস্থিত ফন্টটি খুঁজে বের করার চেষ্টা করবে।
আপনার বাস্তবায়ন ডিবাগ করুন
ফন্টটি সঠিকভাবে ডাউনলোড হচ্ছে কিনা তা যাচাই করতে, আপনি একটি ডিবাগ কো-রুটিন হ্যান্ডলার সংজ্ঞায়িত করতে পারেন। ফন্টটি অ্যাসিঙ্ক্রোনাসভাবে লোড হতে ব্যর্থ হলে কী করতে হবে, তা আপনার হ্যান্ডলারটি নির্ধারণ করে।
প্রথমে একটি CoroutineExceptionHandler তৈরি করে শুরু করুন:
val handler = CoroutineExceptionHandler { _, throwable -> // process the Throwable Log.e(TAG, "There has been an issue: ", throwable) }
রিজলভারকে নতুন হ্যান্ডলারটি ব্যবহার করাতে, এটি createFontFamilyResolver মেথডে পাস করুন:
CompositionLocalProvider( LocalFontFamilyResolver provides createFontFamilyResolver(LocalContext.current, handler) ) { Column { Text( text = "Hello World!", style = MaterialTheme.typography.bodyMedium ) } }
প্রোভাইডারটি উপলব্ধ আছে কিনা এবং সার্টিফিকেটগুলো সঠিকভাবে কনফিগার করা আছে কিনা, তা পরীক্ষা করার জন্য আপনি প্রোভাইডার থেকে isAvailableOnDevice API-টিও ব্যবহার করতে পারেন। এটি করার জন্য, আপনি isAvailableOnDevice মেথডটি কল করতে পারেন, যা প্রোভাইডারটি ভুলভাবে কনফিগার করা থাকলে false রিটার্ন করে।
val context = LocalContext.current LaunchedEffect(Unit) { if (provider.isAvailableOnDevice(context)) { Log.d(TAG, "Success!") } }
সতর্কতা
অ্যান্ড্রয়েডে নতুন ফন্ট উপলব্ধ করতে গুগল ফন্টসের কয়েক মাস সময় লাগে। fonts.google.com- এ একটি ফন্ট যুক্ত হওয়ার পর থেকে ডাউনলোডযোগ্য ফন্ট এপিআই (View সিস্টেম বা Compose-এ) এর মাধ্যমে এটি উপলব্ধ হওয়া পর্যন্ত একটি সময়ের ব্যবধান থাকে। নতুন যুক্ত করা ফন্টগুলো আপনার অ্যাপে IllegalStateException ত্রুটির কারণে লোড হতে ব্যর্থ হতে পারে। ডেভেলপারদের অন্যান্য ধরনের ফন্ট লোডিং ত্রুটি থেকে এই ত্রুটিটি শনাক্ত করতে সাহায্য করার জন্য, আমরা এখানের পরিবর্তনগুলোর সাথে Compose-এ এই এক্সেপশনের জন্য বর্ণনামূলক মেসেজিং যুক্ত করেছি। আপনি যদি কোনো সমস্যা খুঁজে পান, তবে ইস্যু ট্র্যাকার ব্যবহার করে তা রিপোর্ট করুন।
পরিবর্তনশীল ফন্ট ব্যবহার করুন
ভেরিয়েবল ফন্ট হলো এমন একটি ফন্ট ফরম্যাট যা একটি ফন্ট ফাইলে বিভিন্ন স্টাইল ধারণ করার সুযোগ দেয়। ভেরিয়েবল ফন্টের সাহায্যে, আপনি আপনার পছন্দের স্টাইল তৈরি করতে অ্যাক্সিস (বা প্যারামিটার) পরিবর্তন করতে পারেন। এই অ্যাক্সিসগুলো স্ট্যান্ডার্ড হতে পারে, যেমন ওয়েট, উইডথ, স্ল্যান্ট এবং ইটালিক, অথবা কাস্টম হতে পারে, যা প্রতিটি ভেরিয়েবল ফন্টে ভিন্ন ভিন্ন হয়।

সাধারণ ফন্ট ফাইলের পরিবর্তে ভ্যারিয়েবল ফন্ট ব্যবহার করলে একাধিক ফাইলের বদলে মাত্র একটি ফন্ট ফাইলই যথেষ্ট হয়।
ভেরিয়েবল ফন্ট সম্পর্কে আরও বিস্তারিত জানতে, গুগল ফন্টস নলেজ (Google Fonts Knowledge) , উপলব্ধ ভেরিয়েবল ফন্টগুলোর সম্পূর্ণ ক্যাটালগ এবং প্রতিটি ফন্টের সমর্থিত অক্ষগুলোর সারণী দেখুন।
এই ডক্যুমেন্টেশনে দেখানো হয়েছে কিভাবে আপনার কম্পোজ অ্যাপে একটি ভ্যারিয়েবল ফন্ট প্রয়োগ করতে হয়।
একটি পরিবর্তনশীল ফন্ট লোড করুন
আপনি যে ভ্যারিয়েবল ফন্টটি ব্যবহার করতে চান (উদাহরণস্বরূপ Roboto Flex ) সেটি ডাউনলোড করে আপনার অ্যাপের
app/res/fontফোল্ডারে রাখুন। নিশ্চিত করুন যে আপনি যেttfফাইলটি যোগ করছেন তা ফন্টটির ভ্যারিয়েবল সংস্করণ , এবং আপনার ফন্ট ফাইলের নামটি সম্পূর্ণ ছোট হাতের অক্ষরে লেখা ও এতে কোনো বিশেষ অক্ষর নেই।ভেরিয়েবল ফন্ট লোড করতে,
res/font/ডিরেক্টরিতে রাখা ফন্টটি ব্যবহার করে একটিFontFamilyনির্ধারণ করুন:// In Typography.kt @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(950), FontVariation.width(30f), FontVariation.slant(-6f), ) ) )
FontVariationAPI আপনাকে weight , width , এবং slant- এর মতো স্ট্যান্ডার্ড ফন্ট অ্যাক্সিসগুলো কনফিগার করার সুযোগ দেয়। এগুলো হলো স্ট্যান্ডার্ড অ্যাক্সিস যা যেকোনো ভ্যারিয়েবল ফন্টের সাথেই পাওয়া যায়। ফন্টটি কোথায় ব্যবহার করা হবে তার উপর ভিত্তি করে আপনি ফন্টের বিভিন্ন কনফিগারেশন তৈরি করতে পারেন।পরিবর্তনশীল ফন্ট শুধুমাত্র অ্যান্ড্রয়েড সংস্করণ O এবং তার উপরের সংস্করণগুলোর জন্য উপলব্ধ, তাই একটি গার্ডরেল যোগ করুন এবং একটি উপযুক্ত ফলব্যাক কনফিগার করুন:
// In Typography.kt val default = FontFamily( /* * This can be any font that makes sense */ Font( R.font.robotoflex_static_regular ) ) @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(950), FontVariation.width(30f), FontVariation.slant(-6f), ) ) ) } else { default }
সহজ পুনঃব্যবহারের জন্য সেটিংসগুলোকে একগুচ্ছ কনস্ট্যান্টে বের করে নিন এবং ফন্ট সেটিংসগুলোকে এই কনস্ট্যান্টগুলো দিয়ে প্রতিস্থাপন করুন:
// VariableFontDimension.kt object DisplayLargeVFConfig { const val WEIGHT = 950 const val WIDTH = 30f const val SLANT = -6f const val ASCENDER_HEIGHT = 800f const val COUNTER_WIDTH = 500 } @OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(DisplayLargeVFConfig.WEIGHT), FontVariation.width(DisplayLargeVFConfig.WIDTH), FontVariation.slant(DisplayLargeVFConfig.SLANT), ) ) ) } else { default }
এই
FontFamilyব্যবহার করার জন্য Material Design 3 টাইপোগ্রাফি কনফিগার করুন:// Type.kt val Typography = Typography( displayLarge = TextStyle( fontFamily = displayLargeFontFamily, fontSize = 50.sp, lineHeight = 64.sp, letterSpacing = 0.sp, /***/ ) )
এই নমুনাটিতে
displayLargeMaterial 3 টাইপোগ্রাফি ব্যবহার করা হয়েছে, যার ডিফল্ট ফন্ট সেটিংস এবং প্রস্তাবিত ব্যবহার ভিন্ন। উদাহরণস্বরূপ, সংক্ষিপ্ত ও গুরুত্বপূর্ণ লেখার জন্য আপনারdisplayLargeব্যবহার করা উচিত, কারণ এটি স্ক্রিনের সবচেয়ে বড় লেখা।Material 3-এর সাহায্যে, আপনি আপনার টাইপোগ্রাফি কাস্টমাইজ করতে
TextStyleএবংfontFamilyএর ডিফল্ট মান পরিবর্তন করতে পারেন। উপরের কোড স্নিপেটে, আপনি প্রতিটি ফন্ট ফ্যামিলির জন্য ফন্ট সেটিংস কাস্টমাইজ করতেTextStyleএর ইনস্ট্যান্সগুলো কনফিগার করেছেন।এখন যেহেতু আপনি আপনার টাইপোগ্রাফি নির্ধারণ করেছেন, এটি M3
MaterialThemeএ পাঠান:MaterialTheme( colorScheme = MaterialTheme.colorScheme, typography = Typography, content = content )
অবশেষে, একটি
Textকম্পোজেবল ব্যবহার করুন এবং স্টাইলটিMaterialTheme.typography.displayLargeসংজ্ঞায়িত টাইপোগ্রাফি স্টাইলগুলির মধ্যে একটিতে নির্দিষ্ট করুন।@Composable @Preview fun CardDetails() { MyCustomTheme { Card( shape = RoundedCornerShape(8.dp), elevation = CardDefaults.cardElevation(defaultElevation = 4.dp), modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { Column( modifier = Modifier.padding(16.dp) ) { Text( text = "Compose", style = MaterialTheme.typography.displayLarge, modifier = Modifier.padding(bottom = 8.dp), maxLines = 1 ) Text( text = "Beautiful UIs on Android", style = MaterialTheme.typography.headlineMedium, modifier = Modifier.padding(bottom = 8.dp), maxLines = 2 ) Text( text = "Jetpack Compose is Android’s recommended modern toolkit for building native UI. It simplifies and accelerates UI development on Android. Quickly bring your app to life with less code, powerful tools, and intuitive Kotlin APIs.", style = MaterialTheme.typography.bodyLarge, modifier = Modifier.padding(bottom = 8.dp), maxLines = 3 ) } } } }
প্রতিটি
Textকম্পোজেবল তার ম্যাটেরিয়াল থিমের স্টাইলের মাধ্যমে কনফিগার করা হয় এবং এতে একটি ভিন্ন ভ্যারিয়েবল ফন্ট কনফিগারেশন থাকে। আপনি M3MaterialThemeথিম কম্পোজেবলে প্রদত্ত টাইপোগ্রাফি পেতেMaterialTheme.typographyব্যবহার করতে পারেন।

কাস্টম অক্ষ ব্যবহার করুন
ফন্টে নিজস্ব অক্ষও থাকতে পারে। এগুলো ফন্ট ফাইলের মধ্যেই নির্ধারণ করা হয়। উদাহরণস্বরূপ, রোবোটো ফ্লেক্স ফন্টে অ্যাসেন্ডার হাইট ( "YTAS" ) অক্ষ রয়েছে, যা ছোট হাতের অক্ষরের অ্যাসেন্ডারগুলোর উচ্চতা সমন্বয় করে, অন্যদিকে কাউন্টার উইডথ ( "XTRA" ) প্রতিটি অক্ষরের প্রস্থ সমন্বয় করে।
আপনি FontVariation সেটিংস ব্যবহার করে এই অক্ষগুলোর মান পরিবর্তন করতে পারেন।
একটি ফন্টের জন্য আপনি যে কাস্টম অক্ষগুলো কনফিগার করতে পারেন, সে সম্পর্কে আরও তথ্যের জন্য প্রতিটি ফন্টের সমর্থিত অক্ষগুলোর সারণিটি দেখুন।
কাস্টম অক্ষ ব্যবহার করতে, কাস্টম
ascenderHeightএবংcounterWidthঅক্ষের জন্য ফাংশন সংজ্ঞায়িত করুন:fun ascenderHeight(ascenderHeight: Float): FontVariation.Setting { require(ascenderHeight in 649f..854f) { "'Ascender Height' must be in 649f..854f" } return FontVariation.Setting("YTAS", ascenderHeight) } fun counterWidth(counterWidth: Int): FontVariation.Setting { require(counterWidth in 323..603) { "'Counter width' must be in 323..603" } return FontVariation.Setting("XTRA", counterWidth.toFloat()) }
এই ফাংশনগুলো নিম্নলিখিত কাজগুলো করে:
- তারা যে মানগুলো গ্রহণ করতে পারে, তার জন্য নির্দিষ্ট সীমা নির্ধারণ করুন। যেমনটি আপনি ভেরিয়েবল ফন্ট ক্যাটালগে দেখতে পাচ্ছেন,
ascenderHeight (YTAS)-এর সর্বনিম্ন মান649fএবং সর্বোচ্চ মান854f। - ফন্ট সেটিংটি ফেরত দিন, যাতে কনফিগারেশনটি ফন্টে যোগ করার জন্য প্রস্তুত থাকে।
FontVariation.Setting()মেথডটিতে, অ্যাক্সিসের নাম (YTAS, XTRA) হার্ডকোড করা থাকে এবং এটি প্যারামিটার হিসেবে মানটি গ্রহণ করে।
- তারা যে মানগুলো গ্রহণ করতে পারে, তার জন্য নির্দিষ্ট সীমা নির্ধারণ করুন। যেমনটি আপনি ভেরিয়েবল ফন্ট ক্যাটালগে দেখতে পাচ্ছেন,
ফন্ট কনফিগারেশনের সাথে অ্যাক্সিস ব্যবহার করে, লোড করা প্রতিটি
Fontঅতিরিক্ত প্যারামিটার পাস করুন:@OptIn(ExperimentalTextApi::class) val displayLargeFontFamily = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { FontFamily( Font( R.font.robotoflex_variable, variationSettings = FontVariation.Settings( FontVariation.weight(DisplayLargeVFConfig.WEIGHT), FontVariation.width(DisplayLargeVFConfig.WIDTH), FontVariation.slant(DisplayLargeVFConfig.SLANT), ascenderHeight(DisplayLargeVFConfig.ASCENDER_HEIGHT), counterWidth(DisplayLargeVFConfig.COUNTER_WIDTH) ) ) ) } else { default }
লক্ষ্য করুন যে, ছোট হাতের অক্ষরের অ্যাসেন্ডারগুলোর উচ্চতা এখন বাড়ানো হয়েছে এবং অন্য লেখাটি আরও চওড়া হয়েছে:

অতিরিক্ত সম্পদ
ভেরিয়েবল ফন্ট সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত ব্লগ পোস্টটি দেখুন:
{% হুবহু %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলেও লিঙ্কের লেখা প্রদর্শিত হয়।
- কম্পোজে রিসোর্স
- স্টাইল টেক্সট
- কম্পোজে ম্যাটেরিয়াল ডিজাইন ২