Chúng tôi giải thích bản chất của Screen Density (Density Buckets) trong Android — phân loại màn hình theo mật độ pixel: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Screen Density xác định có bao nhiêu pixel vật lý nằm gọn trong một inch màn hình và ảnh hưởng trực tiếp đến cách hình ảnh và giao diện hiển thị trên các thiết bị khác nhau. Theo Google Android Compatibility Definition (2025), Android hỗ trợ 6 Density Buckets chính và tối đa 8 Buckets bổ sung cho thiết bị gập.
Những điểm chính
Screen Density là số lượng pixel vật lý trên mỗi inch màn hình (ppi — pixel mỗi inch, hoặc dpi — điểm mỗi inch). Android sử dụng khái niệm Density Buckets — các nhóm màn hình có mật độ tương tự sử dụng cùng hệ số tỷ lệ. Không giống như độ phân giải (số pixel theo chiều rộng và chiều cao), mật độ xác định kích thước vật lý của một pixel trên màn hình. Theo Google Pixel Team (2025), mật độ của các flagship hiện đại là 450-550 ppi, tương ứng với bucket xxhdpi-xxxhdpi.
Hệ thống Density Buckets xuất hiện trong Android 1.6 Donut (2009) với các thiết bị đầu tiên ở 160 dpi (mdpi). Khi độ phân giải màn hình tăng lên, các bucket mới được thêm vào: hdpi (Android 1.6), xhdpi (Android 2.3), xxhdpi (Android 4.1), xxxhdpi (Android 4.4). Mỗi bucket mới phản ánh mức tăng mật độ 1.5× hoặc 2× so với bucket trước. Theo Android Open Source Project (2025), 96% thiết bị Android đang hoạt động hiện nay có mật độ từ hdpi đến xxxhdpi.
Density Buckets là các dải mật độ do Google xác định để nhóm các màn hình Android. Bucket cơ sở là mdpi (160 dpi). Hệ số tỷ lệ cho biết tài nguyên cho một bucket cụ thể lớn hơn bao nhiêu lần so với mdpi. Ví dụ, xhdpi (2×) có nghĩa là hình ảnh phải lớn gấp 2 lần về chiều rộng và chiều cao so với phiên bản mdpi. Theo Android Studio Resource Manager (2025), xxhdpi là bucket phổ biến nhất trong số các thiết bị đang hoạt động (38% thị phần), tiếp theo là xhdpi (28%).
| Bucket | Dải DPI | Tỷ lệ | Ví dụ thiết bị | Thị phần (2025) |
|---|---|---|---|---|
| ldpi | 120 dpi | 0.75× | Thiết bị giá rẻ cũ | Dưới 1% |
| mdpi | 120-160 dpi | 1× | HTC Dream (G1), máy tính bảng 7" | 3% |
| hdpi | 160-240 dpi | 1.5× | Samsung Galaxy S2, Nexus 4 | 12% |
| xhdpi | 240-320 dpi | 2× | Google Nexus 5, Moto G | 28% |
| xxhdpi | 320-480 dpi | 3× | Samsung Galaxy S8, Pixel 3 | 38% |
| xxxhdpi | 480-640 dpi | 4× | Samsung Galaxy S24 Ultra, Pixel 9 Pro | 18% |
Độ phân giải màn hình là tổng số pixel theo chiều rộng và chiều cao (ví dụ: 1080×2400). Mật độ màn hình là số pixel trên mỗi inch. Hai thiết bị có cùng độ phân giải có thể có mật độ khác nhau nếu kích thước màn hình vật lý của chúng khác nhau. Ví dụ, điện thoại 6 inch với độ phân giải 1080×2400 có mật độ khoảng 440 dpi (xxhdpi), trong khi điện thoại 5 inch với cùng độ phân giải có khoảng 530 dpi (xxxhdpi). Đây là sự khác biệt chính: giao diện nên thích ứng không phải với độ phân giải mà với mật độ, nếu không các phần tử sẽ quá nhỏ trên các thiết bị mật độ cao.
Android sử dụng bộ định tính trong tên thư mục res để tải tài nguyên cho mật độ màn hình cụ thể: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi. Khi ứng dụng khởi động, Android chọn tài nguyên từ thư mục phù hợp nhất với mật độ thiết bị. Nếu không có kết quả khớp chính xác, hệ thống sẽ sử dụng bucket gần nhất hoặc chia tỷ lệ tài nguyên từ mật độ thấp hơn. Theo Android Docs (2025), bộ định tính mật độ không cần thiết cho vector (VectorDrawable) — chúng tự động chia tỷ lệ.
/res/
drawable-mdpi/
icon_app.png (48x48 px)
drawable-hdpi/
icon_app.png (72x72 px)
drawable-xhdpi/
icon_app.png (96x96 px)
drawable-xxhdpi/
icon_app.png (144x144 px)
drawable-xxxhdpi/
icon_app.png (192x192 px)
Trong cấu trúc này, mỗi thư mục chứa cùng một biểu tượng nhưng ở kích thước pixel vật lý khác nhau. Kích thước cơ sở 48×48 pixel cho mdpi được nhân với hệ số tỷ lệ cho mỗi bucket. Android tự động chọn tệp chính xác dựa trên DisplayMetrics.density của thiết bị. Đối với VectorDrawable (định dạng XML), một tệp duy nhất trong drawable/ là đủ — hệ thống chia tỷ lệ mà không giảm chất lượng.
Tính toán kích thước của hình ảnh cho mỗi mật độ dựa trên công thức đơn giản: kích thước trong mdpi × hệ số tỷ lệ. Nếu biểu tượng trong mdpi có kích thước 48×48 px, thì cho hdpi sẽ là 72×72 px (48 × 1.5), cho xhdpi — 96×96 px (48 × 2), cho xxhdpi — 144×144 px (48 × 3), cho xxxhdpi — 192×192 px (48 × 4). Theo Material Design Guidelines (2025), công thức này áp dụng cho tất cả tài nguyên raster: biểu tượng, nền, hình ảnh và 9-patch.
| Bucket | Tỷ lệ | Kích thước mdpi (px) | Kích thước bucket (px) |
|---|---|---|---|
| mdpi | 1× | 48×48 | 48×48 |
| hdpi | 1.5× | 48×48 | 72×72 |
| xhdpi | 2× | 48×48 | 96×96 |
| xxhdpi | 3× | 48×48 | 144×144 |
| xxxhdpi | 4× | 48×48 | 192×192 |
Chuẩn bị đúng cách tài nguyên cho Density Buckets bao gồm năm quy tắc chính. Thứ nhất, sử dụng VectorDrawable cho các biểu tượng đơn giản — điều này loại bỏ nhu cầu về năm bản sao. Thứ hai, đối với hình ảnh raster, xuất tất cả mật độ từ công cụ thiết kế (Android Studio Asset Studio tự động tạo ra). Thứ ba, tránh đặt hình ảnh trong drawable/ mà không có bộ định tính — hệ thống sẽ chia tỷ lệ với giảm chất lượng. Thứ tư, kiểm tra trên thiết bị có mật độ khác với thiết bị chính của bạn — trình giả lập cho phép thay đổi mật độ. Thứ năm, sử dụng WebP thay vì PNG — theo Google (2025), WebP cho kích thước nhỏ hơn 25-35% với cùng chất lượng.
Câu hỏi thường gặp
mdpi (medium-density pixel-independent) — bucket mật độ cơ sở trong Android với mật độ 160 dpi. Tất cả các bucket khác được tính tương đối so với mdpi: hdpi — 1.5×, xhdpi — 2×, v.v. mdpi tương ứng với một pixel vật lý trên mỗi pixel độc lập mật độ (dp). Các nhà thiết kế sử dụng mdpi làm tham chiếu khi tạo bố cục.
Sử dụng DisplayMetrics: getResources().getDisplayMetrics().density trả về hệ số tỷ lệ (1.0 cho mdpi, 3.0 cho xxhdpi). Để xác định bucket theo chương trình, hãy gọi getResources().getConfiguration().densityDpi. Android Studio cũng có Device Explorer hiển thị densityDpi cho các thiết bị đã kết nối.
Về mặt kỹ thuật — có, nhưng sẽ giảm chất lượng. Nếu tài nguyên chỉ có trong drawable-xxhdpi, trên thiết bị mdpi nó sẽ bị thu nhỏ 3× — hình ảnh sẽ bị mờ. Nếu tài nguyên chỉ có trong mdpi, trên xxhdpi nó sẽ bị phóng to — vỡ hạt. Khuyến nghị là chuẩn bị ít nhất cho xhdpi, xxhdpi và xxxhdpi — điều này bao phủ 84% thiết bị đang hoạt động (2025). Đối với VectorDrawable, một tệp duy nhất không có bộ định tính là đủ.
Tổng kế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