← Назад к вопросам

Что такое sp?

1.0 Junior🔥 201 комментариев
#UI и вёрстка

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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Редко, спец. случаиНет
DPPadding, 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 критично для доступности:

  1. Пожилые люди часто увеличивают размер шрифта в системе
  2. Люди с нарушениями зрения полагаются на масштабирование текста
  3. Квадрат масштабирования текста в 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.