dp — βασικά, εικονοστοιχεία ανεξάρτητα από την πυκνότητα στο Android

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-25 Χρόνος ανάγνωσης: 7 λεπ

Εξηγούμε τα βασικά του dp (density-independent pixel) — μονάδα μέτρησης στο Android που εξασφαλίζει το ίδιο φυσικό μέγεθος στοιχείων UI σε οθόνες με διαφορετική πυκνότητα pixel. Ένα dp αντιστοιχεί πάντα σε 1/160 ίντσας στην οθόνη, ανεξάρτητα από το αν η συσκευή έχει υψηλή ή χαμηλή ανάλυση. Σύμφωνα με το Google Material Design (2025), όλα τα μεγέθη σε εφαρμογές Android πρέπει να ορίζονται σε dp, όχι σε px, διαφορετικά η διεπαφή θα φαίνεται διαφορετική σε διαφορετικές συσκευές.

Κύρια Σημεία

  • dp (density-independent pixel) — αφηρημένη μονάδα μέτρησης στο Android, ίση με 1/160 ίντσας στην οθόνη.
  • Τύπος μετατροπής: px = dp × (dpi / 160). Σε οθόνη mdpi 1 dp = 1 px, σε xxhdpi 1 dp = 3 px.
  • Όλα τα μεγέθη σε XML (layout_width, padding, margin) ορίζονται σε dp.
  • dimens.xml — αρχείο πόρων Android για κεντρική αποθήκευση τιμών dp.
  • Σύμφωνα με το Google Android Performance Guide (2025), η χρήση dp αντί για px εξαλείφει το 90% των προβλημάτων προσαρμογής διεπαφής σε διαφορετικές οθόνες.

Τι είναι το dp στο Android;

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.

Γιατί δεν μπορεί να χρησιμοποιηθεί το px

Αν ορίσετε το πλάτος ενός κουμπιού σε 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: ποια είναι η διαφορά

dp, px και sp — τρεις μονάδες μέτρησης στο Android, η καθεμία με το δικό της σκοπό. px — το φυσικό pixel της οθόνης, που εξαρτάται από την πυκνότητα. dp — pixel ανεξάρτητο από την πυκνότητα για μεγέθη στοιχείων. sp — scale-independent pixel για κείμενο, που λαμβάνει επιπλέον υπόψη τις ρυθμίσεις συστήματος μεγέθους γραμματοσειράς. Σύμφωνα με το Material Design (2025), η διαφορά μεταξύ dp και sp είναι μια βασική πτυχή προσβασιμότητας: οι χρήστες με κακή όραση μεγεθύνουν τη γραμματοσειρά και οι τιμές sp προσαρμόζονται αυτόματα, ενώ το dp — όχι.

ΜονάδαΠλήρες όνομαΛαμβάνει υπόψη την πυκνότηταΛαμβάνει υπόψη ρυθμίσεις γραμματοσειράςΕφαρμογή
pxPixelΌχιΌχιΔεν συνιστάται
dpDensity-independent PixelΝαιΌχιLayout, padding, περιθώρια
spScale-independent PixelΝαιΝαιΜέγεθος κειμένου

Τύπος μετατροπής dp σε px και αντίστροφα

Τύπος μετατροπής 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.

BucketDensityΤιμή dpi48 dp σε px16 dp σε px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: κεντρική διαχείριση μεγεθών

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 και ύψος γραμμής εργαλείων.

XML


<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.

Προγραμματιστική χρήση dp σε Kotlin και XML

Σε αρχεία XML, το dp χρησιμοποιείται απευθείας: android:layout_width="48dp". Σε προγραμματιστικό κώδικα (Kotlin/Java) πρέπει να μετατρέψετε το dp σε px χρησιμοποιώντας TypedResource ή συναρτήσεις επέκτασης. TypedResource παρέχει έτοιμες μεθόδους για εργασία με dp κατά το χρόνο εκτέλεσης: getDimensionPixelSize() επιστρέφει ακέραιο αριθμό px. Στο Jetpack Compose, το dp είναι η τυπική μονάδα μέτρησης σε τροποποιητές και δοχεία διάταξης.

Kotlin
// Προγραμματιστική μετατροπή 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 στη φάση απόδοσης.

Αρχεία XML με dp

XML

<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 για κουμπιά.

Συνήθη λάθη κατά τη χρήση dp

Σύμφωνα με ανάλυση εφαρμογών Android από το Google Play Console (2025), τα πέντε πιο συνηθισμένα λάθη: χρήση px αντί για dp σε αρχεία XML, έλλειψη dimens.xml (τιμές γραμμένες inline), λανθασμένη μετατροπή dp σε px σε κώδικα (χρήση ακέραιας διαίρεσης), αγνόηση sp για κείμενο και μη υπολογισμός ρυθμίσεων συστήματος μεγέθους γραμματοσειράς μέσω sp. Ακέραια διαίρεση είναι το πιο επικίνδυνο λάθος: στο Kotlin val px = dp * density — αν τα dp και density είναι Int, το αποτέλεσμα θα είναι επίσης Int και η ακρίβεια χάνεται.

  • px αντί για dp — η εφαρμογή φαίνεται διαφορετική σε συσκευές με διαφορετική πυκνότητα. Διόρθωση: αντικατάσταση px με dp σε XML.
  • Inline τιμές — τα μεγέθη είναι γραμμένα απευθείας σε αρχεία layout. Η αντιγραφή τιμών δυσκολεύει τη συντήρηση και την ενημέρωση.
  • sp για κείμενο — η χρήση dp για μέγεθος γραμματοσειράς αγνοεί τις ρυθμίσεις χρήστη, παραβιάζοντας την προσβασιμότητα.
  • Ακέραια διαίρεση — στο Kotlin η διαίρεση Int με Int δίνει Int, χάνοντας το κλασματικό μέρος. Χρησιμοποιείτε πάντα Float.

Συχνές Ερωτήσεις

Σε τι διαφέρει το dp από το pt στο iOS;

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%.

Πώς μετατρέπεται το dp σε px στο Jetpack Compose;

Στο Jetpack Compose δεν απαιτείται μετατροπή — το dp είναι ενσωματωμένο στο σύστημα τύπων. Όλοι οι τροποποιητές και οι διατάξεις δέχονται Dp, όχι px. Εάν χρειάζεται να λάβετε px από dp, χρησιμοποιήστε το density: val px = with(LocalDensity.current) { 16.dp.toPx() }. Το LocalDensity παρέχει τον συντελεστή μετατροπής που λαμβάνει υπόψη την πυκνότητα οθόνης της συσκευής.

Πρέπει να χρησιμοποιώ dp στο iOS;

dp — όρος του Android. Στο iOS, το αντίστοιχο είναι pt (points). Το Swift λειτουργεί αυτόματα με σημεία που δεν εξαρτώνται από την πυκνότητα οθόνης. Στο UIKit και SwiftUI, όλα τα μεγέθη ορίζονται σε σημεία και το σύστημα τα μετατρέπει σε px χρησιμοποιώντας τον παράγοντα κλίμακας οθόνης (UIScreen.main.scale). Η αρχή είναι ίδια, το όνομα διαφορετικό.

Σύνοψη

  • dp — Density-independent Pixel, αφηρημένη μονάδα για μεγέθη UI στο Android, ίση με 1/160 ίντσας.
  • Τύπος: px = dp × (dpi / 160). Σε mdpi 1 dp = 1 px, σε xxhdpi 1 dp = 3 px.
  • Όλα τα μεγέθη σε αρχεία XML πρέπει να ορίζονται σε dp, το μέγεθος κειμένου — σε sp.
  • dimens.xml — κεντρική αποθήκευση μεγεθών. Μία αλλαγή ενημερώνει ολόκληρη τη διεπαφή.
  • 8-point grid: όλα τα μεγέθη είναι πολλαπλάσια του 8 dp, διαστήματα κειμένου — 4 sp.
  • Σε προγραμματιστικό κώδικα χρησιμοποιήστε TypedResource ή συναρτήσεις επέκτασης για μετατροπή dp σε px.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης