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 задава базовата височина в пиксели (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="Бутон с елевация" />

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, който създава контур на базата на 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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също