Elevation — βασικές αρχές, σκιές και συντεταγμένη Z στο Android

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

Elevation — η βασική έννοια του Material Design που καθορίζει το ύψος ενός στοιχείου κατά μήκος του άξονα Z (κάθετα στην οθόνη). Το elevation μετριέται σε dp και επηρεάζει άμεσα το μέγεθος και το θάμπωμα της σκιάς που ρίχνει το στοιχείο. Όσο υψηλότερο είναι το elevation, τόσο πιο κοντά στο χρήστη είναι το στοιχείο και τόσο πιο εμφανές είναι το οπτικό του βάρος. Σύμφωνα με το Material Design 3 (Google, 2026), το τυπικό elevation για κάρτες είναι 1 dp, για FloatingActionButton — 6 dp, για διαλόγους — 24 dp. Διαβάστε περισσότερα σχετικά με την υλοποίηση σκιών στο άρθρο για τις σκιές στο UI.

Κύρια σημεία

  • Elevation — ύψος του στοιχείου σε σχέση με την επιφάνεια της οθόνης, μετρούμενο σε dp (Android).
  • Στο Android, το elevation διαχειρίζεται μέσω της ιδιότητας View με το ίδιο όνομα ή μέσω translationZ για κινούμενα σχέδια.
  • OutlineProvider καθορίζει το σχήμα του στοιχείου βάσει του οποίου σχεδιάζεται η σκιά από το elevation.
  • Το Material Design 3 χρησιμοποιεί 5 βασικά επίπεδα elevation: 0, 1, 3, 6, 8, 12 και 24 dp.
  • Στο iOS δεν υπάρχει άμεσο ανάλογο του elevation — το ύψος προσομοιώνεται μέσω CALayer.shadow με παραμέτρους.

Τι είναι το elevation;

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) μειώνει αυτό το αποτέλεσμα: αν όλα τα στοιχεία αιωρούνται, κανένα δεν φαίνεται σημαντικό.

Elevation στο Android: ιδιότητες και API

Στο Android το elevation έχει υλοποιηθεί ως ενσωματωμένη ιδιότητα View από το API 21 (Android 5.0 Lollipop). Το View.elevation ορίζει το βασικό ύψος σε pixels (px), και το View.translationZ — μια πρόσθετη μετατόπιση για κινούμενα σχέδια (π.χ. όταν πατιέται). Συνολικό οπτικό ύψος = elevation + translationZ. Και οι δύο ιδιότητες υποστηρίζουν κινούμενα σχέδια μέσω ViewPropertyAnimator ή ObjectAnimator.

xml
<!-- 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
// 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 αυτόματα.

Επίπεδα elevation στο Material Design 3

Material Design 3 (Material You) αναθεώρησε το σύστημα elevation σε σύγκριση με το Material Design 2. Αντί για 12 σταθερά επίπεδα (Material 2) το M3 προσφέρει 5 βασικούς τόνους (tones), καθένας από τους οποίους αντιστοιχεί σε ένα συγκεκριμένο επίπεδο elevation. Επιπλέον, το M3 εισάγει την έννοια της «χρωματιστής σκιάς» (color shadow) στο Android 12+: η σκιά μπορεί να χρωματιστεί στο χρώμα έμφασης του θέματος, αντί να είναι μαύρο-γκρι.

ΕπίπεδοElevationΧρήσηΣΚΙΑ (φωτεινό θέμα)
Level 00 dpΦόντα, δοχεία SurfaceΧωρίς σκιά
Level 11 dpΚάρτες, ListItem, μενού0.05 opacity, 2px blur
Level 23 dpSearch bar, Bottom navigation0.08 opacity, 4px blur
Level 36 dpFAB, FloatingActionButton0.11 opacity, 8px blur
Level 48 dpSnackbar, Bottom sheet0.12 opacity, 12px blur
Level 512 dpNavigation drawer, Dialog0.14 opacity, 16px blur
Level 624 dpModal dialog, Popup menu0.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 για φυσική απτική απόκριση.

Elevation στο Jetpack Compose

Jetpack Compose υποστηρίζει elevation μέσω των στοιχείων Card και Surface, τα οποία διαθέτουν ενσωματωμένη παράμετρο elevation. Σε αντίθεση με το View System, το Compose σχεδιάζει σκιές μέσω της δικής του μηχανής απόδοσης, εξασφαλίζοντας την ίδια συμπεριφορά σε όλες τις εκδόσεις Android (API 21+). Το Modifier.shadow() — ένας τροποποιητής χαμηλού επιπέδου για προσθήκη σκιάς σε οποιοδήποτε composable.

kotlin
// 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 του θέματος.

Elevation στο iOS: προσομοίωση ύψους

Στο 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.

swift
// 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 και translationZ στο Android;

Elevation — το βασικό ύψος του στοιχείου στο επίπεδο Z (ορίζεται σε XML ή κώδικα). translationZ — δυναμική μετατόπιση για κίνηση (π.χ. όταν πατιέται). Οπτικό ύψος = elevation + translationZ. Το elevation κινείται μέσω ViewPropertyAnimator, το translationZ — μέσω ObjectAnimator. Χρησιμοποιήστε το translationZ για προσωρινές αλλαγές ύψους, το elevation — για μόνιμες.

Γιατί το Material Design 3 άλλαξε το σύστημα elevation;

Το Material Design 3 απλοποίησε το σύστημα elevation από 12 σε 7 επίπεδα για να μειώσει το γνωστικό φόρτο των σχεδιαστών και προγραμματιστών. Αντί για ακριβείς τιμές (2 dp, 4 dp, 8 dp) το M3 χρησιμοποιεί τόνους (Level 0–6) με προκαθορισμένες παραμέτρους σκιάς. Στο Android 12+ προστέθηκε υποστήριξη για χρωματιστές σκιές (color shadow) που προσαρμόζονται στο θέμα της εφαρμογής.

Πώς επηρεάζει το elevation την απόδοση του Android;

Το elevation από μόνο του δεν επηρεάζει την απόδοση, καθώς η σκιά σχεδιάζεται υλικομικά (GPU). Ωστόσο, οι συχνές αλλαγές elevation (κάθε καρέ κατά την κίνηση) μπορεί να προκαλέσουν επανασχεδίαση του View και των γειτονικών περιοχών. Για κίνηση χρησιμοποιήστε translationZ αντί να αλλάζετε το elevation, καθώς το translationZ είναι βελτιστοποιημένο για συχνές αλλαγές. Για σύνθετες οθόνες με 20+ στοιχεία με elevation, ενεργοποιήστε το view.setLayerType(View.LAYER_TYPE_HARDWARE, null).

Πώς να κάνουμε elevation μόνο για σκιά, χωρίς να σηκώνουμε το στοιχείο;

Στο Android, το elevation πάντα σηκώνει το στοιχείο πάνω από το φόντο και αλλάζει τη σειρά σχεδίασης (z-order). Αν χρειάζεται μόνο σκιά χωρίς αλλαγή z-order, χρησιμοποιήστε cardUseCompatPadding στο CardView ή προσαρμοσμένη σχεδίαση σκιάς μέσω Paint.setShadowLayer() στο onDraw(). Στο Jetpack Compose χρησιμοποιήστε Modifier.graphicsLayer { shadowElevation = 4f }.

Ποιο είναι το elevation των τυπικών στοιχείων Android;

Τα στοιχεία 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 όταν πατιέται.

Περίληψη

  • Elevation — ύψος Z στοιχείου στο Material Design, μετρούμενο σε dp, που καθορίζει σκιά και σειρά σχεδίασης.
  • Στο Android, το elevation ορίζεται μέσω της ιδιότητας View από το API 21, και το translationZ — για κινούμενα σχέδια.
  • OutlineProvider — απαραίτητο για σωστή σκιά σε στοιχεία με στρογγυλεμένες γωνίες.
  • Το Material Design 3 χρησιμοποιεί 7 επίπεδα elevation: Level 0 (0 dp) — Level 6 (24 dp).
  • Jetpack Compose διαχειρίζεται το elevation μέσω CardDefaults.cardElevation() και Modifier.shadow().
  • Στο iOS, το elevation προσομοιώνεται μέσω CALayer.shadow με προκαθορισμένες παραμέτρους opacity/offset/radius.
  • Το Interaction elevation (+1–6 dp) δημιουργεί απτική ανάδραση κατά το πάτημα διαδραστικών στοιχείων.

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

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

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

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