Elevation — 基本、シャドウとAndroidにおけるZ座標

著者: IT Sectr 公開日: 2026-02-28 読了時間: 9 分

Elevation は、z軸(画面に垂直)に沿った要素の高さを定義するMaterial Designの基本概念です。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(画面の2次元平面)とは異なり、zは平面上の高さです。Elevationはdp(密度非依存ピクセル)で表現され、2つの視覚効果を決定します:elevationが増加するにつれて大きくぼやけるシャドウ、および描画順序(高いelevationの要素は低いelevationの要素の上に描画されます)。

物理的な比喩:テーブルの上の紙の束を想像してください。スタックが高いほど、一番上の紙の影は長くなります。Material DesignのElevationもまったく同じように機能します — 各要素は特定の高さにある「デジタルシート」です。ユーザーが要素とインタラクションする(ボタンを押す、カードを持ち上げる)と、elevationが一時的に増加します — これを「インタラクションelevation」と呼びます。

Material Design Guidelines(Google、2026)によると、elevationを適切に使用することで、インターフェースのスキャン可能性が35%向上します:ユーザーはインタラクティブな要素をより速く見つけられます。なぜなら、それらはフラットなコンテンツの上に「浮かび上がる」からです。ただし、elevationレベルの過剰な数(4つ以上)はこの効果を低下させます — すべてが浮いていると、何も重要に見えません。

AndroidでのElevation:プロパティとAPI

Androidでは、elevationはAPI 21(Android 5.0 Lollipop)以降、Viewの組み込みプロパティとして実装されています。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="Elevation付きボタン" />

StateListAnimator — Viewの状態(押下、フォーカス、有効)に基づいてelevationとtranslationZをアニメーション化するXMLリソースです。たとえば、ボタンを押すと、elevationが2 dpから8 dpに増加し、浮き上がり効果を生み出します。StateListAnimatorは、任意のViewプロパティに対してObjectAnimatorを介したアニメーションをサポートしています。

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を自動的に管理します。

Material Design 3でのElevationレベル

Material Design 3(Material You)は、Material Design 2と比較してelevationシステムを改訂しました。12の固定レベル(Material 2)の代わりに、M3は5つの基本トーンを提供し、それぞれが特定のelevationレベルに対応します。さらに、M3はAndroid 12+で「カラーシャドウ」の概念を導入しました:シャドウを黒灰色ではなく、テーマのアクセントカラーで着色できます。

レベルElevation使用法シャドウ(ライトテーマ)
レベル00 dp背景、Surfaceコンテナシャドウなし
レベル11 dpカード、ListItem、メニュー0.05不透明度、2pxぼかし
レベル23 dp検索バー、ボトムナビゲーション0.08不透明度、4pxぼかし
レベル36 dpFAB、FloatingActionButton0.11不透明度、8pxぼかし
レベル48 dpSnackbar、ボトムシート0.12不透明度、12pxぼかし
レベル512 dpナビゲーションドロワー、ダイアログ0.14不透明度、16pxぼかし
レベル624 dpモーダルダイアログ、ポップアップメニュー0.15不透明度、24pxぼかし

インタラクションelevation — ユーザーが要素とインタラクションする際のelevationの一時的な増加です。Material Design 3では、インタラクティブな要素(ボタン、カード)は、押下時(pressed状態)またはフォーカス時(focused状態)にベースelevationに+1~2 dpを獲得します。FloatingActionButtonの場合、インタラクションelevationは+6 dpです。自然な触覚応答を得るには、状態間の遷移アニメーションは150~200 ms持続する必要があります。

Jetpack ComposeでのElevation

Jetpack Compose は、組み込みのelevationパラメーターを持つCardおよびSurfaceコンポーネントを介してelevationをサポートしています。Viewシステムとは異なり、Composeは独自のレンダリングエンジンを介してシャドウをレンダリングするため、すべてのAndroidバージョン(API 21+)で一貫した動作を保証します。Modifier.shadow()は、任意のcomposableにシャドウを追加するための低レベルのモディファイアです。

kotlin
// Jetpack Compose: SurfaceとCardによるelevation
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が押下、フォーカス、ドラッグに応答するようにします。Compose 1.2+のMaterial 3はカラーシャドウをサポートしています — テーマのprimary Containerカラーで着色されたシャドウです。

iOSでのElevation:高さのシミュレーション

iOSでは、Material Designのelevationに組み込みの類似物はありません。AppleのHuman Interface Guidelinesは、シャドウ管理にz座標を使用しません — 代わりに、開発者はCALayer.shadow*を介して手動でシャドウを設定します。ただし、シャドウと奥行きによる視覚的階層の概念はiOSにも存在します:モーダルプレゼンテーション、UIAlertController、UIPopoverPresentationController — これらはすべて、背景から分離するためにシャドウを使用します。

Elevationをシミュレート するために、iOS開発者はshadowOpacity + shadowRadius + shadowOffsetの組み合わせを使用します。必要な「高さ」が高いほど、ぼかし半径とシャドウオフセットが大きくなります。SwiftUIでは、パラメーター付きの.shadow()モディファイアを介してシャドウが設定されます。iOSでMaterialのような動作を実現するには、GoogleのMaterial Components for iOS(MDC)などのライブラリがあります。

swift
// iOS: CALayerによるelevationシミュレーション
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) — Material DesignのelevationをiOSに移植するGoogleのライブラリです。MDC-iOSは、事前定義された値を持つMDCShadowElevationクラス、シャドウレンダリング用のMDCShadowLayer、適切なelevationを持つMaterialカード用のMDCCardを提供します。MDC-iOSは、ステートフルなシャドウプロパティを介して押下時のelevationアニメーションをサポートしています。

よくある質問

AndroidのelevationとtranslationZの違いは?

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+では、アプリのテーマに適応するカラーシャドウのサポートが追加されました。

ElevationはAndroidのパフォーマンスにどのように影響しますか?

Elevation自体はパフォーマンスに影響しません。シャドウはハードウェア(GPU)によってレンダリングされるためです。ただし、elevationの頻繁な変更(アニメーションフレームごと)は、Viewとその周辺領域の再描画を引き起こす可能性があります。アニメーションには、elevationを変更する代わりにtranslationZを使用してください。translationZは頻繁な変更に最適化されています。20以上のelevation要素を持つ複雑な画面の場合は、view.setLayerType(View.LAYER_TYPE_HARDWARE, null)を有効にしてください。

要素を持ち上げずにelevationシャドウを作成するには?

Androidでは、elevationは常に要素を背景の上に持ち上げ、描画順序(z-order)を変更します。z-orderを変更せずにシャドウのみが必要な場合は、CardViewでcardUseCompatPaddingを使用するか、onDraw()内でPaint.setShadowLayer()を介したカスタムシャドウレンダリングを使用します。Jetpack Composeでは、Modifier.graphicsLayer { shadowElevation = 4f }を使用してください。

標準的なAndroidコンポーネントのelevationは?

Material Designコンポーネントには固定のelevation値があります:FloatingActionButton — 6 dp(押下時12 dp)、CardView — 1~8 dp(設定可能)、BottomNavigationView — 8 dp、Toolbar — 4 dp、Snackbar — 6 dp、Dialog — 24 dp。Material Components LibraryのMaterialButtonは2 dpのelevationを持ち、押下時に8 dpに上昇します。

まとめ

  • Elevation — Material Designにおける要素のz高さ。dpで測定され、シャドウと描画順序を決定します。
  • Androidでは、elevationはAPI 21以降、Viewプロパティを介して設定され、アニメーションにはtranslationZが使用されます。
  • OutlineProvider — 角が丸い要素の正しいシャドウに必要です。
  • Material Design 3は7つのelevationレベルを使用:レベル0(0 dp)〜レベル6(24 dp)。
  • Jetpack Compose はCardDefaults.cardElevation()とModifier.shadow()を介してelevationを管理します。
  • iOSでは、elevationは事前定義された不透明度/オフセット/半径パラメーターでCALayer.shadowを介してシミュレートされます。
  • インタラクションelevation(+1〜6 dp)は、インタラクティブな要素を押したときの触覚フィードバックを生み出します。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください