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 से सीधा गुणा कम विश्वसनीय है क्योंकि यह किनारे के मामलों (शून्य मान, ओवरफ़्लो) को संभालता नहीं है। scaledDensity तब बदलता है जब Settings > Display > Font size के माध्यम से फ़ॉन्ट सेटिंग्स संशोधित की जाती हैं।
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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें