sp: co to jest, skalowalne piksele dla tekstu w Androidzie

Autor: IT Sectr Opublikowano: 2026-02-25 Czas czytania: 9 min

sp — Scale-independent Pixels, jednostka miary tekstu w Androidzie, uwzględniająca ustawienia rozmiaru czcionki na urządzeniu. W przeciwieństwie do dp, sp skaluje się wraz z systemowym rozmiarem czcionki, zapewniając dostępność interfejsów. Artykuł wyjaśnia różnicę między sp a dp, pokazuje konfigurację textSize w XML i Kotlin, a także przedstawia najlepsze praktyki pracy z typografią w Androidzie.

Najważniejsze

  • sp — jednostka dla tekstu, skalowalna względem systemowych ustawień czcionki użytkownika
  • dp — jednostka dla rozmiarów elementów, nie reaguje na zmianę rozmiaru czcionki
  • Różnica sp i dp: sp = dp × scaleFactor, gdzie scaleFactor zależy od ustawień czcionki
  • textSize w XML ustawia się przez sp: android:textSize="16sp"
  • Material Design zaleca zakres typografii od 12sp do 34sp dla nagłówków

Czym jest sp w Androidzie?

sp (scale-independent pixel) — jednostka miary rozmiaru czcionki w Androidzie, która automatycznie skaluje się zgodnie z systemowymi ustawieniami użytkownika. Gdy właściciel urządzenia zwiększa rozmiar czcionki w ustawieniach, wszystkie elementy z wartościami w sp proporcjonalnie rosną. Zapewnia to dostępność interfejsu dla osób ze słabym wzrokiem.

Podstawowa zależność: 1 sp = 1 dp przy standardowej skali czcionki 1.0 (normal). Jeśli użytkownik ustawi czcionkę Large (1.15×), 16 sp zamienia się w 18.4 fizycznych piksela. Przy rozmiarze czcionki Small (0.85×) te same 16 sp staną się 13.6 px. Mechanizm skalowania jest zarządzany przez Settings.System.FONT_SCALE na poziomie Android Framework.

Według Google Material Design Guidelines, tekst powinien być ustawiany wyłącznie w sp. Wyjątkiem są stałe etykiety w komponentach, gdzie rozmiar jest krytyczny dla układu (np. tekst wewnątrz przycisków o stałej wysokości). W takich przypadkach zaleca się używanie dp z ręczną kontrolą dostępności.

sp vs dp: kluczowe różnice

Różnica między sp a dp — jeden z najczęstszych tematów pytań na rozmowach kwalifikacyjnych dla Android-developerów oraz w rzeczywistych code review. Obie jednostki są powiązane z density-independent pixel (160 dpi = 1 dp = 1 px na ekranie mdpi), ale zachowują się inaczej przy zmianie systemowego rozmiaru czcionki.

Charakterystykaspdp
PrzeznaczenieRozmiar tekstuRozmiary elementów, odstępy, szerokość, wysokość
Skalowanie względem czcionkiTak (scale factor)Nie
Skalowanie względem gęstościTakTak
API do ustawieniaandroid:textSizeandroid:layout_width, layout_height, padding, margin
Material Design Tokentypescalespacing, sizing

W praktyce błędem jest używanie dp dla tekstu. Jeśli tekst jest ustawiony w dp, nie skaluje się przy zwiększeniu czcionki, co czyni interfejs niedostępnym dla użytkowników ze słabym wzrokiem. Odwrotnym błędem jest używanie sp dla wysokości przycisku lub odstępów: przy zwiększeniu czcionki przycisk może się „rozdąć", psując układ.

Jak działa skalowanie sp

Skalowanie sp jest zaimplementowane na poziomie Android Framework w klasie TypedValue. Wzór przeliczeniowy: sp = dp × scaledDensity, gdzie scaledDensity to współczynnik skali uwzględniający zarówno gęstość ekranu, jak i ustawienie czcionki użytkownika.

kotlin
// Programowe uzyskanie scaledDensity w Kotlin
val scaledDensity = with(context.resources) {
    displayMetrics.scaledDensity
}

// Konwersja sp na px
fun spToPx(sp: Float, context: Context): Float {
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_SP,
        sp,
        context.resources.displayMetrics
    )
}

// Konwersja px na sp
fun pxToSp(px: Float, context: Context): Float {
    return px / context.resources.displayMetrics.scaledDensity
}

Metoda TypedValue.applyDimension — jedyny poprawny sposób konwersji sp na piksele w runtime. Bezpośrednie mnożenie przez scaledDensity jest mniej niezawodne, ponieważ nie obsługuje edge-case'ów (wartości zerowe, przepełnienie). scaledDensity zmienia się przy zmianie ustawień czcionki przez Settings > Display > Font size.

Współczynniki skalowania

Android udostępnia pięć predefiniowanych poziomów skali czcionki: Small (0.85×), Default (1.0×), Large (1.15×), Largest (1.3×) oraz dodatkowy poziom Very Large (>1.3×) w Android 14+. Producenci urządzeń (Samsung, Xiaomi) dodają własne poziomy — aż do 2.0×. Minimalny rozmiar tekstu w sp nigdy nie gwarantuje stałej liczby pikseli.

Używanie sp w XML

W XML sp jest używany wyłącznie w atrybucie android:textSize. Wszystkie pozostałe rozmiary — width, height, padding, margin, elevation — ustawia się w dp. Zasada jest prosta: jeśli element wyświetla tekst — jego rozmiar w sp, jeśli element określa geometrię — rozmiar w dp.

Podstawowy przykład textSize w XML

xml
<!-- Układ TextView z textSize w 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" />

<!-- Użycie zasobów dimens -->
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="@dimen/text_body_large" />

Zaleca się wyodrębnianie rozmiarów tekstu do pliku dimens.xml. Ułatwia to utrzymanie typografii, pozwala nadpisywać rozmiary dla różnych konfiguracji ekranu i zapewnia spójność w całej aplikacji.

dimens.xml z tokenami typograficznymi

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 zawiera 13 poziomów rozmiarów — od 11sp dla małych etykiet do 57sp dla dużych nagłówków wyświetlanych. Projekty Android zwykle używają 8–10 poziomów. Wszystkie wartości powinny być wielokrotnościami 1sp — wartości ułamkowe (15.5sp) pogarszają renderowanie z powodu subpikselowego pozycjonowania.

Konfiguracja typografii przez Kotlin

W nowoczesnym tworzeniu aplikacji Android tekst rzadko jest ustawiany bezpośrednio przez textSize w sp. Zamiast tego używa się systemu MaterialTheme.typography, gdzie każdy styl jest predefiniowany i zawiera rozmiar, wagę, odstępy między wierszami i letter-spacing.

kotlin
// Niestandardowa typografia przez 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
    )
)

Funkcja rozszerzająca .sp w Jetpack Compose automatycznie tłumaczy się na scale-independent pixels. Przy zmianie systemowego rozmiaru czcionki Compose przelicza fontSize, lineHeight i spacing zgodnie z nowym scaledDensity. TextUnit (klasa reprezentująca sp) gwarantuje, że tekst się skaluje, a odstępy — nie.

sp w Jetpack Compose

W Jetpack Compose sp jest reprezentowany przez typ TextUnit, który nie może być przypadkowo użyty do rozmiarów elementów. Kompilator Kotlin zgłasza błąd, jeśli TextUnit zostanie przekazany tam, gdzie oczekiwane jest Dp. Eliminuje to całą klasę błędów związanych z nieprawidłowym skalowaniem.

kotlin
// TextUnit w Compose — bezpieczna praca ze 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
        )
    }
}

// Jawne ustawienie fontSize w sp
Text(
    text = "Niestandardowy rozmiar",
    fontSize = 20.sp,
    fontWeight = FontWeight.Bold,
    color = MaterialTheme.colorScheme.primary
)

W Compose nie ma bezpośredniego odpowiednika atrybutu XML android:textSize — rozmiar tekstu ustawia się przez TextStyle.fontSize. System MaterialTheme.typography udostępnia predefiniowane style, które odpowiadają Material Design Type Scale. Jeśli potrzebny jest niestandardowy rozmiar, używa się literału 20.sp — język gwarantuje, że jest to TextUnit, a nie Dp.

Najlepsze praktyki pracy ze sp

Prawidłowe używanie sp — podstawa dostępnej aplikacji Android. Poniżej zebrano zasady oparte na rekomendacjach Google Material Design i Android Developers Guide.

  • Zawsze używaj sp dla tekstu — nigdy nie ustawiaj textSize w dp lub px, w przeciwnym razie użytkownicy z powiększoną czcionką nie będą mogli czytać interfejsu
  • Używaj dp dla kontenerów — wysokość przycisków, odstępy i szerokość kart powinny być w dp, w przeciwnym razie przy dużej czcionce elementy mogą na siebie nachodzić
  • Wyodrębniaj rozmiary do dimens.xml — scentralizowane przechowywanie tokenów typograficznych ułatwia refaktoryzację i obsługę ciemnego motywu
  • Nie używaj sp mniejszego niż 12sp — tekst mniejszego rozmiaru staje się nieczytelny na urządzeniach z wysokim PPI i przy standardowej czcionce
  • Testuj przy maksymalnej skali czcionki — włącz w ustawieniach urządzenia największą czcionkę i sprawdź, czy interfejs się nie psuje

Główna zasada dostępności: użytkownik powinien mieć możliwość zwiększenia czcionki bez utraty funkcjonalności. Jeśli aplikacja działa poprawnie przy skali czcionki 1.3×, przejdzie podstawowe testy accessibility. Google Play może odrzucić aplikację, jeśli textSize jest ustawiony w dp i interfejs nie skaluje się.

Często zadawane pytania

Czym różni się sp od dp?

sp (scale-independent pixel) skaluje się przy zmianie systemowego rozmiaru czcionki, a dp — nie. sp jest używane tylko dla tekstu, dp — dla wszystkich pozostałych rozmiarów elementów. Współczynnik przeliczeniowy: sp = dp × FONT_SCALE.

Czy można używać sp do odstępów?

Nie. Odstępy, wysokość przycisków, szerokość kart powinny być ustawiane w dp. Używanie sp do odstępów powoduje, że przy zwiększeniu czcionki elementy rosną nienaturalnie i mogą wychodzić poza granice ekranu.

Jak sprawdzić, czy aplikacja poprawnie działa ze sp?

Otwórz Settings > Display > Font size i ustaw maksymalną wartość (Largest). Uruchom aplikację i sprawdź, czy cały tekst jest czytelny, elementy nie nakładają się na siebie, a przyciski nie wychodzą poza granice ekranu. Do automatyzacji użyj Espresso z UiAutomator.

Jaki jest minimalny dopuszczalny rozmiar tekstu w sp?

Material Design zaleca minimalny rozmiar 11sp dla labelSmall. Dla głównego tekstu — od 14sp (bodyMedium) do 16sp (bodyLarge). Rozmiary mniejsze niż 11sp nie są zalecane, ponieważ stają się nieczytelne na urządzeniach z wysoką gęstością pikseli.

Co się stanie, jeśli ustawię textSize w dp?

Tekst będzie wyświetlany w stałym rozmiarze niezależnie od systemowych ustawień czcionki. Użytkownicy z powiększoną czcionką nie będą mogli komfortowo czytać takiego tekstu. Narusza to wymagania dostępności WCAG i może być powodem odrzucenia aplikacji w Google Play.

Podsumowanie

  • sp — jednostka miary czcionki w Androidzie, skalowalna względem ustawień użytkownika przez FONT_SCALE
  • dp — jednostka dla rozmiarów elementów, niereagująca na zmianę rozmiaru czcionki
  • textSize w XML ustawia się przez android:textSize="16sp", wszystkie pozostałe rozmiary — w dp
  • MaterialTheme.typography w Jetpack Compose używa TextUnit (.sp) dla bezpieczeństwa typów
  • dimens.xml — scentralizowane przechowywanie tokenów typograficznych dla spójności
  • Minimalny rozmiar tekstu — 11sp, zalecany dla body — 14–16sp
  • Testowanie przy maksymalnej skali czcionki — obowiązkowy etap sprawdzania dostępności

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również