Εξηγούμε τα βασικά του dp (density-independent pixel) — μονάδα μέτρησης στο Android που εξασφαλίζει το ίδιο φυσικό μέγεθος στοιχείων UI σε οθόνες με διαφορετική πυκνότητα pixel. Ένα dp αντιστοιχεί πάντα σε 1/160 ίντσας στην οθόνη, ανεξάρτητα από το αν η συσκευή έχει υψηλή ή χαμηλή ανάλυση. Σύμφωνα με το Google Material Design (2025), όλα τα μεγέθη σε εφαρμογές Android πρέπει να ορίζονται σε dp, όχι σε px, διαφορετικά η διεπαφή θα φαίνεται διαφορετική σε διαφορετικές συσκευές.
Κύρια Σημεία
dp (density-independent pixel) — είναι μια εικονική μονάδα μέτρησης στο Android, που εισήχθη για την ενοποίηση των μεγεθών στοιχείων UI σε συσκευές με διαφορετική πυκνότητα pixel. Ένα dp είναι περίπου ίσο με ένα φυσικό pixel σε οθόνη με πυκνότητα 160 dpi (mdpi). Σε οθόνη με πυκνότητα 320 dpi (xhdpi), 1 dp θα είναι ίσο με 2 φυσικά pixel. Έτσι, το φυσικό μέγεθος του στοιχείου στην οθόνη παραμένει το ίδιο — περίπου 1/160 ίντσας. Σύμφωνα με το Android Developers (2025), το dp είναι η μόνη μονάδα μέτρησης που πρέπει να χρησιμοποιείται για μεγέθη layout, padding, margin και πλάτος/ύψος view.
Αν ορίσετε το πλάτος ενός κουμπιού σε 160 px, σε οθόνη mdpi θα έχει πλάτος 1 ίντσα, ενώ σε οθόνη xxxhdpi (640 dpi) — μόνο 0.25 ίντσας. dp λύνει αυτό το πρόβλημα: 160 dp σε οποιαδήποτε οθόνη θα είναι ίσο με 1 ίντσα. Το Android μετατρέπει αυτόματα το dp σε px μέσω του DisplayMetrics.density κατά την απόδοση. Σύμφωνα με το Android Developer Blog (2025), πριν από την εισαγωγή του dp (Android 1.0), οι προγραμματιστές χρησιμοποιούσαν px υπολογίζοντας χειροκίνητα, γεγονός που οδηγούσε σε συνεχή σφάλματα κατά τη μεταφορά.
dp, px και sp — τρεις μονάδες μέτρησης στο Android, η καθεμία με το δικό της σκοπό. px — το φυσικό pixel της οθόνης, που εξαρτάται από την πυκνότητα. dp — pixel ανεξάρτητο από την πυκνότητα για μεγέθη στοιχείων. sp — scale-independent pixel για κείμενο, που λαμβάνει επιπλέον υπόψη τις ρυθμίσεις συστήματος μεγέθους γραμματοσειράς. Σύμφωνα με το Material Design (2025), η διαφορά μεταξύ dp και sp είναι μια βασική πτυχή προσβασιμότητας: οι χρήστες με κακή όραση μεγεθύνουν τη γραμματοσειρά και οι τιμές sp προσαρμόζονται αυτόματα, ενώ το dp — όχι.
| Μονάδα | Πλήρες όνομα | Λαμβάνει υπόψη την πυκνότητα | Λαμβάνει υπόψη ρυθμίσεις γραμματοσειράς | Εφαρμογή |
|---|---|---|---|---|
| px | Pixel | Όχι | Όχι | Δεν συνιστάται |
| dp | Density-independent Pixel | Ναι | Όχι | Layout, padding, περιθώρια |
| sp | Scale-independent Pixel | Ναι | Ναι | Μέγεθος κειμένου |
Τύπος μετατροπής dp σε px: px = dp × (dpi / 160). Για αντίστροφη μετατροπή: dp = px / (dpi / 160). density — είναι η αναλογία dpi / 160, που υπολογίζει το Android βάσει του DisplayMetrics. Σε mdpi density = 1.0, σε hdpi = 1.5, σε xhdpi = 2.0, σε xxhdpi = 3.0, σε xxxhdpi = 4.0. Επομένως, 48 dp σε pixel: σε mdpi — 48 px, σε xxhdpi — 144 px. Σύμφωνα με το Google I/O 2024, αυτός ο τύπος μπορεί να χρησιμοποιηθεί για κατά προσέγγιση μετατροπή iOS pt (points) σε dp — 1 pt ≈ 1 dp.
| Bucket | Density | Τιμή dpi | 48 dp σε px | 16 dp σε px |
|---|---|---|---|---|
| mdpi | 1.0 | 160 | 48 | 16 |
| hdpi | 1.5 | 240 | 72 | 24 |
| xhdpi | 2.0 | 320 | 96 | 32 |
| xxhdpi | 3.0 | 480 | 144 | 48 |
| xxxhdpi | 4.0 | 640 | 192 | 64 |
dimens.xml — αρχείο πόρων Android στο res/values/, που προορίζεται για την αποθήκευση όλων των μεγεθών σε dp (και sp για κείμενο). Η συγκέντρωση μεγεθών στο dimens.xml απλοποιεί τη συντήρηση: η αλλαγή μιας τιμής στο dimens.xml ενημερώνει το μέγεθος σε όλες τις οθόνες της εφαρμογής. Μπορούν να δημιουργηθούν καταλληλότητα dimens.xml αρχεία για διαφορετικές πυκνότητες (values-hdpi, values-xhdpi). Σύμφωνα με το Android Jetpack Docs (2025), η Google συνιστά την αποθήκευση στο dimens.xml διαστημάτων (margin, padding), πλάτη στοιχείων (σταθερές), μεγέθη avatar και ύψος γραμμής εργαλείων.
<resources>
<dimen name="margin_small">8dp</dimen>
<dimen name="margin_medium">16dp</dimen>
<dimen name="margin_large">24dp</dimen>
<dimen name="avatar_size">48dp</dimen>
<dimen name="toolbar_height">56dp</dimen>
<dimen name="text_size_body">14sp</dimen>
<dimen name="icon_size_small">24dp</dimen>
</resources>
Σε αυτό το αρχείο κάθε dimen έχει όνομα και τιμή. Χρήση σε αρχεία XML: @dimen/avatar_size. Σύμφωνα με το Material Design Guidelines (2025), το βασικό βήμα πλέγματος στο Android είναι 8 dp (8-point grid). Όλα τα διαστήματα, μεγέθη στοιχείων και αποστάσεις πρέπει να είναι πολλαπλάσια του 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp. Για κείμενο, το βήμα είναι 4 sp.
Σε αρχεία XML, το dp χρησιμοποιείται απευθείας: android:layout_width="48dp". Σε προγραμματιστικό κώδικα (Kotlin/Java) πρέπει να μετατρέψετε το dp σε px χρησιμοποιώντας TypedResource ή συναρτήσεις επέκτασης. TypedResource παρέχει έτοιμες μεθόδους για εργασία με dp κατά το χρόνο εκτέλεσης: getDimensionPixelSize() επιστρέφει ακέραιο αριθμό px. Στο Jetpack Compose, το dp είναι η τυπική μονάδα μέτρησης σε τροποποιητές και δοχεία διάταξης.
// Προγραμματιστική μετατροπή dp σε px
fun Context.dpToPx(dp: Int): Int {
return (dp * resources
.displayMetrics
.density).toInt()
}
// Χρήση σε Activity
val paddingPx = dpToPx(16)
button.setPadding(
paddingPx,
paddingPx,
paddingPx,
paddingPx,
)
// Jetpack Compose: dp ως ενσωματωμένη μονάδα
Modifier
.padding(16.dp)
.size(48.dp)
Σε αυτό το παράδειγμα dpToPx() — συνάρτηση επέκτασης για Context, που μετατρέπει dp σε px χρησιμοποιώντας displayMetrics.density. Στο Jetpack Compose, το dp είναι ενσωματωμένο στο σύστημα τύπων και δεν απαιτεί χειροκίνητη μετατροπή — ο μεταγλωττιστής μεταφράζει αυτόματα το dp σε px στη φάση απόδοσης.
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:padding="@dimen/margin_medium"
android:textSize="@dimen/text_size_body"
android:text="@string/button_label"
android:layout_marginTop="16dp"
/>
Σε XML, το dp προστίθεται ως επίθημα στον αριθμό — margin_top="16dp". Για κείμενο, χρησιμοποιείται sp — textSize="@dimen/text_size_body". Η αναφορά @dimen επιτρέπει την κεντρική διαχείριση τιμών. Η χρήση match_parent για πλάτος και 48dp για ύψος είναι ένα τυπικό μοτίβο Material Design για κουμπιά.
Σύμφωνα με ανάλυση εφαρμογών Android από το Google Play Console (2025), τα πέντε πιο συνηθισμένα λάθη: χρήση px αντί για dp σε αρχεία XML, έλλειψη dimens.xml (τιμές γραμμένες inline), λανθασμένη μετατροπή dp σε px σε κώδικα (χρήση ακέραιας διαίρεσης), αγνόηση sp για κείμενο και μη υπολογισμός ρυθμίσεων συστήματος μεγέθους γραμματοσειράς μέσω sp. Ακέραια διαίρεση είναι το πιο επικίνδυνο λάθος: στο Kotlin val px = dp * density — αν τα dp και density είναι Int, το αποτέλεσμα θα είναι επίσης Int και η ακρίβεια χάνεται.
Συχνές Ερωτήσεις
dp στο Android και pt (points) στο iOS — είναι ισοδύναμες μονάδες μέτρησης. 1 dp στο Android είναι περίπου ίσο με 1 pt στο iOS. Και οι δύο έννοιες περιγράφουν σημεία ανεξάρτητα από την πυκνότητα: σε παλιές συσκευές με χαμηλή πυκνότητα 1 dp/pt = 1 px, σε σύγχρονες — 2-4 px. Η διαφορά στη βασική τιμή: το Android χρησιμοποιεί 160 dpi ως βασική πυκνότητα, το iOS — 163 dpi, που δίνει σφάλμα μικρότερο από 2%.
Στο Jetpack Compose δεν απαιτείται μετατροπή — το dp είναι ενσωματωμένο στο σύστημα τύπων. Όλοι οι τροποποιητές και οι διατάξεις δέχονται Dp, όχι px. Εάν χρειάζεται να λάβετε px από dp, χρησιμοποιήστε το density: val px = with(LocalDensity.current) { 16.dp.toPx() }. Το LocalDensity παρέχει τον συντελεστή μετατροπής που λαμβάνει υπόψη την πυκνότητα οθόνης της συσκευής.
dp — όρος του Android. Στο iOS, το αντίστοιχο είναι pt (points). Το Swift λειτουργεί αυτόματα με σημεία που δεν εξαρτώνται από την πυκνότητα οθόνης. Στο UIKit και SwiftUI, όλα τα μεγέθη ορίζονται σε σημεία και το σύστημα τα μετατρέπει σε px χρησιμοποιώντας τον παράγοντα κλίμακας οθόνης (UIScreen.main.scale). Η αρχή είναι ίδια, το όνομα διαφορετικό.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης