Elevation — grunder, skuggor och Z-koordinat i Android

Författare: IT Sectr Publicerad: 2026-02-28 Lästid: 9 min

Elevation — det grundläggande konceptet i Material Design som bestämmer höjden på ett element längs Z-axeln (vinkelrätt mot skärmen). Elevation mäts i dp och påverkar direkt storleken och oskärpan på skuggan som elementet kastar. Ju högre elevation, desto närmare användaren är elementet och desto mer märkbar är dess visuella vikt. Enligt Material Design 3 (Google, 2026) är standardelevation för kort 1 dp, för FloatingActionButton — 6 dp, för dialogrutor — 24 dp. Läs mer om implementering av skuggor i artikeln om skuggor i UI.

Huvudpunkter

  • Elevation — höjd på elementet relativt skärmytan, mätt i dp (Android).
  • I Android hanteras elevation via View-egenskapen med samma namn eller via translationZ för animation.
  • OutlineProvider bestämmer formen på elementet efter vilket skuggan från elevation ritas.
  • Material Design 3 använder 5 grundnivåer elevation: 0, 1, 3, 6, 8, 12 och 24 dp.
  • CALayer.shadow

    med parametrar.

Vad är elevation?

Elevation — är ett mått som introducerades i Material Design (Google I/O 2014) som beskriver positionen av ett element längs Z-axeln. Till skillnad från X och Y (skärmens tvådimensionella plan) är Z höjden ovanför planet. Elevation uttrycks i dp (density-independent pixels) och bestämmer två visuella effekter: skugga (shadow) som blir större och mer oskarp med ökande elevation, och ritordning (element med högre elevation ritas ovanför element med lägre elevation).

Fysisk metafor: föreställ dig pappersark på ett bord. Ju högre stapel, desto längre skugga från det översta arket. Elevation i Material Design fungerar på exakt samma sätt: varje element är ett „digitalt ark" på en viss höjd. När användaren interagerar med ett element (trycker på en knapp, lyfter ett kort) ökar elevation tillfälligt — detta kallas „interaktionselevation" (interaction elevation).

Enligt Material Design Guidelines (Google, 2026) förbättrar korrekt användning av elevation gränssnittets skannbarhet med 35%: användare hittar interaktiva element snabbare eftersom de „stickar ut" ovanför det platta innehållet. Ett överdrivet antal elevationsnivåer (mer än 4) minskar dock denna effekt: om alla element svävar, verkar inget viktigt.

Elevation i Android: egenskaper och API

I Android är elevation implementerad som en inbyggd View-egenskap från API 21 (Android 5.0 Lollipop). View.elevation ställer in bashöjden i pixlar (px), och View.translationZ — en extra förskjutning för animationer (t.ex. vid tryckning). Total visuell höjd = elevation + translationZ. Båda egenskaperna stöder animering via ViewPropertyAnimator eller ObjectAnimator.

xml
<!-- XML: elevation och 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="Knapp med elevation" />

StateListAnimator — en XML-resurs för att animera elevation och translationZ beroende på View-tillstånd (pressed, focused, enabled). Till exempel, när en knapp trycks in kan elevation öka från 2 dp till 8 dp, vilket skapar en lyfteffekt. StateListAnimator stöder animering via ObjectAnimator för alla View-egenskaper.

kotlin
// Kotlin: programmatisk konfiguration av elevation
import android.animation.ObjectAnimator
import android.view.View

val myButton: View = findViewById(R.id.myButton)
myButton.elevation = 4f  // bashöjd i px

// Elevationsanimation vid tryckning
val animator = ObjectAnimator.ofFloat(
    myButton,
    "translationZ",
    0f,
    8f
).apply {
    duration = 150
    repeatMode = ValueAnimator.REVERSE
    repeatCount = 1
}

OutlineProvider — nyckelkomponenten för korrekt ritning av skuggan från elevation. Som standard använder Android ViewOutlineProvider.BACKGROUND, som skapar en kontur baserat på bakgrunds-drawablen. För View med rundade hörn (via shape drawable) måste en anpassad OutlineProvider ställas in, annars blir skuggan rektangulär. Materialkomponenter (CardView, MaterialButton) hanterar OutlineProvider automatiskt.

Elevationsnivåer i Material Design 3

Material Design 3 (Material You) har reviderat elevationssystemet jämfört med Material Design 2. Istället för 12 fasta nivåer (Material 2) erbjuder M3 5 grundtoner (tones), som var och en motsvarar en specifik elevationsnivå. Dessutom introducerar M3 konceptet „färgad skugga" (color shadow) på Android 12+: skuggan kan färgas i temats accentfärg, istället för att vara svart-grå.

NivåElevationAnvändningSKUGGA (ljust tema)
Level 00 dpBakgrunder, Surface-behållareUtan skugga
Level 11 dpKort, ListItem, menyer0.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 — tillfällig ökning av elevation vid användarens interaktion med elementet. I Material Design 3 får interaktiva element (knappar, kort) +1–2 dp till bas-elevation vid tryckning (pressed state) eller fokus (focused state). För FloatingActionButton är interaction elevation +6 dp. Övergångsanimationen mellan tillstånd bör vara 150–200 ms för naturlig taktil respons.

Elevation i Jetpack Compose

Jetpack Compose stöder elevation via komponenterna Card och Surface, som har en inbyggd elevation-parameter. Till skillnad från View System ritar Compose skuggor via sin egen renderingsmotor, vilket säkerställer samma beteende på alla Android-versioner (API 21+). Modifier.shadow() — en lågnivåmodifierare för att lägga till skugga till valfri composable.

kotlin
// Jetpack Compose: elevation via Surface och 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("Elevationsstyrt kort")
}

// Modifier.shadow för anpassade former
Surface(
    modifier = Modifier
        .shadow(elevation = 6.dp, shape = RoundedCornerShape(16.dp))
        .clickable { /* åtgärd */ },
    shape = RoundedCornerShape(16.dp),
    color = MaterialTheme.colorScheme.surface
) { Text("Yta med skugga") }

Elevationsanimation i Compose implementeras via animateFloatAsState eller Animatable. När elevation ändras animerar Compose automatiskt skuggan. För interaktiva element, använd M3 InteractionSource i kombination med animateElevation så att elevation reagerar på tryck, fokus och dragning. Material 3 i Compose 1.2+ stöder color shadow — skugga färgad i temats primära Container-färg.

Elevation på iOS: simulering av höjd

På iOS finns ingen inbyggd motsvarighet till elevation från Material Design. Apples Human Interface Guidelines använder inte Z-koordinat för att hantera skuggor — istället konfigurerar utvecklare skuggor manuellt via CALayer.shadow*. Konceptet med visuell hierarki genom skuggor och djup finns dock även på iOS: modala presentationer, UIAlertController, UIPopoverPresentationController — alla använder skuggor för att separeras från bakgrunden.

För simulering av elevation på iOS använder utvecklare en kombination av shadowOpacity + shadowRadius + shadowOffset. Ju högre erforderlig „höjd", desto större oskärperadie och förskjutning av skuggan. I SwiftUI ställs skuggor in via modifieraren .shadow() med parametrar. För Material-liknande beteende på iOS finns bibliotek Material Components for iOS (MDC) från Google.

swift
// iOS: simulering av elevation via 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
    }
}

// Användning
cardView.applyElevation(level: 3)  // motsvarande 6 dp

Material Components for iOS (MDC-iOS) — Googles bibliotek som portar Material Design elevation till iOS. MDC-iOS tillhandahåller klassen MDCShadowElevation med fördefinierade värden, MDCShadowLayer för att rita skugga och MDCCard för Material-kort med korrekt elevation. MDC-iOS stöder elevationsanimation vid tryckning via stateful shadow properties.

Vanliga frågor

Vad är skillnaden mellan elevation och translationZ i Android?

Elevation — elementets bashöjd i Z-planet (ställs in i XML eller kod). translationZ — dynamisk förskjutning för animation (t.ex. vid tryckning). Visuell höjd = elevation + translationZ. elevation animeras via ViewPropertyAnimator, translationZ — via ObjectAnimator. Använd translationZ för tillfälliga höjdförändringar, elevation — för permanenta.

Varför ändrade Material Design 3 elevationssystemet?

Material Design 3 förenklade elevationssystemet från 12 till 7 nivåer för att minska den kognitiva belastningen på designers och utvecklare. Istället för exakta värden (2 dp, 4 dp, 8 dp) använder M3 toner (Level 0–6) med fördefinierade skuggparametrar. På Android 12+ lades stöd för färgade skuggor (color shadow) till som anpassar sig till appens tema.

Hur påverkar elevation Android-prestanda?

Elevation i sig påverkar inte prestanda, eftersom skuggan ritas hårdvarumässigt (GPU). Frekventa ändringar av elevation (varje bildruta vid animation) kan dock orsaka omritning av View och angränsande områden. För animation, använd translationZ istället för att ändra elevation, eftersom translationZ är optimerad för frekventa ändringar. För komplexa skärmar med 20+ element med elevation, aktivera view.setLayerType(View.LAYER_TYPE_HARDWARE, null).

Hur gör man elevation endast för skugga, utan att lyfta elementet?

I Android lyfter elevation alltid elementet ovanför bakgrunden och ändrar ritordningen (z-order). Om du bara behöver skugga utan att ändra z-order, använd cardUseCompatPadding i CardView eller anpassad skuggitning via Paint.setShadowLayer() i onDraw(). I Jetpack Compose använd Modifier.graphicsLayer { shadowElevation = 4f }.

Vilken elevation har standard Android-komponenter?

Material Design-komponenter har fast elevation: FloatingActionButton — 6 dp (vid tryckning 12 dp), CardView — 1–8 dp (konfigurerbar), BottomNavigationView — 8 dp, Toolbar — 4 dp, Snackbar — 6 dp, Dialog — 24 dp. MaterialButton från Material Components Library har elevation 2 dp med höjning till 8 dp vid tryckning.

Sammanfattning

  • Elevation — Z-höjd för element i Material Design, mätt i dp, som bestämmer skugga och ritordning.
  • I Android ställs elevation in via View-egenskapen från API 21, och translationZ — för animationer.
  • OutlineProvider — krävs för korrekt skugga hos element med rundade hörn.
  • Material Design 3 använder 7 elevationsnivåer: Level 0 (0 dp) — Level 6 (24 dp).
  • Jetpack Compose hanterar elevation via CardDefaults.cardElevation() och Modifier.shadow().
  • På iOS simuleras elevation via CALayer.shadow med fördefinierade parametrar opacity/offset/radius.
  • Interaction elevation (+1–6 dp) skapar taktil återkoppling vid tryckning på interaktiva element.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också