Elevation to podstawowa koncepcja Material Design, określająca wysokość elementu wzdłuż osi Z (prostopadle do ekranu). Elevation mierzy się w dp i bezpośrednio wpływa na rozmiar i rozmycie cienia rzucanego przez element. Im wyższe elevation, tym bliżej użytkownika znajduje się element i tym bardziej widoczna jest jego waga wizualna. Według Material Design 3 (Google, 2026), standardowe elevation dla kart wynosi 1 dp, dla FloatingActionButton — 6 dp, dla okien dialogowych — 24 dp. Więcej o implementacji cieni przeczytasz w artykule o cieniach w UI.
Najważniejsze
Elevation — to metryka wprowadzona w Material Design (Google I/O 2014), która opisuje położenie elementu wzdłuż osi Z. W przeciwieństwie do X i Y (dwuwymiarowa płaszczyzna ekranu), Z to wysokość nad płaszczyzną. Elevation wyraża się w dp (density-independent pixels) i określa dwa efekty wizualne: cień (shadow), który staje się większy i bardziej rozmyty wraz ze wzrostem elevation, oraz kolejność rysowania (elementy z wyższym elevation rysują się nad elementami z niższym).
Metafora fizyczna: wyobraź sobie kartki papieru na stole. Im wyższy stos, tym dłuższy cień rzuca górna kartka. Elevation w Material Design działa dokładnie tak samo: każdy element to „cyfrowa kartka" na określonej wysokości. Gdy użytkownik wchodzi w interakcję z elementem (naciska przycisk, podnosi kartę), elevation tymczasowo wzrasta — nazywa się to „elewacją przy interakcji" (interaction elevation).
Według Material Design Guidelines (Google, 2026), prawidłowe użycie elevation poprawia skanowalność interfejsu o 35%: użytkownicy szybciej znajdują interaktywne elementy, ponieważ „wystają" ponad płaską treść. Jednak nadmierna liczba poziomów elevation (powyżej 4) osłabia ten efekt: jeśli wszystkie elementy unoszą się, żaden nie wydaje się ważny.
W Androidzie elevation jest zaimplementowane jako wbudowana właściwość View od API 21 (Android 5.0 Lollipop). View.elevation ustawia podstawową wysokość w pikselach (px), a View.translationZ — dodatkowe przesunięcie do animacji (np. przy naciśnięciu). Całkowita wysokość wizualna = elevation + translationZ. Obie właściwości obsługują animację przez ViewPropertyAnimator lub ObjectAnimator.
<!-- XML: elevation i 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="Przycisk z elewacją" />
StateListAnimator — zasób XML do animacji elevation i translationZ w zależności od stanu View (pressed, focused, enabled). Na przykład przy naciśnięciu przycisku elevation może wzrosnąć z 2 dp do 8 dp, tworząc efekt uniesienia. StateListAnimator obsługuje animację przez ObjectAnimator dla dowolnych właściwości View.
// Kotlin: programowa konfiguracja elevation
import android.animation.ObjectAnimator
import android.view.View
val myButton: View = findViewById(R.id.myButton)
myButton.elevation = 4f // podstawowa wysokość w px
// Animacja elevation przy naciśnięciu
val animator = ObjectAnimator.ofFloat(
myButton,
"translationZ",
0f,
8f
).apply {
duration = 150
repeatMode = ValueAnimator.REVERSE
repeatCount = 1
}
OutlineProvider — kluczowy komponent do prawidłowego rysowania cienia od elevation. Domyślnie Android używa ViewOutlineProvider.BACKGROUND, który tworzy kontur na podstawie tła drawable. Dla View z zaokrąglonymi rogami (przez shape drawable) trzeba ustawić niestandardowy OutlineProvider, w przeciwnym razie cień będzie prostokątny. Komponenty Material (CardView, MaterialButton) zarządzają OutlineProvider automatycznie.
Material Design 3 (Material You) zmienił system elevation w porównaniu z Material Design 2. Zamiast 12 stałych poziomów (Material 2) M3 oferuje 5 podstawowych tonów (tones), z których każdy odpowiada określonemu poziomowi elevation. Ponadto M3 wprowadza koncepcję „kolorowego cienia" (color shadow) na Androidzie 12+: cień może być zabarwiony na akcentowy kolor motywu, zamiast być czarno-szarym.
| Poziom | Elevation | Zastosowanie | CIEŃ (motyw jasny) |
|---|---|---|---|
| Level 0 | 0 dp | Tła, kontenery Surface | Bez cienia |
| Level 1 | 1 dp | Karty, ListItem, menu | 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 — tymczasowe zwiększenie elevation przy interakcji użytkownika z elementem. W Material Design 3 elementy interaktywne (przyciski, karty) otrzymują +1–2 dp do podstawowej elevation przy naciśnięciu (pressed state) lub fokucie (focused state). Dla FloatingActionButton interaction elevation wynosi +6 dp. Animacja przejścia między stanami powinna trwać 150–200 ms dla naturalnego odczucia dotykowego.
Jetpack Compose obsługuje elevation przez komponenty Card i Surface, które mają wbudowany parametr elevation. W przeciwieństwie do View System, Compose rysuje cienie przez własny silnik renderujący, co zapewnia jednakowe działanie na wszystkich wersjach Androida (API 21+). Modifier.shadow() — niskopoziomowy modyfikator do dodawania cienia do dowolnego composable.
// Jetpack Compose: elevation przez Surface i 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("Karta zarządzana przez elevation")
}
// Modifier.shadow dla niestandardowych kształtów
Surface(
modifier = Modifier
.shadow(elevation = 6.dp, shape = RoundedCornerShape(16.dp))
.clickable { /* akcja */ },
shape = RoundedCornerShape(16.dp),
color = MaterialTheme.colorScheme.surface
) { Text("Powierzchnia z cieniem") }
Animacja elevation w Compose jest realizowana przez animateFloatAsState lub Animatable. Przy zmianie elevation Compose automatycznie animuje cień. Dla elementów interaktywnych używaj M3 InteractionSource w kombinacji z animateElevation, aby elevation reagowała na naciśnięcia, fokus i przeciąganie. Material 3 w Compose 1.2+ obsługuje color shadow — cień zabarwiony na kolor primary Container motywu.
Na iOS nie ma wbudowanego odpowiednika elevation z Material Design. Human Interface Guidelines Apple nie używają współrzędnej Z do zarządzania cieniami — zamiast tego programiści konfigurują cienie ręcznie przez CALayer.shadow*. Jednak koncepcja hierarchii wizualnej przez cienie i głębię istnieje również w iOS: prezentacje modalne, UIAlertController, UIPopoverPresentationController — wszystkie używają cieni do oddzielenia od tła.
Do symulacji elevation na iOS programiści używają kombinacji shadowOpacity + shadowRadius + shadowOffset. Im wyższa wymagana „wysokość", tym większy promień rozmycia i przesunięcie cienia. W SwiftUI cienie są ustawiane przez modyfikator .shadow() z parametrami. Do zachowania podobnego do Material na iOS istnieją biblioteki Material Components for iOS (MDC) od Google.
// iOS: symulacja elevation przez 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
}
}
// Użycie
cardView.applyElevation(level: 3) // ekwiwalent 6 dp
Material Components for iOS (MDC-iOS) — biblioteka Google, która przenosi Material Design elevation na iOS. MDC-iOS udostępnia klasę MDCShadowElevation z predefiniowanymi wartościami, MDCShadowLayer do rysowania cienia i MDCCard dla kart Material z prawidłowym elevation. MDC-iOS obsługuje animację elevation przy naciśnięciu przez stateful shadow properties.
Często zadawane pytania
Elevation — podstawowa wysokość elementu w płaszczyźnie Z (ustawiana w XML lub kodzie). translationZ — dynamiczne przesunięcie do animacji (np. przy naciśnięciu). Wysokość wizualna = elevation + translationZ. elevation jest animowane przez ViewPropertyAnimator, translationZ — przez ObjectAnimator. Używaj translationZ do tymczasowych zmian wysokości, elevation — do stałych.
Material Design 3 uprościł system elevation z 12 do 7 poziomów, aby zmniejszyć obciążenie poznawcze projektantów i programistów. Zamiast dokładnych wartości (2 dp, 4 dp, 8 dp) M3 używa tonów (Level 0–6) z predefiniowanymi parametrami cienia. Na Androidzie 12+ dodano obsługę kolorowych cieni (color shadow), które dostosowują się do motywu aplikacji.
Elevation samo w sobie nie wpływa na wydajność, ponieważ cień jest rysowany sprzętowo (GPU). Jednak częste zmiany elevation (każda klatka przy animacji) mogą powodować przerysowanie View i sąsiadujących obszarów. Do animacji używaj translationZ zamiast zmiany elevation, ponieważ translationZ jest zoptymalizowany do częstych zmian. Dla złożonych ekranów z 20+ elementami z elevation włącz view.setLayerType(View.LAYER_TYPE_HARDWARE, null).
W Androidzie elevation zawsze podnosi element nad tłem i zmienia kolejność rysowania (z-order). Jeśli potrzebujesz tylko cienia bez zmiany z-order, użyj cardUseCompatPadding w CardView lub niestandardowego rysowania cienia przez Paint.setShadowLayer() w onDraw(). W Jetpack Compose użyj Modifier.graphicsLayer { shadowElevation = 4f }.
Komponenty Material Design mają stałe elevation: FloatingActionButton — 6 dp (przy naciśnięciu 12 dp), CardView — 1–8 dp (konfigurowalne), BottomNavigationView — 8 dp, Toolbar — 4 dp, Snackbar — 6 dp, Dialog — 24 dp. MaterialButton z Material Components Library ma elevation 2 dp z podniesieniem do 8 dp przy naciśnięciu.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również