Εξηγούμε την ουσία του Screen Density (Density Buckets) στο Android — την ταξινόμηση οθονών ανά πυκνότητα pixel: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Το Screen Density καθορίζει πόσα φυσικά pixel χωρούν σε μία ίντσα οθόνης και επηρεάζει άμεσα το πώς εμφανίζονται οι εικόνες και η διεπαφή σε διαφορετικές συσκευές. Σύμφωνα με το Google Android Compatibility Definition (2025), το Android υποστηρίζει 6 κύρια Density Buckets και έως 8 επιπλέον για αναδιπλούμενες συσκευές.
Κύρια σημεία
Screen Density (πυκνότητα οθόνης) — ο αριθμός φυσικών pixel ανά ίντσα οθόνης (ppi — pixels per inch, ή dpi — dots per inch). Το Android χρησιμοποιεί την έννοια των Density Buckets — ομάδες οθονών με παρόμοια πυκνότητα, για τις οποίες εφαρμόζονται οι ίδιοι συντελεστές κλίμακας. Σε αντίθεση με την ανάλυση (αριθμός pixel σε πλάτος και ύψος), η πυκνότητα καθορίζει το φυσικό μέγεθος του pixel στην οθόνη. Σύμφωνα με το Google Pixel Team (2025), η πυκνότητα των σύγχρονων ναυαρχίδων είναι 450-550 ppi, που αντιστοιχεί στα buckets xxhdpi-xxxhdpi.
Το σύστημα Density Buckets εμφανίστηκε στο Android 1.6 Donut (2009) με τις πρώτες συσκευές στα 160 dpi (mdpi). Με την αύξηση της ανάλυσης οθόνης, προστέθηκαν νέα buckets: hdpi (Android 1.6), xhdpi (Android 2.3), xxhdpi (Android 4.1), xxxhdpi (Android 4.4). Κάθε νέο bucket αντανακλούσε 1.5 ή 2 φορές αύξηση της πυκνότητας σε σχέση με το προηγούμενο. Σύμφωνα με το Android Open Source Project (2025), επί του παρόντος το 96% των ενεργών συσκευών Android έχουν πυκνότητα από hdpi έως xxxhdpi.
Density Buckets — εύρη πυκνότητας που ορίζονται από την Google για την ομαδοποίηση οθονών Android. Το βασικό bucket — mdpi (160 dpi). Ο συντελεστής κλίμακας (scale factor) δείχνει πόσες φορές ο πόρος για ένα συγκεκριμένο bucket είναι μεγαλύτερος από το mdpi. Για παράδειγμα, xhdpi (2×) σημαίνει ότι η εικόνα πρέπει να είναι 2 φορές μεγαλύτερη σε πλάτος και ύψος από την έκδοση mdpi. Σύμφωνα με το Android Studio Resource Manager (2025), το xxhdpi είναι το πιο κοινό bucket μεταξύ ενεργών συσκευών (38% της αγοράς), ακολουθούμενο από xhdpi (28%).
| Bucket | Εύρος DPI | Scale | Παράδειγμα συσκευής | Μερίδιο αγοράς (2025) |
|---|---|---|---|---|
| ldpi | 120 dpi | 0.75× | Παλιές οικονομικές συσκευές | Λιγότερο από 1% |
| mdpi | 120-160 dpi | 1× | HTC Dream (G1), ταμπλέτες 7″ | 3% |
| hdpi | 160-240 dpi | 1.5× | Samsung Galaxy S2, Nexus 4 | 12% |
| xhdpi | 240-320 dpi | 2× | Google Nexus 5, Moto G | 28% |
| xxhdpi | 320-480 dpi | 3× | Samsung Galaxy S8, Pixel 3 | 38% |
| xxxhdpi | 480-640 dpi | 4× | Samsung Galaxy S24 Ultra, Pixel 9 Pro | 18% |
Ανάλυση οθόνης — ο συνολικός αριθμός pixel σε πλάτος και ύψος (π.χ. 1080×2400). Πυκνότητα οθόνης — αριθμός pixel ανά ίντσα. Δύο συσκευές με την ίδια ανάλυση μπορεί να έχουν διαφορετική πυκνότητα εάν τα φυσικά μεγέθη οθόνης διαφέρουν. Για παράδειγμα, ένα τηλέφωνο 6 ιντσών με ανάλυση 1080×2400 έχει πυκνότητα περίπου 440 dpi (xxhdpi), ενώ ένα τηλέφωνο 5 ιντσών με την ίδια ανάλυση — περίπου 530 dpi (xxxhdpi). Αυτή είναι η βασική διαφορά: η διεπαφή πρέπει να προσαρμόζεται στην πυκνότητα, όχι στην ανάλυση, διαφορετικά τα στοιχεία θα είναι πολύ μικρά σε συσκευές υψηλής πυκνότητας.
Το Android χρησιμοποιεί qualifiers στα ονόματα φακέλων res για φόρτωση πόρων για συγκεκριμένη πυκνότητα οθόνης: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi. Κατά την εκκίνηση της εφαρμογής, το Android επιλέγει πόρους από τον φάκελο που ταιριάζει καλύτερα στην πυκνότητα της συσκευής. Εάν δεν υπάρχει ακριβής αντιστοιχία, το σύστημα παίρνει το πλησιέστερο bucket ή κλιμακώνει τον πόρο από χαμηλότερη πυκνότητα. Σύμφωνα με το Android Docs (2025), για διανύσματα (VectorDrawable) δεν απαιτούνται προσδιοριστικά πυκνότητας — κλιμακώνονται αυτόματα.
/res/
drawable-mdpi/
icon_app.png (48x48 px)
drawable-hdpi/
icon_app.png (72x72 px)
drawable-xhdpi/
icon_app.png (96x96 px)
drawable-xxhdpi/
icon_app.png (144x144 px)
drawable-xxxhdpi/
icon_app.png (192x192 px)
Σε αυτή τη δομή, κάθε φάκελος περιέχει το ίδιο εικονίδιο, αλλά σε διαφορετικό φυσικό μέγεθος σε pixel. Το βασικό μέγεθος 48×48 pixel για mdpi πολλαπλασιάζεται με τον συντελεστή κλίμακας για κάθε bucket. Το Android επιλέγει αυτόματα το απαιτούμενο αρχείο βάσει του DisplayMetrics.density της συσκευής. Για VectorDrawable (μορφή XML) αρκεί ένα αρχείο στο drawable/ — το σύστημα το κλιμακώνει χωρίς απώλεια ποιότητας.
Υπολογισμός μεγέθους εικόνας για κάθε πυκνότητα βασίζεται σε έναν απλό τύπο: μέγεθος σε mdpi × scale factor. Εάν το εικονίδιο σε mdpi έχει μέγεθος 48×48 px, τότε για hdpi θα είναι 72×72 px (48 × 1.5), για xhdpi — 96×96 px (48 × 2), για xxhdpi — 144×144 px (48 × 3), για xxxhdpi — 192×192 px (48 × 4). Σύμφωνα με το Material Design Guidelines (2025), αυτός ο τύπος εφαρμόζεται για όλους τους πόρους raster: εικονίδια, φόντα, εικόνες και 9-patch.
| Bucket | Scale | Μέγεθος mdpi (px) | Μέγεθος σε bucket (px) |
|---|---|---|---|
| mdpi | 1× | 48×48 | 48×48 |
| hdpi | 1.5× | 48×48 | 72×72 |
| xhdpi | 2× | 48×48 | 96×96 |
| xxhdpi | 3× | 48×48 | 144×144 |
| xxxhdpi | 4× | 48×48 | 192×192 |
Σωστή προετοιμασία πόρων για Density Buckets περιλαμβάνει πέντε βασικούς κανόνες. Πρώτον, χρησιμοποιήστε VectorDrawable για απλά εικονίδια — αυτό εξαλείφει την ανάγκη για πέντε αντίγραφα. Δεύτερον, για εικόνες raster, εξάγετε όλες τις πυκνότητες ταυτόχρονα από εργαλεία σχεδιασμού (το Android Studio Asset Studio δημιουργεί αυτόματα). Τρίτον, αποφύγετε την τοποθέτηση εικόνων σε drawable/ χωρίς προσδιοριστικό — το σύστημα θα κλιμακώσει με απώλεια ποιότητας. Τέταρτον, δοκιμάστε σε συσκευή με διαφορετική πυκνότητα από την κύρια — ο εξομοιωτής επιτρέπει την αλλαγή πυκνότητας. Πέμπτον, χρησιμοποιήστε WebP αντί για PNG — σύμφωνα με την Google (2025), το WebP προσφέρει 25-35% μικρότερο μέγεθος στην ίδια ποιότητα.
Συχνές Ερωτήσεις
mdpi (medium-density pixel-independent) — το βασικό Density Bucket του Android με πυκνότητα 160 dpi. Όλα τα άλλα buckets υπολογίζονται σε σχέση με το mdpi: hdpi — 1.5×, xhdpi — 2× και ούτω καθεξής. Το mdpi αντιστοιχεί σε ένα φυσικό pixel ανά density-independent pixel (dp). Οι σχεδιαστές βασίζονται στο mdpi κατά τη δημιουργία μακετών.
Χρησιμοποιήστε DisplayMetrics: το getResources().getDisplayMetrics().density επιστρέφει τον συντελεστή κλίμακας (1.0 για mdpi, 3.0 για xxhdpi). Για προγραμματιστικό προσδιορισμό του bucket, καλέστε getResources().getConfiguration().densityDpi. Στο Android Studio υπάρχει επίσης το Device Explorer που δείχνει το densityDpi για τη συνδεδεμένη συσκευή.
Τεχνικά — ναι, αλλά με απώλεια ποιότητας. Εάν ο πόρος υπάρχει μόνο σε drawable-xxhdpi, σε συσκευή mdpi θα μειωθεί 3 φορές — η εικόνα θα γίνει θολή. Εάν ο πόρος είναι μόνο σε mdpi, σε xxhdpi θα μεγεθυνθεί — θα εμφανιστεί pixelization. Συνιστάται η προετοιμασία τουλάχιστον για xhdpi, xxhdpi και xxxhdpi — αυτό καλύπτει το 84% των ενεργών συσκευών (2025). Για VectorDrawable αρκεί ένα αρχείο χωρίς προσδιοριστικό.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης