Elevation — η βασική έννοια του Material Design που καθορίζει το ύψος ενός στοιχείου κατά μήκος του άξονα Z (κάθετα στην οθόνη). Το elevation μετριέται σε dp και επηρεάζει άμεσα το μέγεθος και το θάμπωμα της σκιάς που ρίχνει το στοιχείο. Όσο υψηλότερο είναι το elevation, τόσο πιο κοντά στο χρήστη είναι το στοιχείο και τόσο πιο εμφανές είναι το οπτικό του βάρος. Σύμφωνα με το Material Design 3 (Google, 2026), το τυπικό elevation για κάρτες είναι 1 dp, για FloatingActionButton — 6 dp, για διαλόγους — 24 dp. Διαβάστε περισσότερα σχετικά με την υλοποίηση σκιών στο άρθρο για τις σκιές στο UI.
Κύρια σημεία
Elevation — είναι μια μετρική που εισήχθη στο Material Design (Google I/O 2014) και περιγράφει τη θέση ενός στοιχείου κατά μήκος του άξονα Z. Σε αντίθεση με τα X και Y (το δισδιάστατο επίπεδο της οθόνης), το Z είναι το ύψος πάνω από το επίπεδο. Το elevation εκφράζεται σε dp (density-independent pixels) και καθορίζει δύο οπτικά εφέ: τη σκιά (shadow) που γίνεται μεγαλύτερη και πιο θαμπή με την αύξηση του elevation, και τη σειρά σχεδίασης (τα στοιχεία με υψηλότερο elevation σχεδιάζονται πάνω από στοιχεία με χαμηλότερο elevation).
Φυσική μεταφορά: φανταστείτε φύλλα χαρτιού σε ένα τραπέζι. Όσο υψηλότερη είναι η στοίβα, τόσο μεγαλύτερη είναι η σκιά από το πάνω φύλλο. Elevation στο Material Design λειτουργεί ακριβώς με τον ίδιο τρόπο: κάθε στοιχείο είναι ένα «ψηφιακό φύλλο» σε συγκεκριμένο ύψος. Όταν ο χρήστης αλληλεπιδρά με ένα στοιχείο (πατάει ένα κουμπί, σηκώνει μια κάρτα), το elevation αυξάνεται προσωρινά — αυτό ονομάζεται «εξύψωση αλληλεπίδρασης» (interaction elevation).
Σύμφωνα με το Material Design Guidelines (Google, 2026), η σωστή χρήση του elevation βελτιώνει τη δυνατότητα σάρωσης της διεπαφής κατά 35%: οι χρήστες βρίσκουν τα διαδραστικά στοιχεία πιο γρήγορα επειδή «ξεχωρίζουν» πάνω από το επίπεδο περιεχόμενο. Ωστόσο, ο υπερβολικός αριθμός επιπέδων elevation (περισσότερα από 4) μειώνει αυτό το αποτέλεσμα: αν όλα τα στοιχεία αιωρούνται, κανένα δεν φαίνεται σημαντικό.
Στο Android το elevation έχει υλοποιηθεί ως ενσωματωμένη ιδιότητα View από το API 21 (Android 5.0 Lollipop). Το View.elevation ορίζει το βασικό ύψος σε pixels (px), και το View.translationZ — μια πρόσθετη μετατόπιση για κινούμενα σχέδια (π.χ. όταν πατιέται). Συνολικό οπτικό ύψος = elevation + translationZ. Και οι δύο ιδιότητες υποστηρίζουν κινούμενα σχέδια μέσω ViewPropertyAnimator ή ObjectAnimator.
<!-- XML: elevation και translationZ -->
<Button
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="4dp"
android:translationZ="2dp"
android:stateListAnimator="@anim/button_elevation"
android:text="Κουμπί με elevation" />
StateListAnimator — ένας πόρος XML για την κίνηση του elevation και του translationZ ανάλογα με την κατάσταση View (pressed, focused, enabled). Για παράδειγμα, όταν πατιέται ένα κουμπί, το elevation μπορεί να αυξηθεί από 2 dp σε 8 dp, δημιουργώντας ένα εφέ ανύψωσης. Το StateListAnimator υποστηρίζει κίνηση μέσω ObjectAnimator για οποιεσδήποτε ιδιότητες View.
// Kotlin: προγραμματική ρύθμιση elevation
import android.animation.ObjectAnimator
import android.view.View
val myButton: View = findViewById(R.id.myButton)
myButton.elevation = 4f // βασικό ύψος σε px
// Κίνηση elevation κατά το πάτημα
val animator = ObjectAnimator.ofFloat(
myButton,
"translationZ",
0f,
8f
).apply {
duration = 150
repeatMode = ValueAnimator.REVERSE
repeatCount = 1
}
OutlineProvider — το βασικό συστατικό για τη σωστή σχεδίαση της σκιάς από το elevation. Από προεπιλογή, το Android χρησιμοποιεί το ViewOutlineProvider.BACKGROUND, το οποίο δημιουργεί ένα περίγραμμα βάσει του drawable φόντου. Για View με στρογγυλεμένες γωνίες (μέσω shape drawable) πρέπει να οριστεί ένα προσαρμοσμένο OutlineProvider, διαφορετικά η σκιά θα είναι ορθογώνια. Τα στοιχεία Material (CardView, MaterialButton) διαχειρίζονται το OutlineProvider αυτόματα.
Material Design 3 (Material You) αναθεώρησε το σύστημα elevation σε σύγκριση με το Material Design 2. Αντί για 12 σταθερά επίπεδα (Material 2) το M3 προσφέρει 5 βασικούς τόνους (tones), καθένας από τους οποίους αντιστοιχεί σε ένα συγκεκριμένο επίπεδο elevation. Επιπλέον, το M3 εισάγει την έννοια της «χρωματιστής σκιάς» (color shadow) στο Android 12+: η σκιά μπορεί να χρωματιστεί στο χρώμα έμφασης του θέματος, αντί να είναι μαύρο-γκρι.
| Επίπεδο | Elevation | Χρήση | ΣΚΙΑ (φωτεινό θέμα) |
|---|---|---|---|
| Level 0 | 0 dp | Φόντα, δοχεία Surface | Χωρίς σκιά |
| Level 1 | 1 dp | Κάρτες, ListItem, μενού | 0.05 opacity, 2px blur |
| Level 2 | 3 dp | Search bar, Bottom navigation | 0.08 opacity, 4px blur |
| Level 3 | 6 dp | FAB, FloatingActionButton | 0.11 opacity, 8px blur |
| Level 4 | 8 dp | Snackbar, Bottom sheet | 0.12 opacity, 12px blur |
| Level 5 | 12 dp | Navigation drawer, Dialog | 0.14 opacity, 16px blur |
| Level 6 | 24 dp | Modal dialog, Popup menu | 0.15 opacity, 24px blur |
Interaction elevation — προσωρινή αύξηση του elevation κατά την αλληλεπίδραση του χρήστη με το στοιχείο. Στο Material Design 3, τα διαδραστικά στοιχεία (κουμπιά, κάρτες) λαμβάνουν +1–2 dp στο βασικό elevation όταν πατιούνται (pressed state) ή εστιάζονται (focused state). Για το FloatingActionButton, το interaction elevation είναι +6 dp. Η κίνηση μετάβασης μεταξύ καταστάσεων πρέπει να διαρκεί 150–200 ms για φυσική απτική απόκριση.
Jetpack Compose υποστηρίζει elevation μέσω των στοιχείων Card και Surface, τα οποία διαθέτουν ενσωματωμένη παράμετρο elevation. Σε αντίθεση με το View System, το Compose σχεδιάζει σκιές μέσω της δικής του μηχανής απόδοσης, εξασφαλίζοντας την ίδια συμπεριφορά σε όλες τις εκδόσεις Android (API 21+). Το Modifier.shadow() — ένας τροποποιητής χαμηλού επιπέδου για προσθήκη σκιάς σε οποιοδήποτε composable.
// Jetpack Compose: elevation μέσω Surface και Card
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.Surface
Card(
elevation = CardDefaults.cardElevation(
defaultElevation = 4.dp,
pressedElevation = 8.dp,
focusedElevation = 6.dp
),
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.surface
)
) {
Text("Κάρτα που ελέγχεται από elevation")
}
// Modifier.shadow για προσαρμοσμένα σχήματα
Surface(
modifier = Modifier
.shadow(elevation = 6.dp, shape = RoundedCornerShape(16.dp))
.clickable { /* ενέργεια */ },
shape = RoundedCornerShape(16.dp),
color = MaterialTheme.colorScheme.surface
) { Text("Επιφάνεια με σκιά") }
Κίνηση elevation στο Compose υλοποιείται μέσω animateFloatAsState ή Animatable. Κατά την αλλαγή του elevation, το Compose κινεί αυτόματα τη σκιά. Για διαδραστικά στοιχεία, χρησιμοποιήστε το M3 InteractionSource σε συνδυασμό με το animateElevation ώστε το elevation να αντιδρά σε πατήματα, εστίαση και σύρσιμο. Το Material 3 στο Compose 1.2+ υποστηρίζει color shadow — σκιά χρωματισμένη στο χρώμα primary Container του θέματος.
Στο iOS δεν υπάρχει ενσωματωμένο ανάλογο του elevation από το Material Design. Οι Human Interface Guidelines της Apple δεν χρησιμοποιούν συντεταγμένη Z για τη διαχείριση σκιών — αντίθετα, οι προγραμματιστές ρυθμίζουν χειροκίνητα τις σκιές μέσω CALayer.shadow*. Ωστόσο, η έννοια της οπτικής ιεραρχίας μέσω σκιών και βάθους υπάρχει και στο iOS: οι τροπικές παρουσιάσεις, το UIAlertController, το UIPopoverPresentationController — όλα χρησιμοποιούν σκιές για διαχωρισμό από το φόντο.
Για προσομοίωση elevation στο iOS, οι προγραμματιστές χρησιμοποιούν έναν συνδυασμό shadowOpacity + shadowRadius + shadowOffset. Όσο υψηλότερο είναι το απαιτούμενο «ύψος», τόσο μεγαλύτερη είναι η ακτίνα θολώματος και η μετατόπιση της σκιάς. Στο SwiftUI, οι σκιές ορίζονται μέσω του τροποποιητή .shadow() με παραμέτρους. Για συμπεριφορά παρόμοια με Material στο iOS, υπάρχουν βιβλιοθήκες Material Components for iOS (MDC) από την Google.
// iOS: προσομοίωση elevation μέσω CALayer
import UIKit
extension UIView {
func applyElevation(level: Int) {
let elevationMap: [Int: (CGFloat, CGFloat, CGFloat)] = [
1: (0.05, 1, 2),
2: (0.08, 2, 4),
3: (0.11, 4, 8),
4: (0.12, 6, 12),
5: (0.14, 8, 16),
6: (0.15, 12, 24)
]
let (opacity, offset, radius) = elevationMap[level] ?? (0.08, 2, 4)
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = Float(opacity)
layer.shadowOffset = CGSize(width: 0, height: offset)
layer.shadowRadius = radius
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
}
}
// Χρήση
cardView.applyElevation(level: 3) // ισοδύναμο 6 dp
Material Components for iOS (MDC-iOS) — η βιβλιοθήκη της Google που μεταφέρει το Material Design elevation στο iOS. Το MDC-iOS παρέχει την κλάση MDCShadowElevation με προκαθορισμένες τιμές, το MDCShadowLayer για σχεδίαση σκιάς και το MDCCard για κάρτες Material με σωστό elevation. Το MDC-iOS υποστηρίζει κίνηση elevation κατά το πάτημα μέσω stateful shadow properties.
Συχνές ερωτήσεις
Elevation — το βασικό ύψος του στοιχείου στο επίπεδο Z (ορίζεται σε XML ή κώδικα). translationZ — δυναμική μετατόπιση για κίνηση (π.χ. όταν πατιέται). Οπτικό ύψος = elevation + translationZ. Το elevation κινείται μέσω ViewPropertyAnimator, το translationZ — μέσω ObjectAnimator. Χρησιμοποιήστε το translationZ για προσωρινές αλλαγές ύψους, το elevation — για μόνιμες.
Το Material Design 3 απλοποίησε το σύστημα elevation από 12 σε 7 επίπεδα για να μειώσει το γνωστικό φόρτο των σχεδιαστών και προγραμματιστών. Αντί για ακριβείς τιμές (2 dp, 4 dp, 8 dp) το M3 χρησιμοποιεί τόνους (Level 0–6) με προκαθορισμένες παραμέτρους σκιάς. Στο Android 12+ προστέθηκε υποστήριξη για χρωματιστές σκιές (color shadow) που προσαρμόζονται στο θέμα της εφαρμογής.
Το elevation από μόνο του δεν επηρεάζει την απόδοση, καθώς η σκιά σχεδιάζεται υλικομικά (GPU). Ωστόσο, οι συχνές αλλαγές elevation (κάθε καρέ κατά την κίνηση) μπορεί να προκαλέσουν επανασχεδίαση του View και των γειτονικών περιοχών. Για κίνηση χρησιμοποιήστε translationZ αντί να αλλάζετε το elevation, καθώς το translationZ είναι βελτιστοποιημένο για συχνές αλλαγές. Για σύνθετες οθόνες με 20+ στοιχεία με elevation, ενεργοποιήστε το view.setLayerType(View.LAYER_TYPE_HARDWARE, null).
Στο Android, το elevation πάντα σηκώνει το στοιχείο πάνω από το φόντο και αλλάζει τη σειρά σχεδίασης (z-order). Αν χρειάζεται μόνο σκιά χωρίς αλλαγή z-order, χρησιμοποιήστε cardUseCompatPadding στο CardView ή προσαρμοσμένη σχεδίαση σκιάς μέσω Paint.setShadowLayer() στο onDraw(). Στο Jetpack Compose χρησιμοποιήστε Modifier.graphicsLayer { shadowElevation = 4f }.
Τα στοιχεία Material Design έχουν σταθερό elevation: FloatingActionButton — 6 dp (όταν πατιέται 12 dp), CardView — 1–8 dp (ρυθμίζεται), BottomNavigationView — 8 dp, Toolbar — 4 dp, Snackbar — 6 dp, Dialog — 24 dp. Το MaterialButton από το Material Components Library έχει elevation 2 dp με αύξηση σε 8 dp όταν πατιέται.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης