Elevation — conceitos básicos, sombras e coordenada Z no Android

Autor: IT Sectr Publicado: 2026-02-28 Tempo de leitura: 9 min

Elevation é um conceito fundamental do Material Design que define a altura de um elemento ao longo do eixo z (perpendicular à tela). Elevation é medida em dp e afeta diretamente o tamanho e o desfoque da sombra projetada pelo elemento. Quanto maior a elevation, mais próximo o elemento está do usuário e mais perceptível é seu peso visual. De acordo com o Material Design 3 (Google, 2026), a elevation padrão para cartões é 1 dp, para FloatingActionButton — 6 dp, para diálogos — 24 dp. Saiba mais sobre a implementação de sombras no artigo sobre sombras em UI.

Pontos principais

  • Elevation — a altura de um elemento em relação à superfície da tela, medida em dp (Android).
  • No Android, elevation é controlada através da propriedade View de mesmo nome ou através de translationZ para animações.
  • OutlineProvider define a forma do elemento ao longo da qual a sombra de elevation é renderizada.
  • Material Design 3 utiliza 5 níveis básicos de elevation: 0, 1, 3, 6, 8, 12 e 24 dp.
  • No iOS não há um análogo direto de elevation — a altura é simulada através de CALayer.shadow com parâmetros.

O que é elevation?

Elevation é uma métrica introduzida no Material Design (Google I/O 2014) que descreve a posição de um elemento ao longo do eixo z. Ao contrário de x e y (o plano bidimensional da tela), z é a altura acima do plano. Elevation é expressa em dp (pixels independentes de densidade) e determina dois efeitos visuais: a sombra, que se torna maior e mais desfocada à medida que a elevation aumenta, e a ordem de desenho (elementos com elevation maior são desenhados sobre elementos com elevation menor).

Metáfora física: imagine folhas de papel sobre uma mesa. Quanto mais alta a pilha, mais longa a sombra da folha superior. Elevation no Material Design funciona exatamente da mesma forma — cada elemento é uma “folha digital” a uma determinada altura. Quando um usuário interage com um elemento (pressiona um botão, levanta um cartão), a elevation aumenta temporariamente — isso é chamado de “elevação de interação.”

De acordo com as Material Design Guidelines (Google, 2026), o uso adequado de elevation melhora a escaneabilidade da interface em 35%: os usuários encontram elementos interativos mais rapidamente porque eles “destacam” acima do conteúdo plano. No entanto, uma quantidade excessiva de níveis de elevation (mais de 4) reduz esse efeito — se tudo flutua, nada parece importante.

Elevation no Android: propriedades e API

No Android, elevation é implementada como uma propriedade integrada da View desde a API 21 (Android 5.0 Lollipop). View.elevation define a altura base em pixels (px), e View.translationZ fornece um deslocamento adicional para animações (por exemplo, ao pressionar). A altura visual total = elevation + translationZ. Ambas as propriedades suportam animação via ViewPropertyAnimator ou ObjectAnimator.

xml
<!-- XML: elevation e 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="Botão com elevação" />

StateListAnimator — um recurso XML para animar elevation e translationZ com base no estado da View (pressionado, focado, habilitado). Por exemplo, ao pressionar um botão, a elevation pode aumentar de 2 dp para 8 dp, criando um efeito de elevação. StateListAnimator suporta animação via ObjectAnimator para qualquer propriedade da View.

kotlin
// Kotlin: configuração programática de elevation
import android.animation.ObjectAnimator
import android.view.View

val myButton: View = findViewById(R.id.myButton)
myButton.elevation = 4f  // altura base em px

// Animação de elevation ao pressionar
val animator = ObjectAnimator.ofFloat(
    myButton,
    "translationZ",
    0f,
    8f
).apply {
    duration = 150
    repeatMode = ValueAnimator.REVERSE
    repeatCount = 1
}

OutlineProvider — um componente chave para a renderização correta da sombra de elevation. Por padrão, o Android usa ViewOutlineProvider.BACKGROUND, que cria um contorno com base no drawable de fundo. Para Views com cantos arredondados (via shape drawable), um OutlineProvider personalizado deve ser definido, caso contrário a sombra será retangular. Os componentes Material (CardView, MaterialButton) gerenciam o OutlineProvider automaticamente.

Níveis de elevation no Material Design 3

Material Design 3 (Material You) revisou o sistema de elevation em comparação com o Material Design 2. Em vez de 12 níveis fixos (Material 2), o M3 oferece 5 tons básicos, cada um correspondendo a um nível de elevation específico. Além disso, o M3 introduz o conceito de “sombra colorida” no Android 12+: a sombra pode ser tingida com a cor de destaque do tema em vez de ser preto-e-cinza.

NívelElevationUsoSombra (tema claro)
Nível 00 dpFundos, contêineres SurfaceSem sombra
Nível 11 dpCartões, ListItem, menus0.05 opacidade, 2px desfoque
Nível 23 dpBarra de busca, navegação inferior0.08 opacidade, 4px desfoque
Nível 36 dpFAB, FloatingActionButton0.11 opacidade, 8px desfoque
Nível 48 dpSnackbar, Bottom sheet0.12 opacidade, 12px desfoque
Nível 512 dpGaveta de navegação, Diálogo0.14 opacidade, 16px desfoque
Nível 624 dpDiálogo modal, menu pop-up0.15 opacidade, 24px desfoque

Elevação de interação — um aumento temporário na elevation durante a interação do usuário com um elemento. No Material Design 3, elementos interativos (botões, cartões) ganham +1–2 dp à sua elevation base quando pressionados (estado pressed) ou focados (estado focused). Para FloatingActionButton, a elevação de interação é de +6 dp. A animação de transição entre estados deve durar de 150 a 200 ms para uma resposta tátil natural.

Elevation no Jetpack Compose

Jetpack Compose suporta elevation através dos componentes Card e Surface, que possuem um parâmetro de elevation integrado. Ao contrário do sistema View, o Compose renderiza sombras através de seu próprio motor de renderização, garantindo comportamento consistente em todas as versões do Android (API 21+). Modifier.shadow() é um modificador de baixo nível para adicionar sombras a qualquer composable.

kotlin
// Jetpack Compose: elevation através de Surface e 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("Cartão controlado por elevation")
}

// Modifier.shadow para formas personalizadas
Surface(
    modifier = Modifier
        .shadow(elevation = 6.dp, shape = RoundedCornerShape(16.dp))
        .clickable { /* ação */ },
    shape = RoundedCornerShape(16.dp),
    color = MaterialTheme.colorScheme.surface
) { Text("Superfície com sombra") }

Animação de elevation no Compose é implementada via animateFloatAsState ou Animatable. Quando a elevation muda, o Compose anima automaticamente a sombra. Para elementos interativos, use M3 InteractionSource em combinação com animateElevation para que a elevation responda a pressionamentos, foco e arrasto. Material 3 no Compose 1.2+ suporta sombra colorida — uma sombra tingida com a cor primary Container do tema.

Elevation no iOS: simulação de altura

No iOS, não existe um análogo integrado de elevation do Material Design. As Human Interface Guidelines da Apple não usam coordenadas z para gerenciamento de sombras — em vez disso, os desenvolvedores configuram as sombras manualmente via CALayer.shadow*. No entanto, o conceito de hierarquia visual através de sombras e profundidade também existe no iOS: apresentações modais, UIAlertController, UIPopoverPresentationController — todos usam sombras para se separar do fundo.

Para simular elevation no iOS, os desenvolvedores usam uma combinação de shadowOpacity + shadowRadius + shadowOffset. Quanto maior a “altura” necessária, maior o raio de desfoque e o deslocamento da sombra. No SwiftUI, as sombras são definidas através do modificador .shadow() com parâmetros. Para comportamento semelhante ao Material no iOS, existem bibliotecas como Material Components for iOS (MDC) do Google.

swift
// iOS: simulação de elevation através de 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
    }
}

// Uso
cardView.applyElevation(level: 3)  // equivalente a 6 dp

Material Components for iOS (MDC-iOS) — uma biblioteca do Google que porta a elevation do Material Design para o iOS. O MDC-iOS fornece a classe MDCShadowElevation com valores predefinidos, MDCShadowLayer para renderização de sombras e MDCCard para cartões Material com elevation adequada. O MDC-iOS suporta animação de elevation ao pressionar através de propriedades de sombra com estado.

Perguntas frequentes

Qual é a diferença entre elevation e translationZ no Android?

Elevation — a altura base de um elemento no plano z (definida em XML ou código). translationZ — um deslocamento dinâmico para animações (por exemplo, ao pressionar). Altura visual = elevation + translationZ. elevation é animada via ViewPropertyAnimator, translationZ via ObjectAnimator. Use translationZ para mudanças temporárias de altura, elevation para mudanças permanentes.

Por que o Material Design 3 mudou o sistema de elevation?

O Material Design 3 simplificou o sistema de elevation de 12 para 7 níveis para reduzir a carga cognitiva de designers e desenvolvedores. Em vez de valores exatos (2 dp, 4 dp, 8 dp), o M3 usa tons (Nível 0–6) com parâmetros de sombra predefinidos. No Android 12+, foi adicionado suporte para sombras coloridas, que se adaptam ao tema do aplicativo.

Como a elevation afeta o desempenho do Android?

A elevation em si não afeta o desempenho porque as sombras são renderizadas por hardware (GPU). No entanto, mudanças frequentes na elevation (a cada quadro durante uma animação) podem causar redesenho da View e áreas adjacentes. Para animações, use translationZ em vez de alterar a elevation, pois translationZ é otimizado para mudanças frequentes. Para telas complexas com mais de 20 elementos com elevation, ative view.setLayerType(View.LAYER_TYPE_HARDWARE, null).

Como criar sombra de elevation sem levantar o elemento?

No Android, a elevation sempre levanta o elemento acima do fundo e altera a ordem de desenho (z-order). Se você precisa apenas da sombra sem alterar o z-order, use cardUseCompatPadding no CardView ou renderização de sombra personalizada via Paint.setShadowLayer() no onDraw(). No Jetpack Compose, use Modifier.graphicsLayer { shadowElevation = 4f }.

Qual é a elevation dos componentes padrão do Android?

Os componentes do Material Design têm valores fixos de elevation: FloatingActionButton — 6 dp (12 dp ao pressionar), CardView — 1–8 dp (configurável), BottomNavigationView — 8 dp, Toolbar — 4 dp, Snackbar — 6 dp, Dialog — 24 dp. MaterialButton da Material Components Library tem elevation de 2 dp, subindo para 8 dp quando pressionado.

Resumo

  • Elevation — altura z de um elemento no Material Design, medida em dp, determinando sombra e ordem de desenho.
  • No Android, a elevation é definida através da propriedade View desde a API 21, e translationZ é usado para animações.
  • OutlineProvider — necessário para sombras corretas em elementos com cantos arredondados.
  • Material Design 3 usa 7 níveis de elevation: Nível 0 (0 dp) — Nível 6 (24 dp).
  • Jetpack Compose gerencia elevation através de CardDefaults.cardElevation() e Modifier.shadow().
  • No iOS, a elevation é simulada através de CALayer.shadow com parâmetros predefinidos de opacidade/deslocamento/raio.
  • A elevação de interação (+1–6 dp) cria feedback tátil ao pressionar elementos interativos.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também