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

Что такое dp?

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

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

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

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

dp (Density-independent Pixel)

Определение

dp (или dip — Density-independent Pixel) — это пиксель, независимый от плотности экрана. Это абстрактная единица измерения, которая автоматически масштабируется в зависимости от плотности экрана устройства.

Почему dp, а не пиксели

Если использовать обычные пиксели (px):

  • На экране с плотностью 160 dpi кнопка в 48px будет одного размера
  • На экране с плотностью 320 dpi она будет в два раза меньше (диагонально)
  • Это произойдёт при одинаковом физическом расстоянии от глаза

dp решает эту проблему:

1 dp = 1 пиксель на экране с плотностью 160 dpi (базовая)

Формула преобразования

пиксели = dp × (плотность / 160)

Примеры:

  • mdpi (160 dpi): 48 dp = 48 px
  • hdpi (240 dpi): 48 dp = 72 px
  • xhdpi (320 dpi): 48 dp = 96 px
  • xxhdpi (480 dpi): 48 dp = 144 px

Плотности экранов Android

DensitydpiМножительПримеры устройств
ldpi1200.75Старые телефоны
mdpi1601.0Базовая (Google Pixel 4a)
hdpi2401.5Стандартные телефоны
xhdpi3202.0Samsung Galaxy S10
xxhdpi4803.0Samsung Galaxy S20
xxxhdpi6404.0Флагманы

Использование в коде

В XML разметке:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <Button
        android:id="@+id/button"
        android:layout_width="100dp"
        android:layout_height="48dp"
        android:text="Тап меня" />
    
    <ImageView
        android:layout_width="72dp"
        android:layout_height="72dp"
        android:src="@drawable/ic_user" />
        
</LinearLayout>

В коде (Java/Kotlin):

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // Конвертировать dp в пиксели
        val dpValue = 48
        val pixels = dpToPx(dpValue)
        
        // Использовать для View
        val view = View(this).apply {
            layoutParams = ViewGroup.LayoutParams(
                pixels,  // ширина
                pixels   // высота
            )
        }
    }
    
    private fun dpToPx(dp: Int): Int {
        return (dp * resources.displayMetrics.density).toInt()
    }
}

Более удобно — через расширение:

val Int.dp: Int
    get() = (this * Resources.getSystem().displayMetrics.density).toInt()

val Int.sp: Int
    get() = (this * Resources.getSystem().displayMetrics.scaledDensity).toInt()

// Использование
val width = 48.dp  // автоматически преобразуется
val height = 48.dp
val textSize = 14.sp

Другие единицы

sp (Scale-independent Pixel) — для текста:

<TextView
    android:textSize="14sp"
    android:layout_margin="8dp" />

px (Pixel) — избегать в UI разработке:

// ❌ НИКОГДА
android:layout_width="96px"

// ✅ ВСЕГДА
android:layout_width="48dp"

Material Design guidelines

Google рекомендует:

  • Минимальный размер touch target: 48dp × 48dp
  • Стандартный отступ: 16dp
  • Маленький отступ: 8dp
  • Иконки: 24dp (стандартные), 40dp (touch targets)
  • Текст body: 14sp
  • Heading: 18-28sp
Box(
    modifier = Modifier
        .padding(16.dp)  // отступы
        .size(48.dp)     // размер
        .clip(CircleShape)
        .background(Color.Blue)
)

Почему это важно

  1. Читаемость — текст выглядит одинаково на всех экранах
  2. Доступность — sensorically приемлемые размеры кнопок
  3. Консистентность — интерфейс выглядит единообразно
  4. Масштабируемость — один дизайн работает на всех устройствах

Итог

dp — это магический инструмент, который скрывает разнообразие Android экранов и позволяет создавать приложения, которые выглядят хорошо на любом устройстве. Всегда используйте dp для размеров UI элементов и sp для текста.