Elevation — podstawy, cienie i współrzędna Z w Androidzie

Autor: IT Sectr Opublikowano: 2026-02-28 Czas czytania: 9 min

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 — wysokość elementu względem powierzchni ekranu, mierzona w dp (Android).
  • W Androidzie elevation jest zarządzane przez właściwość View lub przez translationZ do animacji.
  • OutlineProvider określa kształt elementu, według którego rysowany jest cień od elevation.
  • Material Design 3 używa 5 podstawowych poziomów elevation: 0, 1, 3, 6, 8, 12 i 24 dp.
  • Na iOS nie ma bezpośredniego odpowiednika elevation — wysokość symuluje się przez CALayer.shadow z parametrami.

Czym jest elevation?

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.

Elevation w Androidzie: właściwości i API

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

Poziomy elevation w Material Design 3

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.

PoziomElevationZastosowanieCIEŃ (motyw jasny)
Level 00 dpTła, kontenery SurfaceBez cienia
Level 11 dpKarty, ListItem, menu0.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 — 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.

Elevation w Jetpack Compose

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.

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

Elevation na iOS: symulacja wysokości

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.

swift
// 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

Jaka jest różnica między elevation a translationZ w Androidzie?

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.

Dlaczego Material Design 3 zmienił system elevation?

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.

Jak elevation wpływa na wydajność Androida?

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

Jak zrobić elevation tylko dla cienia, bez podnoszenia elementu?

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

Jakie elevation mają standardowe komponenty Androida?

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

  • Elevation — wysokość Z elementu w Material Design, mierzona w dp i określająca cień oraz kolejność rysowania.
  • W Androidzie elevation jest ustawiane przez właściwość View od API 21, a translationZ — do animacji.
  • OutlineProvider — wymagany do prawidłowego cienia dla elementów z zaokrąglonymi rogami.
  • Material Design 3 używa 7 poziomów elevation: Level 0 (0 dp) — Level 6 (24 dp).
  • Jetpack Compose zarządza elevation przez CardDefaults.cardElevation() i Modifier.shadow().
  • Na iOS elevation symuluje się przez CALayer.shadow z predefiniowanymi parametrami opacity/offset/radius.
  • Interaction elevation (+1–6 dp) tworzy dotykowe sprzężenie zwrotne przy naciśnięciu elementów interaktywnych.

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.

Omów projekt

Przeczytaj również