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

УровеньElevationПрименениеТень (light theme)
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("Поверхность с shadow") }

Анимация 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 вместо change 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: 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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