Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
SP (Scalable Pixels) в Android разработке
SP (Scalable Pixels) — это единица измерения размера шрифта в Android, которая учитывает как плотность пикселей (dpi) устройства, так и пользовательские настройки размера текста в системе.
Основная формула
SP = DP * (SystemTextScale / 100)
Где SystemTextScale — это пользовательская настройка размера текста (обычно от 70% до 200%).
Отличие от DP и PX
PX (Pixels) Абсолютная единица — реальные пиксели экрана. Не масштабируется:
<TextView
android:textSize="16px"
android:text="Текст" />
На разных устройствах текст будет выглядеть по-разному — на hdpi экран будет меньше, чем на ldpi.
DP (Density-Independent Pixels) Относительная единица, учитывает только плотность экрана, но НЕ учитывает пользовательские настройки:
<TextView
android:textSize="16dp"
android:text="Текст" />
Но если пользователь изменит размер шрифта в системных настройках, размер текста НЕ изменится.
SP (Scalable Pixels) Учитывает ВСЁ — и плотность экрана, и пользовательские настройки размера текста:
<TextView
android:textSize="16sp"
android:text="Текст" />
Это рекомендуемая единица для размера шрифта в официальной документации Google.
Практический пример
Допустим, пользователь установил размер текста на 120% в системных настройках:
С PX:
<TextView android:textSize="16px" /> <!-- Всегда 16 пикселей, игнорирует настройки -->
Результат: текст будет меньше, чем ожидает пользователь.
С DP:
<TextView android:textSize="16dp" /> <!-- Масштабируется по DPI, но игнорирует системные настройки -->
Результат: текст масштабируется по экрану, но всё ещё игнорирует пользовательские настройки.
С SP (правильно):
<TextView android:textSize="16sp" /> <!-- Масштабируется по DPI И системным настройкам -->
Результат: текст будет 16 * 1.2 = 19.2 sp эффективно.
Таблица соответствия
| Единица | Для чего | Масштабирование |
|---|---|---|
| PX | Редко, спец. случаи | Нет |
| DP | Padding, margins, размеры элементов | По DPI |
| SP | Размер шрифта (текста) | По DPI + системные настройки |
Пример в коде (Kotlin + Compose)
// Material Design рекомендует:
import androidx.compose.material3.Text
import androidx.compose.ui.unit.sp
@Composable
fun MyScreen() {
Text(
text = "Заголовок",
fontSize = 24.sp // SP для текста!
)
Text(
text = "Описание",
fontSize = 16.sp
)
}
Пример в XML (Legacy)
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp"> <!-- DP для отступов! -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="Заголовок" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="Описание" />
</LinearLayout>
Доступность (Accessibility)
Использование SP критично для доступности:
- Пожилые люди часто увеличивают размер шрифта в системе
- Люди с нарушениями зрения полагаются на масштабирование текста
- Квадрат масштабирования текста в Android может быть от 0.85х до 1.15х
// Проверка текущего масштаба (редко нужно)
val scaledDensity = context.resources.displayMetrics.scaledDensity
val textSize = 16 * scaledDensity // Реальный размер в пикселях
Best Practices
Правило:
- DP — для расстояний, отступов, размеров элементов
- SP — ВСЕГДА для размера шрифта
- PX — крайне редко, только для специальных случаев (рисование на Canvas)
<!-- ✅ ПРАВИЛЬНО -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textSize="16sp"
android:lineSpacingMultiplier="1.2sp" />
<!-- ❌ НЕПРАВИЛЬНО -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16px"
android:textSize="16dp" />
Вывод
SP — это критическая единица для текста в Android, которая обеспечивает правильное масштабирование с учётом пользовательских настроек доступности. Всегда используйте SP для размера шрифта, никогда DP или PX.