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 (незалежних від щільності пікселях) і визначає два візуальні ефекти: тінь, яка стає більшою та розмитішою зі зростанням 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, який створює контур на основі фонового 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 базових тонів, кожен з яких відповідає певному рівню elevation. Крім того, M3 вводить концепцію «кольорової тіні» (color shadow) на Android 12+: тінь може забарвлюватися в акцентний колір теми, а не бути чорно-сірою.

РівеньElevationЗастосуванняТінь (світла тема)
Рівень 00 dpФони, Surface контейнериБез тіні
Рівень 11 dpКартки, ListItem, меню0.05 прозорість, 2px розмиття
Рівень 23 dpПошуковий рядок, нижня навігація0.08 прозорість, 4px розмиття
Рівень 36 dpFAB, FloatingActionButton0.11 прозорість, 8px розмиття
Рівень 48 dpSnackbar, Bottom sheet0.12 прозорість, 12px розмиття
Рівень 512 dpНавігаційне меню, Діалог0.14 прозорість, 16px розмиття
Рівень 624 dpМодальний діалог, спливаюче меню0.15 прозорість, 24px розмиття

Interaction elevation — тимчасове збільшення elevation при взаємодії користувача з елементом. У Material Design 3 інтерактивні елементи (кнопки, картки) отримують +1–2 dp до базової elevation при натисканні (pressed state) або фокусуванні (focused state). Для FloatingActionButton interaction elevation становить +6 dp. Анімація переходу між станами повинна тривати 150–200 мс для природного тактильного відгуку.

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 використовує тони (Рівень 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-порядку, використовуйте 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: Рівень 0 (0 dp) — Рівень 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також