sp: bu nima, Android da matn uchun masshtablanadigan piksellar

Muallif: IT Sectr Nashr etilgan: 2026-02-25 O'qish vaqti: 9 daq

sp — Scale-independent Pixels, Android-da matn o'lchov birligi, qurilmadagi shrift o'lchami sozlamalarini hisobga oladi. dp dan farqli o'laroq, sp tizim shrift o'lchami bilan birga masshtablanadi, interfeyslarning foydalanish imkoniyatini ta'minlaydi. Maqola sp va dp o'rtasidagi farqni tushuntiradi, XML va Kotlin da textSize sozlashni ko'rsatadi, shuningdek Android da tipografiya bilan ishlashning eng yaxshi amaliyotlarini ochib beradi.

Asosiy

  • sp — matn uchun birlik, foydalanuvchining tizim shrift sozlamalariga mos masshtablanadi
  • dp — element o'lchamlari uchun birlik, shrift o'lchami o'zgarishiga reaksiya bermaydi
  • sp va dp farqi: sp = dp × scaleFactor, scaleFactor shrift sozlamalariga bog'liq
  • XML da textSize sp orqali o'rnatiladi: android:textSize="16sp"
  • Material Design sarlavhalar uchun 12sp dan 34sp gacha tipografiya qadamini tavsiya qiladi

Android da sp nima?

sp (scale-independent pixel) — Android da shrift o'lchami o'lchov birligi, avtomatik ravishda foydalanuvchining tizim sozlamalariga mos masshtablanadi. Qurilma egasi sozlamalarda shrift o'lchamini oshirganda, sp qiymatli barcha elementlar mutanosib ravishda kattalashadi. Bu zaif ko'rish qobiliyatiga ega odamlar uchun interfeysning foydalanish imkoniyatini ta'minlaydi.

Asosiy nisbat: 1 sp = 1 dp standart shrift masshtabi 1.0 (normal) da. Agar foydalanuvchi Large (1.15×) shriftini o'rnatsa, 16 sp 18.4 fizik pikselga aylanadi. Small (0.85×) shrift o'lchamida xuddi shu 16 sp 13.6 px bo'ladi. Masshtablash mexanizmi Android Framework darajasida Settings.System.FONT_SCALE orqali boshqariladi.

Google Material Design Guidelines ga ko'ra, matn faqat sp da o'rnatilishi kerak. Istisno — o'lchami komponent joylashuvi uchun muhim bo'lgan qattiq yorliqlar (masalan, qattiq balandlikdagi tugmalar ichidagi matn). Bunday hollarda qo'lda foydalanish imkoniyati nazorati bilan dp dan foydalanish tavsiya etiladi.

sp vs dp: asosiy farqlar

sp va dp o'rtasidagi farq — Android dasturchilari uchun intervyularda va real code review larda eng keng tarqalgan savollardan biridir. Ikkala birlik density-independent pikselga bog'liq (160 dpi = 1 dp = 1 px mdpi ekranda), lekin tizim shrift o'lchami o'zgarganda turlicha harakat qiladi.

Xususiyatspdp
MaqsadMatn o'lchamiElement o'lchamlari, bo'shliqlar, kenglik, balandlik
Shrift bo'yicha masshtablanishHa (scale factor)Yo'q
Zichlik bo'yicha masshtablanishHaHa
O'rnatish uchun APIandroid:textSizeandroid:layout_width, layout_height, padding, margin
Material Design Tokentypescalespacing, sizing

Amalda xato — matn uchun dp ishlatish. Agar matn dp da o'rnatilgan bo'lsa, shrift kattalashganda masshtablanmaydi, bu interfeysni zaif ko'rish qobiliyatiga ega foydalanuvchilar uchun imkonsiz qiladi. Teskari xato — tugma balandligi yoki bo'shliqlar uchun sp ishlatish: shrift kattalashganda tugma „shishib" ketishi mumkin, joylashuvni buzib.

sp masshtablanishi qanday ishlaydi

sp masshtablanishi Android Framework darajasida TypedValue sinfida amalga oshirilgan. Qayta hisoblash formulasi: sp = dp × scaledDensity, bu yerda scaledDensity ham ekran zichligini, ham foydalanuvchining shrift sozlamasini hisobga oluvchi masshtab koeffitsiyenti.

kotlin
// Kotlin da scaledDensity ni dasturiy olish
val scaledDensity = with(context.resources) {
    displayMetrics.scaledDensity
}

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

// px ni sp ga aylantirish
fun pxToSp(px: Float, context: Context): Float {
    return px / context.resources.displayMetrics.scaledDensity
}

TypedValue.applyDimension metodi — runtime da sp ni pikselga aylantirishning yagona to'g'ri usuli. scaledDensity ga to'g'ridan-to'g'ri ko'paytirish kamroq ishonchli, chunki u chekka holatlarni (nol qiymatlar, to'lib ketish) boshqarmaydi. scaledDensity Settings > Display > Font size orqali shrift sozlamalari o'zgarganda o'zgaradi.

Masshtablash koeffitsiyentlari

Android beshta oldindan o'rnatilgan shrift masshtabi darajasini taqdim etadi: Small (0.85×), Default (1.0×), Large (1.15×), Largest (1.3×) va Android 14+ da Very Large (>1.3×) qo'shimcha daraja. Qurilma ishlab chiqaruvchilari (Samsung, Xiaomi) o'z darajalarini qo'shadilar — 2.0× gacha. sp dagi matnning minimal o'lchami hech qachon qat'iy piksel sonini kafolatlamaydi.

XML da sp dan foydalanish

XML da sp faqat android:textSize atributida qo'llaniladi. Barcha boshqa o'lchamlar — width, height, padding, margin, elevation — dp da o'rnatiladi. Qoida oddiy: agar element matn ko'rsatsa — uning o'lchami sp da, agar element geometriyani aniqlasa — o'lchami dp da.

XML da textSize asosiy namunasi

xml
<!-- textSize sp bilan TextView joylashuvi -->
<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 resurslaridan foydalanish -->
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="@dimen/text_body_large" />

Matn o'lchamlarini dimens.xml fayliga chiqarish tavsiya etiladi. Bu tipografiyani saqlashni osonlashtiradi, turli ekran konfiguratsiyalari uchun o'lchamlarni qayta yozishga imkon beradi va butun ilovada bir xillikni ta'minlaydi.

Tipografik tokenlar bilan dimens.xml

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 o'lcham darajasini o'z ichiga oladi — kichik yorliqlar uchun 11sp dan katta displey sarlavhalari uchun 57sp gacha. Android loyihalari odatda 8–10 darajadan foydalanadi. Barcha qiymatlar 1sp ga karrali bo'lishi kerak — kasr qiymatlar (15.5sp) subpiksel joylashuvi tufayli renderlashni yomonlashtiradi.

Kotlin orqali tipografiyani sozlash

Zamonaviy Android ishlab chiqishda matn kamdan-kam hollarda to'g'ridan-to'g'ri sp da textSize orqali o'rnatiladi. Buning o'rniga har bir uslub oldindan belgilangan va o'lcham, og'irlik, qatorlararo bo'shliq va letter-spacing ni o'z ichiga olgan MaterialTheme.typography tizimi ishlatiladi.

kotlin
// Typography API orqali maxsus tipografiya
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 da .sp kengaytma funksiyasi avtomatik ravishda scale-independent pikselga aylanadi. Tizim shrift o'lchami o'zgarganda, Compose fontSize, lineHeight va spacing ni yangi scaledDensity ga mos ravishda qayta hisoblaydi. TextUnit (sp ni ifodalovchi sinf) matnning masshtablanishiga, bo'shliqlarning esa masshtablanmasligiga kafolat beradi.

Jetpack Compose da sp

Jetpack Compose da sp TextUnit turi bilan ifodalanadi, u tasodifan element o'lchamlari uchun ishlatilmaydi. Kotlin kompilyatori TextUnit Dp kutilgan joyga uzatilsa xato beradi. Bu noto'g'ri masshtablash bilan bog'liq barcha xato sinfini yo'q qiladi.

kotlin
// Compose da TextUnit — sp bilan xavfsiz ishlash
@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 ni sp da aniq o'rnatish
Text(
    text = "Maxsus o'lcham",
    fontSize = 20.sp,
    fontWeight = FontWeight.Bold,
    color = MaterialTheme.colorScheme.primary
)

Compose da XML android:textSize atributining to'g'ridan-to'g'ri ekvivalenti yo'q — matn o'lchami TextStyle.fontSize orqali o'rnatiladi. MaterialTheme.typography tizimi Material Design Type Scale ga mos keladigan oldindan belgilangan uslublarni taqdim etadi. Agar maxsus o'lcham kerak bo'lsa, 20.sp literal ishlatiladi — til bu TextUnit ekanligiga, Dp emasligiga kafolat beradi.

sp bilan ishlashning eng yaxshi amaliyotlari

sp dan to'g'ri foydalanish — foydalanish mumkin bo'lgan Android ilovasining asosidir. Quyida Google Material Design va Android Developers Guide tavsiyalariga asoslangan qoidalar to'plangan.

  • Matn uchun doimo sp dan foydalaning — hech qachon textSize ni dp yoki px da o'rnatmang, aks holda kattalashtirilgan shriftli foydalanuvchilar interfeysni o'qiy olmaydi
  • Konteynerlar uchun dp dan foydalaning — tugmalar balandligi, bo'shliqlar va kartalar kengligi dp da bo'lishi kerak, aks holda katta shriftda elementlar bir-biriga yopishishi mumkin
  • O'lchamlarni dimens.xml ga chiqaring — tipografik tokenlarning markazlashtirilgan saqlanishi refaktoringni va qorong'u mavzu qo'llab-quvvatlashni osonlashtiradi
  • 12sp dan kichik sp ishlatmang — kichikroq o'lchamdagi matn yuqori PPI li qurilmalarda va standart shriftda o'qilmaydigan bo'ladi
  • Maksimal shrift masshtabida sinab ko'ring — qurilma sozlamalarida eng katta shriftni yoqing va interfeys buzilmasligini tekshiring

Foydalanish imkoniyatining asosiy qoidasi: foydalanuvchi funksionallikni yo'qotmasdan shriftni kattalashtirish imkoniyatiga ega bo'lishi kerak. Ilova 1.3× shrift masshtabida to'g'ri ishlasa, asosiy accessibility testlaridan o'tadi. Google Play textSize dp da o'rnatilgan va interfeys masshtablanmasa, ilovani rad etishi mumkin.

Tez-tez beriladigan savollar

sp dp dan qanday farq qiladi?

sp (scale-independent pixel) tizim shrift o'lchami o'zgarganda masshtablanadi, dp esa — yo'q. sp faqat matn uchun, dp — elementlarning barcha boshqa o'lchamlari uchun ishlatiladi. Qayta hisoblash koeffitsiyenti: sp = dp × FONT_SCALE.

Bo'shliqlar uchun sp ishlatish mumkinmi?

Yo'q. Bo'shliqlar, tugma balandligi, kartalar kengligi dp da o'rnatilishi kerak. Bo'shliqlar uchun sp ishlatish shrift kattalashganda elementlarning g'ayritabiiy o'sishiga va ekran chegaralaridan chiqib ketishiga olib keladi.

Ilovaning sp bilan to'g'ri ishlashini qanday tekshirish mumkin?

Settings > Display > Font size ni oching va maksimal qiymatni (Largest) o'rnating. Ilovani ishga tushiring va barcha matnning o'qilishi mumkinligini, elementlarning bir-biriga yopishmasligini va tugmalarning ekran chegaralaridan chiqmasligini tekshiring. Avtomatlashtirish uchun Espresso ni UiAutomator bilan ishlating.

Sp da minimal ruxsat etilgan matn o'lchami qancha?

Material Design labelSmall uchun minimal o'lcham 11sp ni tavsiya qiladi. Asosiy matn uchun — 14sp (bodyMedium) dan 16sp (bodyLarge) gacha. 11sp dan kichik o'lchamlar tavsiya etilmaydi, chunki yuqori piksel zichligidagi qurilmalarda o'qilmaydigan bo'ladi.

textSize ni dp da o'rnatsam nima bo'ladi?

Matn shriftning tizim sozlamalaridan qat'iy nazar qat'iy o'lchamda ko'rsatiladi. Kattalashtirilgan shriftli foydalanuvchilar bunday matnni qulay o'qiy olmaydi. Bu WCAG foydalanish imkoniyati talablarini buzadi va Google Play da ilovaning rad etilishiga sabab bo'lishi mumkin.

Xulosa

  • sp — Android da shrift o'lchov birligi, foydalanuvchi sozlamalariga mos FONT_SCALE orqali masshtablanadi
  • dp — element o'lchamlari uchun birlik, shrift o'lchami o'zgarishiga reaksiya bermaydi
  • textSize XML da android:textSize="16sp" orqali o'rnatiladi, qolgan barcha o'lchamlar — dp da
  • MaterialTheme.typography Jetpack Compose da turlar xavfsizligi uchun TextUnit (.sp) dan foydalanadi
  • dimens.xml — bir xillik uchun tipografik tokenlarning markazlashtirilgan saqlanishi
  • Minimal matn o'lchami — 11sp, body uchun tavsiya etilgan — 14–16sp
  • Sinov maksimal shrift masshtabida — foydalanish imkoniyati tekshiruvining majburiy bosqichi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing