sp — Scale-independent Pixels, Android-də mətn ölçüsü vahidi, cihazdaki şrift ölçüsü parametrlərini nəzərə alır. dp-dən fərqli olaraq, sp sistem şrift ölçüsü ilə birlikdə miqyaslanır, interfeyslərin əlçatanlığını təmin edir. Məqalə sp və dp arasındakı fərqi izah edir, XML və Kotlin-də textSize konfiqurasiyasını göstərir, həmçinin Android-də tipoqrafiya ilə işin ən yaxşı təcrübələrini açıqlayır.
Əsas
sp (scale-independent pixel) — Android-də şrift ölçüsü vahidi, avtomatik olaraq istifadəçinin sistem parametrlərinə uyğun miqyaslanır. Cihaz sahibi parametrlərdə şrift ölçüsünü artırdıqda, sp dəyərləri olan bütün elementlər mütənasib şəkildə böyüyür. Bu, zəif görmə qabiliyyəti olan insanlar üçün interfeysin əlçatanlığını təmin edir.
Əsas nisbət: 1 sp = 1 dp standart şrift miqyası 1.0 (normal) olduqda. İstifadəçi Large (1.15×) şriftini təyin edərsə, 16 sp 18.4 fiziki pikselə çevrilir. Small (0.85×) şrift ölçüsündə eyni 16 sp 13.6 px olacaq. Miqyaslama mexanizmi Android Framework səviyyəsində Settings.System.FONT_SCALE vasitəsilə idarə olunur.
Google Material Design Guidelines-ə görə, mətn yalnız sp ilə təyin edilməlidir. İstisna — ölçüsünün komponent düzülüşü üçün kritik olduğu sabit etiketlərdir (məsələn, sabit hündürlükdə düymələrin içindəki mətn). Belə hallarda əlçatanlığın əl ilə idarə olunması ilə dp istifadə etmək tövsiyə olunur.
sp və dp arasındakı fərq — Android developerləri üçün müsahibələrdə və real code review-lərdə ən çox rast gəlinən suallardan biridir. Hər iki vahid density-independent pikselə bağlıdır (160 dpi = 1 dp = 1 px mdpi ekranda), lakin sistem şrift ölçüsü dəyişdikdə fərqli davranır.
| Xüsusiyyət | sp | dp |
|---|---|---|
| Təyinat | Mətn ölçüsü | Element ölçüləri, boşluqlar, en, hündürlük |
| Şriftə görə miqyaslanma | Bəli (scale factor) | Xeyr |
| Sıxlığa görə miqyaslanma | Bəli | Bəli |
| Quraşdırma üçün API | android:textSize | android:layout_width, layout_height, padding, margin |
| Material Design Token | typescale | spacing, sizing |
Praktikada səhv — mətn üçün dp istifadə etməkdir. Əgər mətn dp ilə təyin edilibsə, şrift artırıldıqda miqyaslanmır, bu da interfeysi zəif görmə qabiliyyəti olan istifadəçilər üçün əlçatmaz edir. Əks səhv — düymə hündürlüyü və ya boşluqlar üçün sp istifadə etməkdir: şrift artırıldıqda düymə „şişə" bilər, düzülüşü pozaraq.
sp miqyaslanması Android Framework səviyyəsində TypedValue sinfində reallaşdırılıb. Yenidən hesablama düsturu: sp = dp × scaledDensity, burada scaledDensity həm ekran sıxlığını, həm də istifadəçinin şrift parametrini nəzərə alan miqyas əmsalıdır.
// Kotlin-də scaledDensity-in proqram əldə edilməsi
val scaledDensity = with(context.resources) {
displayMetrics.scaledDensity
}
// sp-ni px-ə çevirmək
fun spToPx(sp: Float, context: Context): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
sp,
context.resources.displayMetrics
)
}
// px-i sp-yə çevirmək
fun pxToSp(px: Float, context: Context): Float {
return px / context.resources.displayMetrics.scaledDensity
}TypedValue.applyDimension metodu — run-time-da sp-ni pikselə çevirməyin yeganə düzgün yoludur. scaledDensity-ə birbaşa vurma daha az etibarlıdır, çünki edge-case-ləri (sıfır dəyərlər, daşma) idarə etmir. scaledDensity Settings > Display > Font size vasitəsilə şrift parametrləri dəyişdikdə dəyişir.
Android beş əvvəlcədən təyin edilmiş şrift miqyası səviyyəsi təqdim edir: Small (0.85×), Default (1.0×), Large (1.15×), Largest (1.3×) və Android 14+-da Very Large (>1.3×) əlavə səviyyə. Cihaz istehsalçıları (Samsung, Xiaomi) öz səviyyələrini əlavə edir — 2.0×-ə qədər. sp-də mətnin minimal ölçüsü heç vaxt sabit piksel sayına zəmanət vermir.
XML-də sp yalnız android:textSize atributunda istifadə olunur. Bütün digər ölçülər — width, height, padding, margin, elevation — dp ilə təyin edilir. Qayda sadədir: əgər element mətn göstərirsə — ölçüsü sp, əgər element həndəsəni müəyyən edirsə — ölçüsü dp.
<!-- textSize sp ilə TextView düzülüşü -->
<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 resurslarından istifadə -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/text_body_large" />Mətn ölçülərini dimens.xml faylına çıxarmaq tövsiyə olunur. Bu, tipoqrafiyanın saxlanmasını asanlaşdırır, müxtəlif ekran konfiqurasiyaları üçün ölçüləri dəyişməyə imkan verir və bütün tətbiqdə vahidliyi təmin edir.
<!-- 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 ölçü səviyyəsi əhatə edir — kiçik etiketlər üçün 11sp-dən böyük displey başlıqları üçün 57sp-ə qədər. Android layihələri adətən 8–10 səviyyə istifadə edir. Bütün dəyərlər 1sp-ə qat olmalıdır — kəsr dəyərlər (15.5sp) subpiksel yerləşdirmə səbəbindən renderi pisləşdirir.
Müasir Android inkişafında mətn nadir hallarda sp-də textSize vasitəsilə birbaşa təyin edilir. Bunun əvəzinə hər bir stilin əvvəlcədən müəyyən edildiyi və ölçü, çəki, sətirarası boşluq və letter-spacing daxil olduğu MaterialTheme.typography sistemindən istifadə olunur.
// Typography API vasitəsilə xüsusi tipoqrafiya
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 genişləndirmə funksiyası avtomatik olaraq scale-independent pikselə çevrilir. Sistem şrift ölçüsü dəyişdikdə Compose fontSize, lineHeight və spacing-i yeni scaledDensity-ə uyğun yenidən hesablayır. TextUnit (sp-ni təmsil edən sinif) mətnin miqyaslanmasına, boşluqların isə miqyaslanmamasına zəmanət verir.
Jetpack Compose-da sp TextUnit tipi ilə təmsil olunur, təsadüfən element ölçüləri üçün istifadə edilə bilməz. Kotlin kompilyatoru TextUnit-in Dp gözlənilən yerə ötürülməsi halında xəta verir. Bu, yanlış miqyaslama ilə bağlı bütün səhv sinfini aradan qaldırır.
// Compose-da TextUnit — sp ilə təhlükəsiz iş
@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-in sp-də açıq təyin edilməsi
Text(
text = "Xüsusi ölçü",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.primary
)Compose-da XML android:textSize atributunun birbaşa ekvivalenti yoxdur — mətn ölçüsü TextStyle.fontSize vasitəsilə təyin edilir. MaterialTheme.typography sistemi Material Design Type Scale-ə uyğun gələn əvvəlcədən müəyyən edilmiş stillər təqdim edir. Xüsusi ölçü lazım olduqda 20.sp literallı istifadə olunur — dil bunun TextUnit olduğuna, Dp olmadığına zəmanət verir.
sp-nin düzgün istifadəsi — əlçatan Android tətbiqinin əsasıdır. Aşağıda Google Material Design və Android Developers Guide tövsiyələrinə əsaslanan qaydalar toplanıb.
Əlçatanlığın əsas qaydası: istifadəçi funksionallığı itirmədən şrifti artırmaq imkanına malik olmalıdır. Tətbiq 1.3× şrift miqyasında düzgün işləyirsə, əsas əlçatanlıq testlərindən keçəcək. Google Play textSize dp-də təyin edilibsə və interfeys miqyaslanmırsa, tətbiqi rədd edə bilər.
Tez-tez verilən suallar
sp (scale-independent pixel) sistem şrift ölçüsü dəyişdikdə miqyaslanır, dp isə — yox. sp yalnız mətn üçün, dp — elementlərin bütün digər ölçüləri üçün istifadə olunur. Yenidən hesablama əmsalı: sp = dp × FONT_SCALE.
Xeyr. Boşluqlar, düymə hündürlüyü, kartların eni dp ilə təyin edilməlidir. Boşluqlar üçün sp istifadə etdikdə şrift artırıldıqda elementlər qeyri-təbii böyüyür və ekran sərhədlərindən kənara çıxa bilər.
Settings > Display > Font size açın və maksimum dəyəri (Largest) qoyun. Tətbiqi işə salın və bütün mətnin oxunaqlı olduğunu, elementlərin üst-üstə düşmədiyini və düymələrin ekran sərhədlərindən kənara çıxmadığını yoxlayın. Avtomatlaşdırma üçün Espresso-nu UiAutomator ilə istifadə edin.
Material Design labelSmall üçün minimum ölçü 11sp tövsiyə edir. Əsas mətn üçün — 14sp (bodyMedium)-dən 16sp (bodyLarge)-ə qədər. 11sp-dən kiçik ölçülər tövsiyə edilmir, çünki yüksək piksel sıxlığı olan cihazlarda oxunmaz olurlar.
Mətn şriftin sistem parametrlərindən asılı olmayaraq sabit ölçüdə göstəriləcək. Böyüdülmüş şrifti olan istifadəçilər belə mətni rahat oxuya bilməyəcək. Bu, WCAG əlçatanlıq tələblərini pozur və Google Play-də tətbiqin rədd edilməsinə səbəb ola bilər.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun