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 ڈویلپر انٹرویوز اور حقیقی کوڈ جائزوں میں سب سے عام موضوعات میں سے ایک ہے۔ دونوں اکائیاں کثافت سے آزاد پکسلز (mdpi اسکرینوں پر 160 dpi = 1 dp = 1 px) سے منسلک ہیں، لیکن سسٹم فونٹ سائز تبدیل ہونے پر مختلف طریقے سے برتاؤ کرتی ہیں۔
| خصوصیت | 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں