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%: ผู้ใช้ค้นหาองค์ประกอบที่โต้ตอบได้เร็วขึ้นเพราะพวกมัน “โดดเด่น” เหนือเนื้อหาแบบเรียบ อย่างไรก็ตาม จำนวนระดับที่มากเกินไป (มากกว่า 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="ปุ่มที่มี elevation" />

StateListAnimator — ทรัพยากร XML สำหรับสร้างแอนิเมชัน elevation และ translationZ ตามสถานะของ View (กด โฟกัส เปิดใช้งาน) ตัวอย่างเช่น เมื่อกดปุ่ม 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) หรือโฟกัส (สถานะ focused) สำหรับ FloatingActionButton interaction elevation คือ +6 dp แอนิเมชันการเปลี่ยนระหว่างสถานะควรใช้เวลา 150–200 ms เพื่อการตอบสนองทางสัมผัสที่เป็นธรรมชาติ

Elevation ใน Jetpack Compose

Jetpack Compose รองรับ elevation ผ่านส่วนประกอบ Card และ Surface ซึ่งมีพารามิเตอร์ elevation ในตัว แตกต่างจากระบบ View 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+ รองรับเงาสี — เงาที่ถูกแต่งสีด้วยสี 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 เมื่อกดผ่านคุณสมบัติเงาที่มีสถานะ

คำถามที่พบบ่อย

ความแตกต่างระหว่าง 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+ เพิ่มการรองรับเงาสีซึ่งปรับตามธีมของแอปพลิเคชัน

Elevation ส่งผลต่อประสิทธิภาพของ Android อย่างไร?

Elevation เองไม่ส่งผลต่อประสิทธิภาพเพราะเงาถูกเรนเดอร์โดยฮาร์ดแวร์ (GPU) อย่างไรก็ตาม การเปลี่ยนแปลง elevation บ่อยครั้ง (ทุกเฟรมระหว่างแอนิเมชัน) อาจทำให้เกิดการวาด View และพื้นที่ใกล้เคียงใหม่ สำหรับแอนิเมชัน ให้ใช้ translationZ แทนการเปลี่ยน elevation เพราะ translationZ ถูกปรับให้เหมาะสมสำหรับการเปลี่ยนแปลงบ่อยครั้ง สำหรับหน้าจอที่ซับซ้อนที่มีองค์ประกอบที่มี elevation มากกว่า 20 รายการ ให้เปิดใช้ 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: ระดับ 0 (0 dp) — ระดับ 6 (24 dp)
  • Jetpack Compose จัดการ elevation ผ่าน CardDefaults.cardElevation() และ Modifier.shadow()
  • บน iOS elevation ถูกจำลองผ่าน CALayer.shadow ด้วยพารามิเตอร์ความโปร่งแสง/ออฟเซ็ต/รัศมีที่กำหนดไว้ล่วงหน้า
  • Interaction elevation (+1–6 dp) สร้างการตอบสนองทางสัมผัสเมื่อกดองค์ประกอบที่โต้ตอบได้

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม