Комментарии (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
| Density | dpi | Множитель | Примеры устройств |
|---|---|---|---|
| ldpi | 120 | 0.75 | Старые телефоны |
| mdpi | 160 | 1.0 | Базовая (Google Pixel 4a) |
| hdpi | 240 | 1.5 | Стандартные телефоны |
| xhdpi | 320 | 2.0 | Samsung Galaxy S10 |
| xxhdpi | 480 | 3.0 | Samsung Galaxy S20 |
| xxxhdpi | 640 | 4.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)
)
Почему это важно
- Читаемость — текст выглядит одинаково на всех экранах
- Доступность — sensorically приемлемые размеры кнопок
- Консистентность — интерфейс выглядит единообразно
- Масштабируемость — один дизайн работает на всех устройствах
Итог
dp — это магический инструмент, который скрывает разнообразие Android экранов и позволяет создавать приложения, которые выглядят хорошо на любом устройстве. Всегда используйте dp для размеров UI элементов и sp для текста.