sp — Scale-independent Pixels, Android-এ টেক্সট পরিমাপের একক যা ডিভাইসের ফন্ট আকার সেটিংস বিবেচনা করে। dp-এর বিপরীতে, sp সিস্টেম ফন্ট আকারের সাথে স্কেল হয়, ইন্টারফেসের অ্যাক্সেসযোগ্যতা নিশ্চিত করে। এই নিবন্ধটি sp এবং dp-এর মধ্যে পার্থক্য ব্যাখ্যা করে, XML এবং Kotlin-এ textSize সেট করা দেখায় এবং Android-এ টাইপোগ্রাফি নিয়ে কাজ করার সেরা অভ্যাস প্রকাশ করে।
মূল বিষয়
sp (scale-independent pixel) — Android-এ ফন্ট আকার পরিমাপের একক যা ব্যবহারকারীর সিস্টেম সেটিংস অনুযায়ী স্বয়ংক্রিয়ভাবে স্কেল হয়। যখন ডিভাইসের মালিক সেটিংসে ফন্ট আকার বাড়ায়, তখন sp মানসম্পন্ন সমস্ত উপাদান আনুপাতিকভাবে বড় হয়। এটি দৃষ্টি প্রতিবন্ধী ব্যক্তিদের জন্য ইন্টারফেসের অ্যাক্সেসযোগ্যতা নিশ্চিত করে।
মৌলিক অনুপাত: স্ট্যান্ডার্ড ফন্ট স্কেল 1.0 (স্বাভাবিক) এ 1 sp = 1 dp। যদি ব্যবহারকারী ফন্ট বড় (1.15×) সেট করে, 16 sp 18.4 ফিজিক্যাল পিক্সেলে পরিণত হয়। ছোট ফন্ট আকারে (0.85×), একই 16 sp 13.6 px হয়। স্কেলিং মেকানিজম Android Framework স্তরে Settings.System.FONT_SCALE-এর মাধ্যমে পরিচালিত হয়।
Google Material Design নির্দেশিকা অনুসারে, টেক্সট শুধুমাত্র sp-এ নির্দিষ্ট করা উচিত। ব্যতিক্রম হল কম্পোনেন্টের ফিক্সড লেবেল যেখানে আকার লেআউটের জন্য গুরুত্বপূর্ণ (যেমন, ফিক্সড উচ্চতার বাটনের ভিতরের টেক্সট)। এই ধরনের ক্ষেত্রে, ম্যানুয়াল অ্যাক্সেসযোগ্যতা নিয়ন্ত্রণ সহ dp ব্যবহার করার সুপারিশ করা হয়।
sp এবং dp-এর মধ্যে পার্থক্য Android ডেভেলপার ইন্টারভিউ এবং প্রকৃত কোড রিভিউতে সবচেয়ে সাধারণ বিষয়গুলির মধ্যে একটি। উভয় একক ঘনত্ব-স্বাধীন পিক্সেলের (160 dpi = 1 dp = 1 px mdpi স্ক্রিনে) সাথে আবদ্ধ, কিন্তু সিস্টেম ফন্ট আকার পরিবর্তন হলে ভিন্নভাবে আচরণ করে।
| বৈশিষ্ট্য | sp | dp |
|---|---|---|
| উদ্দেশ্য | টেক্সট আকার | উপাদানের মাত্রা, প্যাডিং, প্রস্থ, উচ্চতা |
| ফন্ট স্কেলিং | হ্যাঁ (স্কেল ফ্যাক্টর) | না |
| ঘনত্ব স্কেলিং | হ্যাঁ | হ্যাঁ |
| সেটিং API | android:textSize | android:layout_width, layout_height, padding, margin |
| Material Design Token | typescale | spacing, sizing |
অভ্যাসে, একটি সাধারণ ভুল হল টেক্সটের জন্য dp ব্যবহার করা। যদি টেক্সট dp-এ সেট করা হয়, এটি ফন্ট আকার বাড়লে স্কেল হয় না, যা দুর্বল দৃষ্টি সম্পন্ন ব্যবহারকারীদের জন্য ইন্টারফেস অ্যাক্সেসযোগ্য করে তোলে। উল্টো ভুল হল বাটনের উচ্চতা বা প্যাডিংয়ের জন্য sp ব্যবহার করা: ফন্ট বাড়লে বাটন "ফুলে" যেতে পারে, লেআউট ভেঙে দেয়।
sp স্কেলিং Android Framework স্তরে TypedValue ক্লাসে বাস্তবায়িত হয়েছে। রূপান্তর সূত্র: sp = dp × scaledDensity, যেখানে scaledDensity একটি স্কেলিং ফ্যাক্টর যা স্ক্রিন ঘনত্ব এবং ব্যবহারকারীর ফন্ট আকার সেটিং উভয়ই বিবেচনা করে।
// Kotlin-এ প্রোগ্রামেটিকভাবে scaledDensity প্রাপ্তি
val scaledDensity = with(context.resources) {
displayMetrics.scaledDensity
}
// sp-কে px-এ রূপান্তর
fun spToPx(sp: Float, context: Context): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
sp,
context.resources.displayMetrics
)
}
// px-কে sp-এ রূপান্তর
fun pxToSp(px: Float, context: Context): Float {
return px / context.resources.displayMetrics.scaledDensity
}TypedValue.applyDimension পদ্ধতি হল রানটাইমে sp-কে পিক্সেলে রূপান্তরের একমাত্র সঠিক উপায়। scaledDensity দ্বারা সরাসরি গুণ করা কম নির্ভরযোগ্য কারণ এটি এজ কেস (শূন্য মান, ওভারফ্লো) হ্যান্ডেল করে না। Settings > Display > Font size-এর মাধ্যমে ফন্ট সেটিংস পরিবর্তন করলে scaledDensity পরিবর্তিত হয়।
Android পাঁচটি পূর্বনির্ধারিত ফন্ট স্কেল স্তর প্রদান করে: ছোট (0.85×), ডিফল্ট (1.0×), বড় (1.15×), সবচেয়ে বড় (1.3×) এবং Android 14+-এ একটি অতিরিক্ত খুব বড় স্তর (>1.3×)। ডিভাইস নির্মাতারা (Samsung, Xiaomi) তাদের নিজস্ব স্তর যোগ করে — 2.0× পর্যন্ত। sp-তে ন্যূনতম টেক্সট আকার কখনই নির্দিষ্ট পিক্সেল সংখ্যার গ্যারান্টি দেয় না।
XML লেআউটে, sp শুধুমাত্র android:textSize অ্যাট্রিবিউটে ব্যবহার করা হয়। অন্যান্য সমস্ত মাত্রা — প্রস্থ, উচ্চতা, প্যাডিং, মার্জিন, এলিভেশন — dp-তে সেট করা হয়। নিয়মটি সহজ: যদি উপাদান টেক্সট প্রদর্শন করে, এর আকার sp-তে; যদি উপাদান জ্যামিতি নির্ধারণ করে, আকার dp-তে।
<!-- sp-তে textSize সহ TextView লেআউট -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textSize="16sp"
android:padding="12dp"
android:lineSpacingExtra="4dp" />
<!-- dimens রিসোর্স ব্যবহার -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/text_body_large" />টেক্সট আকারগুলি dimens.xml ফাইলে রাখার সুপারিশ করা হয়। এটি টাইপোগ্রাফি রক্ষণাবেক্ষণ সহজ করে, বিভিন্ন স্ক্রিন কনফিগারেশনের জন্য আকার ওভাররাইড করতে দেয় এবং পুরো অ্যাপ্লিকেশন জুড়ে সামঞ্জস্য নিশ্চিত করে।
<!-- res/values/dimens.xml -->
<resources>
<!-- Material Design Type Scale -->
<dimen name="text_display_large">34sp</dimen>
<dimen name="text_display_medium">28sp</dimen>
<dimen name="text_headline_large">24sp</dimen>
<dimen name="text_headline_medium">20sp</dimen>
<dimen name="text_title_large">18sp</dimen>
<dimen name="text_body_large">16sp</dimen>
<dimen name="text_body_medium">14sp</dimen>
<dimen name="text_label_large">14sp</dimen>
<dimen name="text_label_small">11sp</dimen>
</resources>Material Design Type Scale-এ 13টি আকার স্তর অন্তর্ভুক্ত — ছোট লেবেলের জন্য 11sp থেকে বড় ডিসপ্লে শিরোনামের জন্য 57sp পর্যন্ত। Android প্রকল্পগুলি সাধারণত 8–10 স্তর ব্যবহার করে। সমস্ত মান 1sp-এর গুণিতক হওয়া উচিত — ভগ্নাংশের মান (15.5sp) সাবপিক্সেল পজিশনিংয়ের কারণে রেন্ডারিং নষ্ট করে।
আধুনিক Android উন্নয়নে, টেক্সট খুব কমই সরাসরি sp-তে textSize-এর মাধ্যমে সেট করা হয়। পরিবর্তে, MaterialTheme.typography সিস্টেম ব্যবহার করা হয়, যেখানে প্রতিটি স্টাইল পূর্বনির্ধারিত এবং আকার, ওজন, লাইন উচ্চতা এবং অক্ষর-ব্যবধান অন্তর্ভুক্ত করে।
// Typography API-এর মাধ্যমে কাস্টম টাইপোগ্রাফি
val AppTypography = Typography(
displayLarge = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 34.sp,
lineHeight = 40.sp,
letterSpacing = 0.sp
),
headlineLarge = TextStyle(
fontWeight = FontWeight.SemiBold,
fontSize = 24.sp,
lineHeight = 32.sp
),
titleLarge = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 18.sp,
lineHeight = 24.sp
),
bodyLarge = TextStyle(
fontWeight = FontWeight.Normal,
fontSize = 16.sp,
lineHeight = 24.sp,
letterSpacing = 0.5.sp
),
labelSmall = TextStyle(
fontWeight = FontWeight.Medium,
fontSize = 11.sp,
lineHeight = 16.sp,
letterSpacing = 0.5.sp
)
)Jetpack Compose-এ এক্সটেনশন ফাংশন .sp স্বয়ংক্রিয়ভাবে স্কেল-স্বাধীন পিক্সেলে রূপান্তরিত হয়। যখন সিস্টেম ফন্ট আকার পরিবর্তন হয়, Compose নতুন scaledDensity অনুযায়ী fontSize, lineHeight এবং spacing পুনঃগণনা করে। TextUnit (sp-কে প্রতিনিধিত্বকারী ক্লাস) গ্যারান্টি দেয় যে টেক্সট স্কেল হয় যখন প্যাডিং স্কেল হয় না।
Jetpack Compose-এ, sp TextUnit টাইপ দ্বারা উপস্থাপিত হয়, যা ভুলবশত উপাদানের মাত্রার জন্য ব্যবহার করা যায় না। Kotlin কম্পাইলার একটি ত্রুটি দেবে যদি TextUnit সেখানে পাস করা হয় যেখানে Dp প্রত্যাশিত। এটি ভুল স্কেলিং সম্পর্কিত বাগগুলির একটি সম্পূর্ণ শ্রেণী দূর করে।
// Compose-এ TextUnit — sp-এর সাথে নিরাপদ কাজ
@Composable
fun ArticleCard(title: String, description: String) {
Card(modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
) {
Text(
text = title,
style = MaterialTheme.typography.titleLarge
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = description,
style = MaterialTheme.typography.bodyMedium
)
}
}
// sp-তে fontSize স্পষ্টভাবে সেট করা
Text(
text = "কাস্টম আকার",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.primary
)Compose-এ XML অ্যাট্রিবিউট android:textSize-এর কোনো সরাসরি সমতুল্য নেই — টেক্সট আকার TextStyle.fontSize-এর মাধ্যমে সেট করা হয়। MaterialTheme.typography সিস্টেম পূর্বনির্ধারিত স্টাইল প্রদান করে যা Material Design Type Scale-এর সাথে সঙ্গতিপূর্ণ। যদি কাস্টম আকারের প্রয়োজন হয়, 20.sp লিটারেল ব্যবহার করা হয় — ভাষা গ্যারান্টি দেয় যে এটি TextUnit, Dp নয়।
sp-এর সঠিক ব্যবহার একটি অ্যাক্সেসযোগ্য Android অ্যাপ্লিকেশনের ভিত্তি। নীচে Google Material Design এবং Android Developers Guide সুপারিশের উপর ভিত্তি করে নিয়ম দেওয়া হল।
প্রধান অ্যাক্সেসযোগ্যতার নিয়ম: ব্যবহারকারী কার্যকারিতা না হারিয়ে ফন্ট আকার বাড়াতে সক্ষম হওয়া উচিত। যদি অ্যাপ্লিকেশন 1.3× ফন্ট স্কেলে সঠিকভাবে কাজ করে, এটি মৌলিক অ্যাক্সেসযোগ্যতা পরীক্ষা পাস করবে। Google Play অ্যাপ্লিকেশন প্রত্যাখ্যান করতে পারে যদি textSize dp-তে সেট করা থাকে এবং ইন্টারফেস স্কেল না হয়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
sp (scale-independent pixel) সিস্টেম ফন্ট আকার পরিবর্তনে স্কেল হয়, যখন dp স্কেল হয় না। sp শুধুমাত্র টেক্সটের জন্য ব্যবহৃত হয়, dp অন্যান্য সমস্ত উপাদানের মাত্রার জন্য। রূপান্তর ফ্যাক্টর: sp = dp × FONT_SCALE।
না। প্যাডিং, বাটনের উচ্চতা এবং কার্ডের প্রস্থ dp-তে সেট করা উচিত। প্যাডিংয়ের জন্য sp ব্যবহার করলে ফন্ট বাড়লে উপাদান অস্বাভাবিকভাবে বড় হয় এবং স্ক্রিন সীমানার বাইরে চলে যেতে পারে।
Settings > Display > Font size খুলুন এবং সর্বোচ্চ মান (Largest) সেট করুন। অ্যাপ্লিকেশন চালু করুন এবং পরীক্ষা করুন যে সমস্ত টেক্সট পঠনযোগ্য, উপাদান ওভারল্যাপ হয় না এবং বাটন স্ক্রিন সীমানার বাইরে যায় না। অটোমেশনের জন্য, UiAutomator-এর সাথে Espresso ব্যবহার করুন।
Material Design labelSmall-এর জন্য ন্যূনতম আকার 11sp সুপারিশ করে। মূল টেক্সটের জন্য — 14sp (bodyMedium) থেকে 16sp (bodyLarge)। 11sp-এর চেয়ে ছোট আকার সুপারিশ করা হয় না কারণ উচ্চ পিক্সেল ঘনত্বের ডিভাইসে সেগুলি অপাঠ্য হয়ে যায়।
টেক্সট সিস্টেম ফন্ট সেটিংস নির্বিশেষে একটি নির্দিষ্ট আকারে প্রদর্শিত হবে। বড় ফন্টের ব্যবহারকারীরা এই টেক্সট আরামে পড়তে পারবেন না। এটি WCAG অ্যাক্সেসযোগ্যতার প্রয়োজনীয়তা লঙ্ঘন করে এবং Google Play থেকে অ্যাপ্লিকেশন প্রত্যাখ্যানের কারণ হতে পারে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন