sp: ano ito, nags-scale na pixel para sa teksto sa Android

May-akda: IT Sectr Nai-publish: 2026-02-25 Oras ng pagbabasa: 9 min

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 — yunit para sa teksto, na nags-scale sa mga setting ng system font ng user
  • dp — yunit para sa laki ng mga elemento, hindi tumutugon sa pagbabago ng laki ng font
  • Pagkakaiba ng sp at dp: sp = dp × scaleFactor, kung saan ang scaleFactor ay nakadepende sa mga setting ng font
  • textSize sa XML ay itinatakda sa pamamagitan ng sp: android:textSize="16sp"
  • Material Design ay nagrerekomenda ng typography step mula 12sp hanggang 34sp para sa mga heading

Ano ang sp sa Android?

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.

sp vs dp: mga pangunahing pagkakaiba

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.

Katangianspdp
LayuninLaki ng tekstoLaki ng elemento, distansya, lapad, taas
Pag-scale sa fontOo (scale factor)Hindi
Pag-scale sa densityOoOo
API para sa pagtatakdaandroid:textSizeandroid:layout_width, layout_height, padding, margin
Material Design Tokentypescalespacing, 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.

Paano gumagana ang pag-scale ng sp

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.

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

Mga coefficient ng pag-scale

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.

Paggamit ng sp sa XML

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.

Batayang halimbawa ng textSize sa XML

xml
<!-- 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.

dimens.xml na may typographic token

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>

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.

Pag-configure ng typography sa pamamagitan ng Kotlin

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.

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

sp sa Jetpack Compose

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.

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

Mga pinakamahusay na kasanayan sa pagtatrabaho sa sp

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.

  • Palaging gumamit ng sp para sa teksto — huwag kailanman itakda ang textSize sa dp o px, kung hindi ang mga user na may pinalaking font ay hindi makakabasa ng interface
  • Gumamit ng dp para sa mga container — ang taas ng button, distansya at lapad ng card ay dapat nasa dp, kung hindi sa malaking font ang mga elemento ay maaaring mag-overlap
  • Ilipat ang mga laki sa dimens.xml — ang sentralisadong imbakan ng typographic token ay pinapasimple ang refactoring at suporta sa dark theme
  • Huwag gumamit ng sp na mas maliit sa 12sp — ang teksto na may mas maliit na laki ay nagiging hindi nababasa sa mga device na may mataas na PPI at sa karaniwang font
  • Subukan sa maximum na scale ng font — i-activate sa mga setting ng device ang pinakamalaking font at suriin na ang interface ay hindi nasisira

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

Paano naiiba ang sp sa dp?

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.

Maaari bang gamitin ang sp para sa mga distansya?

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.

Paano suriin na ang app ay gumagana nang tama sa sp?

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.

Ano ang minimum na pinapayagang laki ng teksto sa sp?

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.

Ano ang mangyayari kung itatakda ko ang textSize sa dp?

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

  • sp — yunit ng pagsukat ng font sa Android, nags-scale sa mga setting ng user sa pamamagitan ng FONT_SCALE
  • dp — yunit para sa laki ng elemento, hindi tumutugon sa pagbabago ng laki ng font
  • textSize sa XML ay itinatakda sa pamamagitan ng android:textSize="16sp", lahat ng iba pang laki — sa dp
  • MaterialTheme.typography sa Jetpack Compose ay gumagamit ng TextUnit (.sp) para sa kaligtasan ng uri
  • dimens.xml — sentralisadong imbakan ng typographic token para sa pagkakapare-pareho
  • Minimum na laki ng teksto — 11sp, inirerekomenda para sa body — 14–16sp
  • Pagsubok sa maximum na scale ng font — mandatoryong yugto ng pagsusuri ng accessibility

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.

Pag-usapan ang proyekto

Basahin din