Elevation là khái niệm cơ bản của Material Design xác định chiều cao của phần tử dọc theo trục z (vuông góc với màn hình). Elevation được đo bằng dp và ảnh hưởng trực tiếp đến kích thước và độ mờ của bóng do phần tử tạo ra. Elevation càng cao, phần tử càng gần người dùng và trọng lượng trực quan của nó càng rõ rệt. Theo Material Design 3 (Google, 2026), elevation tiêu chuẩn cho thẻ là 1 dp, cho FloatingActionButton — 6 dp, cho hộp thoại — 24 dp. Tìm hiểu thêm về cách triển khai đổ bóng trong bài viết về đổ bóng trong UI.
Những điểm chính
Elevation là một số liệu được giới thiệu trong Material Design (Google I/O 2014) mô tả vị trí của phần tử dọc theo trục z. Không giống như x và y (mặt phẳng hai chiều của màn hình), z là chiều cao phía trên mặt phẳng. Elevation được biểu thị bằng dp (pixel độc lập mật độ) và xác định hai hiệu ứng trực quan: bóng, trở nên lớn hơn và mờ hơn khi elevation tăng và thứ tự vẽ (các phần tử có elevation cao hơn được vẽ lên trên các phần tử có elevation thấp hơn).
Phép ẩn dụ vật lý: hãy tưởng tượng những tờ giấy trên bàn. Chồng giấy càng cao, bóng của tờ trên cùng càng dài. Elevation trong Material Design hoạt động giống hệt như vậy — mỗi phần tử là một “tờ giấy kỹ thuật số” ở một độ cao nhất định. Khi người dùng tương tác với phần tử (nhấn nút, nâng thẻ), elevation tăng tạm thời — điều này được gọi là “elevation tương tác.”
Theo Material Design Guidelines (Google, 2026), việc sử dụng elevation đúng cách cải thiện khả năng quét giao diện lên 35%: người dùng tìm thấy các phần tử tương tác nhanh hơn vì chúng “nổi bật” trên nội dung phẳng. Tuy nhiên, số lượng cấp độ elevation quá nhiều (hơn 4) làm giảm hiệu ứng này — nếu mọi thứ đều trôi nổi, không có gì có vẻ quan trọng.
Trong Android, elevation được triển khai như một thuộc tính View tích hợp từ API 21 (Android 5.0 Lollipop). View.elevation đặt chiều cao cơ sở bằng pixel (px), và View.translationZ cung cấp độ lệch bổ sung cho hoạt ảnh (ví dụ: khi nhấn). Tổng chiều cao trực quan = elevation + translationZ. Cả hai thuộc tính đều hỗ trợ hoạt ảnh qua ViewPropertyAnimator hoặc ObjectAnimator.
<!-- XML: elevation và 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="Nút có elevation" />
StateListAnimator — một tài nguyên XML để tạo hoạt ảnh cho elevation và translationZ dựa trên trạng thái View (được nhấn, được focus, được bật). Ví dụ: khi nhấn nút, elevation có thể tăng từ 2 dp lên 8 dp, tạo hiệu ứng nâng lên. StateListAnimator hỗ trợ hoạt ảnh qua ObjectAnimator cho bất kỳ thuộc tính View nào.
// Kotlin: thiết lập elevation theo chương trình
import android.animation.ObjectAnimator
import android.view.View
val myButton: View = findViewById(R.id.myButton)
myButton.elevation = 4f // chiều cao cơ sở bằng px
// Hoạt ảnh elevation khi nhấn
val animator = ObjectAnimator.ofFloat(
myButton,
"translationZ",
0f,
8f
).apply {
duration = 150
repeatMode = ValueAnimator.REVERSE
repeatCount = 1
}
OutlineProvider — một thành phần chính để hiển thị bóng elevation chính xác. Theo mặc định, Android sử dụng ViewOutlineProvider.BACKGROUND, tạo đường viền dựa trên drawable nền. Đối với Views có góc bo tròn (qua shape drawable), phải đặt OutlineProvider tùy chỉnh, nếu không bóng sẽ là hình chữ nhật. Các thành phần Material (CardView, MaterialButton) tự động quản lý OutlineProvider.
Material Design 3 (Material You) đã sửa đổi hệ thống elevation so với Material Design 2. Thay vì 12 cấp độ cố định (Material 2), M3 cung cấp 5 tông màu cơ bản, mỗi tông tương ứng với một cấp độ elevation cụ thể. Ngoài ra, M3 giới thiệu khái niệm “bóng màu” trên Android 12+: bóng có thể được tô màu bằng màu nhấn của chủ đề thay vì màu đen-xám.
| Cấp độ | Elevation | Cách sử dụng | Bóng (chủ đề sáng) |
|---|---|---|---|
| Cấp độ 0 | 0 dp | Nền, vùng chứa Surface | Không có bóng |
| Cấp độ 1 | 1 dp | Thẻ, ListItem, menu | 0.05 độ mờ, 2px làm mờ |
| Cấp độ 2 | 3 dp | Thanh tìm kiếm, điều hướng dưới | 0.08 độ mờ, 4px làm mờ |
| Cấp độ 3 | 6 dp | FAB, FloatingActionButton | 0.11 độ mờ, 8px làm mờ |
| Cấp độ 4 | 8 dp | Snackbar, Bottom sheet | 0.12 độ mờ, 12px làm mờ |
| Cấp độ 5 | 12 dp | Ngăn điều hướng, Hộp thoại | 0.14 độ mờ, 16px làm mờ |
| Cấp độ 6 | 24 dp | Hộp thoại phương thức, menu bật lên | 0.15 độ mờ, 24px làm mờ |
Elevation tương tác — sự gia tăng tạm thời của elevation trong quá trình người dùng tương tác với phần tử. Trong Material Design 3, các phần tử tương tác (nút, thẻ) nhận thêm +1–2 dp vào elevation cơ sở khi được nhấn (trạng thái pressed) hoặc focus (trạng thái focused). Đối với FloatingActionButton, elevation tương tác là +6 dp. Hoạt ảnh chuyển tiếp giữa các trạng thái nên kéo dài 150–200 ms để có phản hồi xúc giác tự nhiên.
Jetpack Compose hỗ trợ elevation thông qua các thành phần Card và Surface, có tham số elevation tích hợp. Không giống như Hệ thống View, Compose hiển thị bóng thông qua công cụ kết xuất của riêng nó, đảm bảo hành vi nhất quán trên tất cả các phiên bản Android (API 21+). Modifier.shadow() là một bổ ngữ cấp thấp để thêm bóng vào bất kỳ composable nào.
// Jetpack Compose: elevation qua Surface và 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("Thẻ được điều khiển bằng elevation")
}
// Modifier.shadow cho hình dạng tùy chỉnh
Surface(
modifier = Modifier
.shadow(elevation = 6.dp, shape = RoundedCornerShape(16.dp))
.clickable { /* hành động */ },
shape = RoundedCornerShape(16.dp),
color = MaterialTheme.colorScheme.surface
) { Text("Bề mặt có bóng") }
Hoạt ảnh elevation trong Compose được triển khai qua animateFloatAsState hoặc Animatable. Khi elevation thay đổi, Compose tự động tạo hoạt ảnh cho bóng. Đối với các phần tử tương tác, hãy sử dụng M3 InteractionSource kết hợp với animateElevation để elevation phản ứng với thao tác nhấn, focus và kéo. Material 3 trong Compose 1.2+ hỗ trợ bóng màu — bóng được tô màu bằng màu primary Container của chủ đề.
Trên iOS, không có đối tượng tương tự tích hợp cho elevation từ Material Design. Nguyên tắc Human Interface của Apple không sử dụng tọa độ z để quản lý bóng — thay vào đó, các nhà phát triển cấu hình bóng thủ công qua CALayer.shadow*. Tuy nhiên, khái niệm phân cấp trực quan thông qua bóng và độ sâu cũng tồn tại trên iOS: các bản trình bày phương thức, UIAlertController, UIPopoverPresentationController — tất cả đều sử dụng bóng để tách khỏi nền.
Để mô phỏng elevation trên iOS, các nhà phát triển sử dụng kết hợp shadowOpacity + shadowRadius + shadowOffset. “Chiều cao” yêu cầu càng cao, bán kính làm mờ và độ lệch bóng càng lớn. Trong SwiftUI, bóng được đặt thông qua bổ ngữ .shadow() với các tham số. Để có hành vi giống Material trên iOS, có các thư viện như Material Components for iOS (MDC) của Google.
// iOS: mô phỏng elevation qua 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
}
}
// Cách sử dụng
cardView.applyElevation(level: 3) // tương đương 6 dp
Material Components for iOS (MDC-iOS) — một thư viện của Google chuyển elevation của Material Design sang iOS. MDC-iOS cung cấp lớp MDCShadowElevation với các giá trị được xác định trước, MDCShadowLayer để hiển thị bóng và MDCCard cho thẻ Material với elevation chính xác. MDC-iOS hỗ trợ hoạt ảnh elevation khi nhấn thông qua các thuộc tính bóng có trạng thái.
Câu hỏi thường gặp
Elevation — chiều cao cơ sở của phần tử trong mặt phẳng z (được đặt trong XML hoặc mã). translationZ — độ lệch động cho hoạt ảnh (ví dụ: khi nhấn). Chiều cao trực quan = elevation + translationZ. elevation được tạo hoạt ảnh qua ViewPropertyAnimator, translationZ qua ObjectAnimator. Sử dụng translationZ cho các thay đổi chiều cao tạm thời, elevation cho các thay đổi vĩnh viễn.
Material Design 3 đã đơn giản hóa hệ thống elevation từ 12 xuống 7 cấp độ để giảm tải nhận thức cho các nhà thiết kế và nhà phát triển. Thay vì các giá trị chính xác (2 dp, 4 dp, 8 dp), M3 sử dụng tông màu (Cấp độ 0–6) với các tham số bóng được xác định trước. Trên Android 12+, đã thêm hỗ trợ cho bóng màu, thích ứng với chủ đề của ứng dụng.
Bản thân elevation không ảnh hưởng đến hiệu suất vì bóng được kết xuất bằng phần cứng (GPU). Tuy nhiên, các thay đổi elevation thường xuyên (mỗi khung hình trong quá trình hoạt ảnh) có thể gây ra việc vẽ lại View và các khu vực lân cận. Đối với hoạt ảnh, hãy sử dụng translationZ thay vì thay đổi elevation, vì translationZ được tối ưu hóa cho các thay đổi thường xuyên. Đối với các màn hình phức tạp với hơn 20 phần tử có elevation, hãy bật view.setLayerType(View.LAYER_TYPE_HARDWARE, null).
Trong Android, elevation luôn nâng phần tử lên trên nền và thay đổi thứ tự vẽ (z-order). Nếu bạn chỉ cần bóng mà không thay đổi z-order, hãy sử dụng cardUseCompatPadding trong CardView hoặc kết xuất bóng tùy chỉnh qua Paint.setShadowLayer() trong onDraw(). Trong Jetpack Compose, hãy sử dụng Modifier.graphicsLayer { shadowElevation = 4f }.
Các thành phần Material Design có giá trị elevation cố định: FloatingActionButton — 6 dp (12 dp khi nhấn), CardView — 1–8 dp (có thể cấu hình), BottomNavigationView — 8 dp, Toolbar — 4 dp, Snackbar — 6 dp, Dialog — 24 dp. MaterialButton từ Material Components Library có elevation 2 dp, tăng lên 8 dp khi được nhấn.
Tóm tắt
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm