sp — Scale-independent Pixels, a szöveg mértékegysége Androidban, amely figyelembe veszi a betűméret beállításait az eszközön. A dp-vel ellentétben az sp a rendszer betűméretével együtt skálázódik, biztosítva a felületek hozzáférhetőségét. A cikk elmagyarázza az sp és dp közötti különbséget, bemutatja a textSize beállítását XML-ben és Kotlinban, valamint feltárja a tipográfiával való munka legjobb gyakorlatait Androidban.
Főbb pontok
sp (scale-independent pixel) — a betűméret mértékegysége Androidban, amely automatikusan skálázódik a felhasználó rendszerbeállításai szerint. Amikor az eszköz tulajdonosa megnöveli a betűméretet a beállításokban, az sp értékekkel rendelkező elemek arányosan nőnek. Ez biztosítja a felület hozzáférhetőségét a gyenge látású emberek számára.
Alap arány: 1 sp = 1 dp normál betűskálánál 1.0 (normal). Ha a felhasználó a Large (1.15×) betűt állítja be, 16 sp 18.4 fizikai pixellé alakul. Small (0.85×) betűméretnél ugyanaz a 16 sp 13.6 px lesz. A skálázási mechanizmus a Settings.System.FONT_SCALE segítségével az Android Framework szintjén vezérelhető.
A Google Material Design Guidelines szerint a szöveget kizárólag sp-ben kell beállítani. Kivételt képeznek a rögzített címkék olyan komponensekben, ahol a méret kritikus az elrendezés szempontjából (pl. szöveg a rögzített magasságú gombokon belül). Ilyen esetekben a dp használata ajánlott kézi hozzáférhetőség-ellenőrzéssel.
A különbség sp és dp között — az egyik leggyakoribb kérdés az Android-fejlesztői interjúkon és a valós code review-kban. Mindkét egység a density-independent pixelhez kapcsolódik (160 dpi = 1 dp = 1 px mdpi képernyőn), de eltérően viselkednek a rendszer betűméretének változásakor.
| Jellemző | sp | dp |
|---|---|---|
| Cél | Szöveg mérete | Elemek mérete, távolságok, szélesség, magasság |
| Skálázás betűvel | Igen (scale factor) | Nem |
| Skálázás sűrűséggel | Igen | Igen |
| API beállításhoz | android:textSize | android:layout_width, layout_height, padding, margin |
| Material Design Token | typescale | spacing, sizing |
A gyakorlatban hiba — dp használata szöveghez. Ha a szöveg dp-ben van beállítva, nem skálázódik a betű növelésekor, ami elérhetetlenné teszi a felületet a gyenge látású felhasználók számára. Az ellenkező hiba — sp használata gombmagassághoz vagy távolságokhoz: a betű növelésekor a gomb „feldagadhat", elrontva az elrendezést.
Az sp skálázása az Android Framework szintjén a TypedValue osztályban van megvalósítva. Az átszámítási képlet: sp = dp × scaledDensity, ahol a scaledDensity a skála együtthatója, amely figyelembe veszi mind a képernyő sűrűségét, mind a felhasználó betűbeállítását.
// ScaledDensity programozott lekérése Kotlinban
val scaledDensity = with(context.resources) {
displayMetrics.scaledDensity
}
// Sp konvertálása px-be
fun spToPx(sp: Float, context: Context): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
sp,
context.resources.displayMetrics
)
}
// Px konvertálása sp-be
fun pxToSp(px: Float, context: Context): Float {
return px / context.resources.displayMetrics.scaledDensity
}A TypedValue.applyDimension metódus — az egyetlen helyes módja az sp pixellé konvertálásának futásidőben. A közvetlen szorzás scaledDensity-vel kevésbé megbízható, mert nem kezeli a szélsőséges eseteket (nulla értékek, túlcsordulás). A scaledDensity a Settings > Display > Font size betűbeállításainak megváltoztatásakor változik.
Az Android öt előre beállított betűskála-szintet kínál: Small (0.85×), Default (1.0×), Large (1.15×), Largest (1.3×) és egy további Very Large (>1.3×) szintet Android 14+-ban. Az eszközgyártók (Samsung, Xiaomi) saját szinteket adnak hozzá — akár 2.0×-ig. A szöveg minimális mérete sp-ben soha nem garantál rögzített pixelszámot.
XML-ben az sp kizárólag az android:textSize attribútumban használatos. Az összes többi méret — width, height, padding, margin, elevation — dp-ben van beállítva. A szabály egyszerű: ha egy elem szöveget jelenít meg — a mérete sp-ben, ha egy elem geometriát határoz meg — a mérete dp-ben.
<!-- TextView elrendezés textSize sp-vel -->
<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 erőforrások használata -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/text_body_large" />Ajánlott a szöveg méreteit a dimens.xml fájlba kiszervezni. Ez leegyszerűsíti a tipográfia karbantartását, lehetővé teszi a méretek felülírását különböző képernyőkonfigurációkhoz, és egységességet biztosít az egész alkalmazásban.
<!-- 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>A Material Design Type Scale 13 méretszintet foglal magában — 11sp-től a kis címkék számára 57sp-ig a nagy megjelenítési címsorokhoz. Az Android projektek általában 8–10 szintet használnak. Minden értéknek az 1sp többszörösének kell lennie — a tört értékek (15.5sp) rontják a renderelést a szubpixel pozicionálás miatt.
A modern Android-fejlesztésben a szöveget ritkán állítják be közvetlenül a textSize-on keresztül sp-ben. Ehelyett a MaterialTheme.typography rendszert használják, ahol minden stílus előre meghatározott, és tartalmazza a méretet, súlyt, sorközt és a betűközt.
// Egyéni tipográfia a Typography API-n keresztül
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
)
)A .sp kiterjesztő függvény a Jetpack Compose-ban automatikusan scale-independent pixelekké alakul. A rendszer betűméretének változásakor a Compose újraszámolja a fontSize, lineHeight és spacing értékeket az új scaledDensity szerint. A TextUnit (az sp-t reprezentáló osztály) garantálja, hogy a szöveg skálázódik, a távolságok viszont nem.
A Jetpack Compose-ban az sp-t a TextUnit típus képviseli, amely nem használható véletlenül elemek méretezésére. A Kotlin fordító hibát jelez, ha a TextUnit oda kerül, ahol Dp-t vár. Ez kiküszöböli a helytelen skálázással kapcsolatos hibák egész osztályát.
// TextUnit Compose-ban — biztonságos munka sp-vel
@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
)
}
}
// FontSize explicit beállítása sp-ben
Text(
text = "Egyéni méret",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.primary
)A Compose-ban nincs közvetlen megfelelője az XML android:textSize attribútumnak — a szöveg mérete a TextStyle.fontSize-on keresztül állítható be. A MaterialTheme.typography rendszer előre meghatározott stílusokat nyújt, amelyek megfelelnek a Material Design Type Scale-nek. Ha egyéni méretre van szükség, a 20.sp literál használatos — a nyelv garantálja, hogy ez TextUnit, nem Dp.
Az sp helyes használata — egy hozzáférhető Android alkalmazás alapja. Az alábbiakban a Google Material Design és az Android Developers Guide ajánlásain alapuló szabályok találhatók.
A hozzáférhetőség fő szabálya: a felhasználónak lehetőséget kell adni a betűméret növelésére a funkcionalitás elvesztése nélkül. Ha az alkalmazás helyesen működik 1.3×-es betűskálán, átmegy az alapvető hozzáférhetőségi teszteken. A Google Play elutasíthatja az alkalmazást, ha a textSize dp-ben van beállítva és a felület nem skálázódik.
Gyakran Ismételt Kérdések
sp (scale-independent pixel) skálázódik a rendszer betűméretének változásakor, míg a dp — nem. sp csak szöveghez használatos, dp — az elemek összes többi méretéhez. Átszámítási tényező: sp = dp × FONT_SCALE.
Nem. A távolságokat, gombmagasságot, kártyák szélességét dp-ben kell beállítani. Az sp használata távolságokhoz azt eredményezi, hogy a betű növelésekor az elemek természetellenesen nőnek, és túlléphetik a képernyő határait.
Nyissa meg a Settings > Display > Font size menüt, és állítsa be a maximális értéket (Largest). Indítsa el az alkalmazást, és ellenőrizze, hogy az összes szöveg olvasható, az elemek nem fedik egymást, és a gombok nem lépik át a képernyő határait. Az automatizáláshoz használja az Espresso-t az UiAutomator-ral.
A Material Design minimális méretként 11sp-t ajánl a labelSmall számára. A fő szöveghez — 14sp (bodyMedium)-től 16sp (bodyLarge)-ig. A 11sp-nél kisebb méretek nem ajánlottak, mert olvashatatlanná válnak a magas pixelsűrűségű eszközökön.
A szöveg rögzített méretben jelenik meg a rendszer betűbeállításaitól függetlenül. A megnövelt betűméretű felhasználók nem tudják kényelmesen olvasni az ilyen szöveget. Ez sérti a WCAG hozzáférhetőségi követelményeit, és az alkalmazás Google Play-beli elutasításához vezethet.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is