Android Screen Adaptation and Density-Independent Units
Questions/Cues
Mengapa px tidak direkomendasikan untuk layout?
Bagaimana menghitung dp ke px aktual?
Perbedaan penggunaan sp vs dp
Kategori density bucket Android
Dampak density layar pada rendering
Reference Points
Android Development with Kotlin (Halaman 4-11, 55-57)
Konsep Dimensi Independen-Densitas
Density-independent pixels (dp) adalah unit pengukuran yang memastikan ukuran konsisten di berbagai perangkat Android dengan kepadatan layar berbeda. Android menggunakan dp sebagai standar pengukuran untuk elemen UI karena menyesuaikan dengan kepadatan layar aktual perangkat. Satu dp setara dengan satu piksel pada layar 160 dpi (baseline density).
Scale-independent pixels (sp) khusus digunakan untuk ukuran teks, karena mempertimbangkan preferensi ukuran font pengguna. Jika pengguna mengatur ukuran font besar di sistem, teks yang menggunakan sp akan otomatis menyesuaikan. Contoh praktis: Tombol sebaiknya menggunakan ukuran 48dp untuk tinggi minimum yang dapat disentuh, sementara teks body menggunakan 16sp.
Pixel aktual (px) tidak direkomendasikan karena menghasilkan tampilan tidak konsisten. Misalnya, elemen berukuran 100px akan terlihat sangat kecil di layar xxhdpi (480dpi) tetapi besar di layar mdpi (160dpi).
Density Bucket dan Konversi
Android mengelompokkan perangkat ke dalam density bucket untuk menyederhanakan adaptasi antarmuka:
| Kualifikasi | Deskripsi | Perkiraan DPI |
|-------------|-----------------|---------------|
| ldpi | Low density | 120 dpi |
| mdpi | Medium density | 160 dpi |
| hdpi | High density | 240 dpi |
| xhdpi | Extra-high | 320 dpi |
| xxhdpi | Extra-extra-high| 480 dpi |
| xxxhdpi | Ultra-high | 640 dpi |
Rumus konversi dp ke px:
px = dp × (dpi / 160)
Contoh: Elemen 100dp di layar xhdpi (320dpi) = 100 × (320/160) = 200px. Pengembang harus menyediakan aset gambar terpisah untuk tiap bucket guna menghindari penskalaan otomatis yang mengurangi kualitas.
Siklus Rendering View
Proses rendering UI Android terdiri dari tiga tahap berurutan:
Measure: Menghitung dimensi semua view berdasarkan constraint parent dan ukuran konten
Layout: Menentukan posisi akhir setiap view berdasarkan hasil pengukuran
Draw: Render grafis ke layar berdasarkan hasil pengukuran dan layout
Margin dan padding memengaruhi proses ini secara berbeda. Margin adalah ruang di luar batas view yang memengaruhi posisi relatif terhadap view lain, sementara padding adalah ruang di dalam batas view yang memengaruhi posisi konten internal. Contoh praktis: Tombol dengan margin 16dp akan memiliki jarak dari elemen sekitarnya, sedangkan padding 8dp membuat teks di dalam tombol tidak menempel ke tepi.
Praktik Terbaik Adaptasi Layar
Selalu gunakan dp untuk dimensi non-teks dan sp untuk teks
Hindari nilai dimensi absolut, gunakan constraint relatif (dibahas di catatan lain)
Uji layout di berbagai density menggunakan Android Studio Layout Validation Tool
Sediakan alternatif layout untuk orientasi landscape dan layar lebar
Gunakan VectorDrawable untuk ikon agar tetap tajam di semua density
Contoh kasus: Aplikasi e-commerce harus menampilkan tombol “Beli” dengan ukuran konsisten di semua perangkat. Dengan menetapkan tinggi 48dp dan lebar 120dp, tombol akan tetap mudah disentuh dan proporsional baik di tablet maupun ponsel kecil.
Summary
Unit dp dan sp merupakan fondasi adaptasi layar Android yang memastikan konsistensi visual di berbagai kepadatan layar. Penerapan yang tepat menghindari masalah skala otomatis dan meningkatkan aksesibilitas. Proses rendering yang melibatkan measure-layout-draw menjelaskan bagaimana sistem mengubah spesifikasi layout menjadi tampilan aktual. Pengembang harus memahami density bucket dan teknik konversi dp-px untuk optimasi aset grafis. Kombinasi unit independen-densitas dengan constraint relatif menghasilkan UI yang responsif.
Additional Information
Analisis Matematis Konversi Unit
Konversi dp-px dapat dimodelkan sebagai fungsi linier:
f(dpi) = dp * (dpi / 160)
Untuk layar 320dpi (xhdpi), faktor skala = 2.0. Implementasi aktual di sistem Android menggunakan rumus diskrit untuk menghindari pecahan:
public static int dpToPx(int dp, float density) {return Math.round(dp * density);}
Perhatikan bahwa pembulatan dapat menyebabkan perbedaan 1px di beberapa perangkat. Solusi: Gunakan nilai dp genap untuk menghindari artefak render.