sp: এটি কী, Android-এ টেক্সটের জন্য স্কেলযোগ্য পিক্সেল

লেখক: IT Sectr প্রকাশিত: 2026-02-25 পড়ার সময়: 9 মিনিট

sp — Scale-independent Pixels, Android-এ টেক্সট পরিমাপের একক যা ডিভাইসের ফন্ট আকার সেটিংস বিবেচনা করে। dp-এর বিপরীতে, sp সিস্টেম ফন্ট আকারের সাথে স্কেল হয়, ইন্টারফেসের অ্যাক্সেসযোগ্যতা নিশ্চিত করে। এই নিবন্ধটি sp এবং dp-এর মধ্যে পার্থক্য ব্যাখ্যা করে, XML এবং Kotlin-এ textSize সেট করা দেখায় এবং Android-এ টাইপোগ্রাফি নিয়ে কাজ করার সেরা অভ্যাস প্রকাশ করে।

মূল বিষয়

  • sp — টেক্সটের জন্য একক, ব্যবহারকারীর সিস্টেম ফন্ট সেটিংস অনুযায়ী স্কেলযোগ্য
  • dp — উপাদানের মাত্রার জন্য একক, ফন্ট আকার পরিবর্তনে সাড়া দেয় না
  • sp এবং dp-এর পার্থক্য: sp = dp × scaleFactor, যেখানে scaleFactor ফন্ট সেটিংসের উপর নির্ভর করে
  • XML-এ textSize sp-এর মাধ্যমে সেট করা হয়: android:textSize="16sp"
  • Material Design শিরোনামের জন্য 12sp থেকে 34sp পর্যন্ত টাইপোগ্রাফি রেঞ্জ সুপারিশ করে

Android-এ sp কী?

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: মূল পার্থক্য

sp এবং dp-এর মধ্যে পার্থক্য Android ডেভেলপার ইন্টারভিউ এবং প্রকৃত কোড রিভিউতে সবচেয়ে সাধারণ বিষয়গুলির মধ্যে একটি। উভয় একক ঘনত্ব-স্বাধীন পিক্সেলের (160 dpi = 1 dp = 1 px mdpi স্ক্রিনে) সাথে আবদ্ধ, কিন্তু সিস্টেম ফন্ট আকার পরিবর্তন হলে ভিন্নভাবে আচরণ করে।

বৈশিষ্ট্যspdp
উদ্দেশ্যটেক্সট আকারউপাদানের মাত্রা, প্যাডিং, প্রস্থ, উচ্চতা
ফন্ট স্কেলিংহ্যাঁ (স্কেল ফ্যাক্টর)না
ঘনত্ব স্কেলিংহ্যাঁহ্যাঁ
সেটিং APIandroid:textSizeandroid:layout_width, layout_height, padding, margin
Material Design Tokentypescalespacing, sizing

অভ্যাসে, একটি সাধারণ ভুল হল টেক্সটের জন্য dp ব্যবহার করা। যদি টেক্সট dp-এ সেট করা হয়, এটি ফন্ট আকার বাড়লে স্কেল হয় না, যা দুর্বল দৃষ্টি সম্পন্ন ব্যবহারকারীদের জন্য ইন্টারফেস অ্যাক্সেসযোগ্য করে তোলে। উল্টো ভুল হল বাটনের উচ্চতা বা প্যাডিংয়ের জন্য sp ব্যবহার করা: ফন্ট বাড়লে বাটন "ফুলে" যেতে পারে, লেআউট ভেঙে দেয়।

sp স্কেলিং কীভাবে কাজ করে

sp স্কেলিং Android Framework স্তরে TypedValue ক্লাসে বাস্তবায়িত হয়েছে। রূপান্তর সূত্র: sp = dp × scaledDensity, যেখানে scaledDensity একটি স্কেলিং ফ্যাক্টর যা স্ক্রিন ঘনত্ব এবং ব্যবহারকারীর ফন্ট আকার সেটিং উভয়ই বিবেচনা করে।

kotlin
// 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 ব্যবহার

XML লেআউটে, sp শুধুমাত্র android:textSize অ্যাট্রিবিউটে ব্যবহার করা হয়। অন্যান্য সমস্ত মাত্রা — প্রস্থ, উচ্চতা, প্যাডিং, মার্জিন, এলিভেশন — dp-তে সেট করা হয়। নিয়মটি সহজ: যদি উপাদান টেক্সট প্রদর্শন করে, এর আকার sp-তে; যদি উপাদান জ্যামিতি নির্ধারণ করে, আকার dp-তে।

XML-এ textSize-এর মৌলিক উদাহরণ

xml
<!-- 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 ফাইলে রাখার সুপারিশ করা হয়। এটি টাইপোগ্রাফি রক্ষণাবেক্ষণ সহজ করে, বিভিন্ন স্ক্রিন কনফিগারেশনের জন্য আকার ওভাররাইড করতে দেয় এবং পুরো অ্যাপ্লিকেশন জুড়ে সামঞ্জস্য নিশ্চিত করে।

টাইপোগ্রাফিক টোকেন সহ dimens.xml

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) সাবপিক্সেল পজিশনিংয়ের কারণে রেন্ডারিং নষ্ট করে।

Kotlin-এর মাধ্যমে টাইপোগ্রাফি কনফিগার করা

আধুনিক Android উন্নয়নে, টেক্সট খুব কমই সরাসরি sp-তে textSize-এর মাধ্যমে সেট করা হয়। পরিবর্তে, MaterialTheme.typography সিস্টেম ব্যবহার করা হয়, যেখানে প্রতিটি স্টাইল পূর্বনির্ধারিত এবং আকার, ওজন, লাইন উচ্চতা এবং অক্ষর-ব্যবধান অন্তর্ভুক্ত করে।

kotlin
// 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

Jetpack Compose-এ, sp TextUnit টাইপ দ্বারা উপস্থাপিত হয়, যা ভুলবশত উপাদানের মাত্রার জন্য ব্যবহার করা যায় না। Kotlin কম্পাইলার একটি ত্রুটি দেবে যদি TextUnit সেখানে পাস করা হয় যেখানে Dp প্রত্যাশিত। এটি ভুল স্কেলিং সম্পর্কিত বাগগুলির একটি সম্পূর্ণ শ্রেণী দূর করে।

kotlin
// 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 নিয়ে কাজ করার সেরা অভ্যাস

sp-এর সঠিক ব্যবহার একটি অ্যাক্সেসযোগ্য Android অ্যাপ্লিকেশনের ভিত্তি। নীচে Google Material Design এবং Android Developers Guide সুপারিশের উপর ভিত্তি করে নিয়ম দেওয়া হল।

  • সর্বদা টেক্সটের জন্য sp ব্যবহার করুন — textSize কখনও dp বা px-এ সেট করবেন না, অন্যথায় বড় ফন্টের ব্যবহারকারীরা ইন্টারফেস পড়তে পারবেন না
  • কন্টেইনারের জন্য dp ব্যবহার করুন — বাটনের উচ্চতা, প্যাডিং এবং কার্ডের প্রস্থ dp-তে হওয়া উচিত, অন্যথায় বড় ফন্টে উপাদান ওভারল্যাপ হতে পারে
  • আকার dimens.xml-এ রাখুন — টাইপোগ্রাফিক টোকেনের কেন্দ্রীভূত সঞ্চয় রিফ্যাক্টরিং এবং ডার্ক থিম সমর্থন সহজ করে
  • 12sp-এর চেয়ে ছোট sp ব্যবহার করবেন না — ছোট টেক্সট উচ্চ PPI ডিভাইসে এবং স্ট্যান্ডার্ড ফন্ট আকারে অপাঠ্য হয়ে যায়
  • সর্বোচ্চ ফন্ট স্কেলে পরীক্ষা করুন — ডিভাইস সেটিংসে সবচেয়ে বড় ফন্ট সক্রিয় করুন এবং যাচাই করুন যে ইন্টারফেস ভাঙে না

প্রধান অ্যাক্সেসযোগ্যতার নিয়ম: ব্যবহারকারী কার্যকারিতা না হারিয়ে ফন্ট আকার বাড়াতে সক্ষম হওয়া উচিত। যদি অ্যাপ্লিকেশন 1.3× ফন্ট স্কেলে সঠিকভাবে কাজ করে, এটি মৌলিক অ্যাক্সেসযোগ্যতা পরীক্ষা পাস করবে। Google Play অ্যাপ্লিকেশন প্রত্যাখ্যান করতে পারে যদি textSize dp-তে সেট করা থাকে এবং ইন্টারফেস স্কেল না হয়।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

sp কীভাবে dp থেকে আলাদা?

sp (scale-independent pixel) সিস্টেম ফন্ট আকার পরিবর্তনে স্কেল হয়, যখন dp স্কেল হয় না। sp শুধুমাত্র টেক্সটের জন্য ব্যবহৃত হয়, dp অন্যান্য সমস্ত উপাদানের মাত্রার জন্য। রূপান্তর ফ্যাক্টর: sp = dp × FONT_SCALE।

প্যাডিংয়ের জন্য sp ব্যবহার করা যাবে?

না। প্যাডিং, বাটনের উচ্চতা এবং কার্ডের প্রস্থ dp-তে সেট করা উচিত। প্যাডিংয়ের জন্য sp ব্যবহার করলে ফন্ট বাড়লে উপাদান অস্বাভাবিকভাবে বড় হয় এবং স্ক্রিন সীমানার বাইরে চলে যেতে পারে।

কীভাবে যাচাই করবেন যে অ্যাপ sp-এর সাথে সঠিকভাবে কাজ করে?

Settings > Display > Font size খুলুন এবং সর্বোচ্চ মান (Largest) সেট করুন। অ্যাপ্লিকেশন চালু করুন এবং পরীক্ষা করুন যে সমস্ত টেক্সট পঠনযোগ্য, উপাদান ওভারল্যাপ হয় না এবং বাটন স্ক্রিন সীমানার বাইরে যায় না। অটোমেশনের জন্য, UiAutomator-এর সাথে Espresso ব্যবহার করুন।

sp-তে ন্যূনতম অনুমোদিত টেক্সট আকার কী?

Material Design labelSmall-এর জন্য ন্যূনতম আকার 11sp সুপারিশ করে। মূল টেক্সটের জন্য — 14sp (bodyMedium) থেকে 16sp (bodyLarge)। 11sp-এর চেয়ে ছোট আকার সুপারিশ করা হয় না কারণ উচ্চ পিক্সেল ঘনত্বের ডিভাইসে সেগুলি অপাঠ্য হয়ে যায়।

textSize dp-তে সেট করলে কী হবে?

টেক্সট সিস্টেম ফন্ট সেটিংস নির্বিশেষে একটি নির্দিষ্ট আকারে প্রদর্শিত হবে। বড় ফন্টের ব্যবহারকারীরা এই টেক্সট আরামে পড়তে পারবেন না। এটি WCAG অ্যাক্সেসযোগ্যতার প্রয়োজনীয়তা লঙ্ঘন করে এবং Google Play থেকে অ্যাপ্লিকেশন প্রত্যাখ্যানের কারণ হতে পারে।

সারসংক্ষেপ

  • sp — Android-এ ফন্ট মাপার একক যা FONT_SCALE-এর মাধ্যমে ব্যবহারকারী সেটিংসের সাথে স্কেল হয়
  • dp — উপাদানের মাত্রার জন্য একক যা ফন্ট আকার পরিবর্তনে সাড়া দেয় না
  • textSize XML-এ android:textSize="16sp"-এর মাধ্যমে সেট করা হয়, অন্যান্য সমস্ত মাত্রা dp-তে
  • MaterialTheme.typography Jetpack Compose-এ টাইপ নিরাপত্তার জন্য TextUnit (.sp) ব্যবহার করে
  • dimens.xml — সামঞ্জস্যের জন্য টাইপোগ্রাফিক টোকেনের কেন্দ্রীভূত সঞ্চয়
  • ন্যূনতম আকার টেক্সটের জন্য — 11sp, মূল অংশের জন্য সুপারিশকৃত — 14–16sp
  • পরীক্ষা সর্বোচ্চ ফন্ট স্কেলে — অ্যাক্সেসযোগ্যতা যাচাইয়ের একটি বাধ্যতামূলক ধাপ

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন