sp — Scale-independent Pixels, yunit ng pagsukat ng teksto sa Android na isinasaalang-alang ang mga setting ng laki ng font sa device. Hindi tulad ng dp, ang sp ay nags-scale kasama ng laki ng font ng system, tinitiyak ang accessibility ng mga interface. Ipinapaliwanag ng artikulo ang pagkakaiba sa pagitan ng sp at dp, ipinapakita ang pag-configure ng textSize sa XML at Kotlin, at inilalantad ang mga pinakamahusay na kasanayan sa typography sa Android.
Mga Pangunahing Punto
sp (scale-independent pixel) — yunit ng pagsukat ng laki ng font sa Android na awtomatikong nags-scale ayon sa mga setting ng system ng user. Kapag pinalaki ng may-ari ng device ang laki ng font sa mga setting, lahat ng elemento na may sp value ay proporsyonal na lumalaki. Tinitiyak nito ang accessibility ng interface para sa mga taong may mahinang paningin.
Batayang ratio: 1 sp = 1 dp sa karaniwang scale ng font na 1.0 (normal). Kung itinakda ng user ang font na Large (1.15×), ang 16 sp ay nagiging 18.4 pisikal na pixel. Sa laki ng font na Small (0.85×), ang parehong 16 sp ay magiging 13.6 px. Ang mekanismo ng pag-scale ay pinamamahalaan sa pamamagitan ng Settings.System.FONT_SCALE sa antas ng Android Framework.
Ayon sa Google Material Design Guidelines, ang teksto ay dapat itakda nang eksklusibo sa sp. Ang eksepsiyon — mga nakapirming label sa mga bahagi kung saan ang laki ay kritikal para sa layout (hal., teksto sa loob ng mga button na may nakapirming taas). Sa ganitong mga kaso, inirerekomenda ang paggamit ng dp na may manu-manong kontrol sa accessibility.
Ang pagkakaiba sa pagitan ng sp at dp — isa sa mga pinakakaraniwang paksa ng tanong sa mga panayam ng Android-developer at sa tunay na code review. Ang parehong yunit ay nakaugnay sa density-independent pixel (160 dpi = 1 dp = 1 px sa mdpi screen), ngunit magkaiba ang kilos kapag nagbago ang laki ng font ng system.
| Katangian | sp | dp |
|---|---|---|
| Layunin | Laki ng teksto | Laki ng elemento, distansya, lapad, taas |
| Pag-scale sa font | Oo (scale factor) | Hindi |
| Pag-scale sa density | Oo | Oo |
| API para sa pagtatakda | android:textSize | android:layout_width, layout_height, padding, margin |
| Material Design Token | typescale | spacing, sizing |
Sa praktika mali — ang paggamit ng dp para sa teksto. Kung ang teksto ay nakatakda sa dp, hindi ito nags-scale kapag pinalaki ang font, ginagawang hindi accessible ang interface para sa mga user na may mahinang paningin. Ang kabaligtarang mali — paggamit ng sp para sa taas ng button o distansya: kapag pinalaki ang font, ang button ay maaaring „umumbok", sinisira ang layout.
Ang pag-scale ng sp ay ipinatupad sa antas ng Android Framework sa klase na TypedValue. Ang formula ng pagkalkula: sp = dp × scaledDensity, kung saan ang scaledDensity ay coefficient ng scale na isinasaalang-alang ang density ng screen at ang setting ng font ng user.
// Pagkuha ng scaledDensity sa Kotlin nang programmatically
val scaledDensity = with(context.resources) {
displayMetrics.scaledDensity
}
// Pag-convert ng sp sa px
fun spToPx(sp: Float, context: Context): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
sp,
context.resources.displayMetrics
)
}
// Pag-convert ng px sa sp
fun pxToSp(px: Float, context: Context): Float {
return px / context.resources.displayMetrics.scaledDensity
}Ang pamamaraang TypedValue.applyDimension — ang tanging tamang paraan upang i-convert ang sp sa pixel sa runtime. Ang direktang pagpaparami sa scaledDensity ay hindi gaanong maaasahan dahil hindi nito pinangangasiwaan ang mga edge-case (mga zero value, overflow). Nagbabago ang scaledDensity kapag binago ang mga setting ng font sa pamamagitan ng Settings > Display > Font size.
Ang Android ay nagbibigay ng limang paunang itinakdang antas ng scale ng font: Small (0.85×), Default (1.0×), Large (1.15×), Largest (1.3×) at karagdagang antas na Very Large (>1.3×) sa Android 14+. Ang mga gumagawa ng device (Samsung, Xiaomi) ay nagdaragdag ng sarili nilang mga antas — hanggang 2.0×. Ang minimum na laki ng teksto sa sp ay hindi kailanman ginagarantiyahan ang isang nakapirming bilang ng pixel.
Sa XML ang sp ay ginagamit nang eksklusibo sa atributong android:textSize. Lahat ng iba pang laki — width, height, padding, margin, elevation — ay itinatakda sa dp. Simple ang patakaran: kung ang elemento ay nagpapakita ng teksto — ang laki nito ay nasa sp, kung ang elemento ay tumutukoy sa geometry — ang laki ay nasa dp.
<!-- Layout ng TextView na may textSize sa sp -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textSize="16sp"
android:padding="12dp"
android:lineSpacingExtra="4dp" />
<!-- Paggamit ng dimens resources -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/text_body_large" />Inirerekomenda na ilipat ang mga laki ng teksto sa file na dimens.xml. Pinapasimple nito ang pagpapanatili ng typography, pinapayagan ang pag-override ng mga laki para sa iba't ibang configuration ng screen at tinitiyak ang pagkakapare-pareho sa buong app.
<!-- 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>Ang Material Design Type Scale ay may kasamang 13 antas ng laki — mula 11sp para sa maliliit na label hanggang 57sp para sa malalaking display heading. Ang mga proyekto sa Android ay karaniwang gumagamit ng 8–10 antas. Ang lahat ng halaga ay dapat na multiple ng 1sp — ang fractional na halaga (15.5sp) ay nagpapababa ng rendering dahil sa subpixel positioning.
Sa modernong pag-develop ng Android, ang teksto ay bihirang itinakda nang direkta sa pamamagitan ng textSize sa sp. Sa halip, ginagamit ang sistema ng MaterialTheme.typography, kung saan ang bawat estilo ay paunang natukoy at may kasamang laki, bigat, spacing ng linya at letter-spacing.
// Custom na typography sa pamamagitan ng 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
)
)Ang extension function na .sp sa Jetpack Compose ay awtomatikong isinasalin sa scale-independent pixels. Kapag nagbago ang laki ng font ng system, ang Compose ay muling kumukwenta ng fontSize, lineHeight at spacing ayon sa bagong scaledDensity. Ginagarantiyahan ng TextUnit (ang klase na kumakatawan sa sp) na ang teksto ay nags-scale, at ang mga distansya — hindi.
Sa Jetpack Compose ang sp ay kinakatawan ng uri ng TextUnit, na hindi maaaring aksidenteng magamit para sa laki ng mga elemento. Ang Kotlin compiler ay nagbibigay ng error kung ang TextUnit ay ipinasa sa lugar kung saan inaasahan ang Dp. Inaalis nito ang isang buong klase ng mga bug na nauugnay sa maling pag-scale.
// TextUnit sa Compose — ligtas na pagtatrabaho sa 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
)
}
}
// Pagtatakda ng fontSize nang tahasan sa sp
Text(
text = "Custom na laki",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.primary
)Sa Compose walang direktang katumbas ng XML attribute na android:textSize — ang laki ng teksto ay itinatakda sa pamamagitan ng TextStyle.fontSize. Ang sistema ng MaterialTheme.typography ay nagbibigay ng paunang natukoy na mga estilo na tumutugma sa Material Design Type Scale. Kung kailangan ng custom na laki, ginagamit ang literal na 20.sp — ginagarantiyahan ng wika na ito ay TextUnit, hindi Dp.
Ang tamang paggamit ng sp — ang pundasyon ng isang accessible na Android app. Sa ibaba ay nakolekta ang mga patakaran batay sa mga rekomendasyon ng Google Material Design at Android Developers Guide.
Ang pangunahing patakaran ng accessibility: ang user ay dapat magkaroon ng kakayahang palakihin ang font nang hindi nawawala ang functionality. Kung ang app ay gumagana nang tama sa font scale na 1.3×, ito ay papasa sa mga pangunahing pagsusuri ng accessibility. Ang Google Play ay maaaring tanggihan ang app kung ang textSize ay nakatakda sa dp at ang interface ay hindi nags-scale.
Mga Madalas Itanong
sp (scale-independent pixel) ay nags-scale kapag nagbago ang laki ng font ng system, habang ang dp — ay hindi. sp ay ginagamit lamang para sa teksto, dp — para sa lahat ng iba pang laki ng elemento. Factor ng conversion: sp = dp × FONT_SCALE.
Hindi. Ang mga distansya, taas ng button, lapad ng card ay dapat itakda sa dp. Ang paggamit ng sp para sa distansya ay nagdudulot ng hindi natural na paglaki ng elemento kapag pinalaki ang font at maaaring lumampas sa hangganan ng screen.
Buksan ang Settings > Display > Font size at itakda ang maximum value (Largest). Ilunsad ang app at suriin na ang lahat ng teksto ay nababasa, ang mga elemento ay hindi nagsasapawan, at ang mga button ay hindi lumalampas sa hangganan ng screen. Para sa automation, gamitin ang Espresso kasama ang UiAutomator.
Inirerekomenda ng Material Design ang minimum na laki na 11sp para sa labelSmall. Para sa pangunahing teksto — mula 14sp (bodyMedium) hanggang 16sp (bodyLarge). Ang mga laki na mas maliit sa 11sp ay hindi inirerekomenda dahil nagiging hindi nababasa sa mga device na may mataas na pixel density.
Ang teksto ay ipapakita sa nakapirming laki anuman ang mga setting ng font ng system. Ang mga user na may pinalaking font ay hindi komportableng makakabasa ng ganoong teksto. Lumalabag ito sa mga kinakailangan ng WCAG accessibility at maaaring maging dahilan ng pagtanggi sa app sa Google Play.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din