dp — kiến thức cơ bản, pixel độc lập mật độ trong Android

Tác giả: IT Sectr Đã đăng: 2026-02-25 Thời gian đọc: 7 phút

Giải thích kiến thức cơ bản về dp (pixel độc lập mật độ) — đơn vị đo lường trong Android đảm bảo kích thước vật lý giống nhau của các phần tử UI trên các màn hình có mật độ pixel khác nhau. Một dp luôn tương ứng với 1/160 inch trên màn hình, bất kể thiết bị có độ phân giải cao hay thấp. Theo Google Material Design (2025), tất cả kích thước trong ứng dụng Android phải được chỉ định bằng dp, không phải px, nếu không giao diện sẽ trông khác nhau trên các thiết bị khác nhau.

Những điểm chính

  • dp (pixel độc lập mật độ) — đơn vị đo lường trừu tượng trong Android, bằng 1/160 inch trên màn hình.
  • Công thức chuyển đổi: px = dp × (dpi / 160). Trên màn hình mdpi 1 dp = 1 px, trên xxhdpi 1 dp = 3 px.
  • Tất cả kích thước trong bố cục XML (layout_width, padding, margin) được chỉ định bằng dp.
  • dimens.xml — tệp tài nguyên Android để lưu trữ tập trung các giá trị dp.
  • Theo Google Android Performance Guide (2025), sử dụng dp thay vì px loại bỏ 90% vấn đề thích ứng giao diện trên các màn hình khác nhau.

dp trong Android là gì?

dp (pixel độc lập mật độ) là đơn vị đo lường ảo trong Android, được giới thiệu để thống nhất kích thước các phần tử UI trên các thiết bị có mật độ pixel khác nhau. Một dp gần bằng một pixel vật lý trên màn hình có mật độ 160 dpi (mdpi). Trên màn hình có mật độ 320 dpi (xhdpi), 1 dp bằng 2 pixel vật lý. Do đó, kích thước vật lý của phần tử trên màn hình vẫn giữ nguyên — khoảng 1/160 inch. Theo Android Developers (2025), dp là đơn vị đo lường duy nhất nên được sử dụng cho kích thước layout, padding, margin và chiều rộng/cao của view.

Tại sao không nên sử dụng px

Nếu bạn đặt chiều rộng nút là 160 px, trên màn hình mdpi nó sẽ rộng 1 inch, nhưng trên màn hình xxxhdpi (640 dpi) — chỉ 0,25 inch. dp giải quyết vấn đề này: 160 dp trên bất kỳ màn hình nào sẽ bằng 1 inch. Android tự động chuyển đổi dp sang px thông qua DisplayMetrics.density trong quá trình kết xuất. Theo Android Developer Blog (2025), trước khi giới thiệu dp (Android 1.0), các nhà phát triển phải tự tính toán độ lệch px, dẫn đến lỗi liên tục khi chuyển đổi.

dp, px và sp: sự khác biệt là gì

dp, px và sp là ba đơn vị đo lường trong Android, mỗi đơn vị có mục đích riêng. px là pixel màn hình vật lý phụ thuộc vào mật độ. dp là pixel độc lập mật độ cho kích thước phần tử. sp là pixel độc lập tỷ lệ cho văn bản, có tính đến cả cài đặt kích thước phông chữ hệ thống. Theo Material Design (2025), sự khác biệt giữa dp và sp là điểm truy cập chính: người dùng thị lực kém tăng kích thước phông chữ và giá trị sp tự động điều chỉnh, trong khi dp thì không.

Đơn vịTên đầy đủTính đến mật độTính đến cài đặt phông chữSử dụng
pxPixelKhôngKhôngKhông khuyến nghị
dpPixel độc lập mật độKhôngLayout, padding, lề
spPixel độc lập tỷ lệKích thước văn bản

Công thức chuyển đổi dp sang px và ngược lại

Công thức chuyển đổi dp sang px: px = dp × (dpi / 160). Để chuyển đổi ngược lại: dp = px / (dpi / 160). density là tỷ lệ dpi / 160, Android tính toán dựa trên DisplayMetrics. Trên mdpi density = 1,0, trên hdpi = 1,5, trên xhdpi = 2,0, trên xxhdpi = 3,0, trên xxxhdpi = 4,0. Do đó, 48 dp tính bằng pixel: trên mdpi — 48 px, trên xxhdpi — 144 px. Theo Google I/O 2024, công thức này có thể được sử dụng để chuyển đổi gần đúng pt (điểm) iOS sang dp — 1 pt ≈ 1 dp.

BucketMật độGiá trị dpi48 dp ra px16 dp ra px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: quản lý kích thước tập trung

dimens.xml là tệp tài nguyên Android trong res/values/, dùng để lưu trữ tất cả kích thước bằng dp (và sp cho văn bản). Tập trung hóa kích thước trong dimens.xml đơn giản hóa việc bảo trì: thay đổi một giá trị trong dimens.xml sẽ cập nhật kích thước trên tất cả màn hình ứng dụng. Bạn có thể tạo các tệp dimens.xml đủ điều kiện cho các mật độ khác nhau (values-hdpi, values-xhdpi). Theo Android Jetpack Docs (2025), Google khuyến nghị lưu trữ lề, padding, chiều rộng phần tử (hằng số), kích thước hình đại diện và chiều cao thanh công cụ trong dimens.xml.

XML


<resources>
    <dimen name="margin_small">8dp</dimen>
    <dimen name="margin_medium">16dp</dimen>
    <dimen name="margin_large">24dp</dimen>
    <dimen name="avatar_size">48dp</dimen>
    <dimen name="toolbar_height">56dp</dimen>
    <dimen name="text_size_body">14sp</dimen>
    <dimen name="icon_size_small">24dp</dimen>
</resources>

Trong tệp này, mỗi dimen có tên và giá trị. Sử dụng trong đánh dấu XML: @dimen/avatar_size. Theo Material Design Guidelines (2025), bước lưới cơ bản trong Android là 8 dp (lưới 8 điểm). Tất cả lề, kích thước phần tử và khoảng cách phải là bội số của 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp. Đối với văn bản, bước là 4 sp.

Sử dụng dp theo lập trình trong Kotlin và XML

Trong đánh dấu XML, dp được sử dụng trực tiếp: android:layout_width="48dp". Trong mã lập trình (Kotlin/Java), bạn cần chuyển đổi dp sang px bằng TypedResource hoặc các hàm mở rộng. TypedResource cung cấp các phương thức sẵn sàng để làm việc với dp trong thời gian chạy: getDimensionPixelSize() trả về giá trị px nguyên. Trong Jetpack Compose, dp là đơn vị đo lường tiêu chuẩn trong các bộ sửa đổi và vùng chứa bố cục.

Kotlin
// Chuyển đổi dp sang px theo lập trình
fun Context.dpToPx(dp: Int): Int {
    return (dp * resources
        .displayMetrics
        .density).toInt()
}

// Sử dụng trong Activity
val paddingPx = dpToPx(16)
button.setPadding(
    paddingPx,
    paddingPx,
    paddingPx,
    paddingPx,
)

// Jetpack Compose: dp như một đơn vị tích hợp
Modifier
    .padding(16.dp)
    .size(48.dp)

Trong ví dụ này, dpToPx() là hàm mở rộng cho Context, chuyển đổi dp sang px bằng displayMetrics.density. Trong Jetpack Compose, dp được tích hợp trong hệ thống kiểu và không yêu cầu chuyển đổi thủ công — trình biên dịch tự động dịch dp sang px ở giai đoạn kết xuất.

Đánh dấu XML với dp

XML

<Button
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:padding="@dimen/margin_medium"
    android:textSize="@dimen/text_size_body"
    android:text="@string/button_label"
    android:layout_marginTop="16dp"
/>

Trong XML, dp được chỉ định làm hậu tố của số — margin_top="16dp". Đối với văn bản, sp được sử dụng — textSize="@dimen/text_size_body". Tham chiếu @dimen cho phép quản lý tập trung giá trị. Sử dụng match_parent cho chiều rộng và 48dp cho chiều cao là mẫu Material Design tiêu chuẩn cho các nút.

Lỗi thường gặp khi sử dụng dp

Theo phân tích các ứng dụng Android từ Google Play Console (2025), năm lỗi phổ biến nhất là: sử dụng px thay vì dp trong đánh dấu XML, thiếu dimens.xml (giá trị được viết nội dòng), chuyển đổi dp sang px không chính xác trong mã (sử dụng phép chia số nguyên), bỏ qua sp cho văn bản và không tính đến cài đặt kích thước phông chữ hệ thống qua sp. Phép chia số nguyên là lỗi nguy hiểm nhất: trong Kotlin val px = dp * density — nếu dp và density là Int, kết quả cũng sẽ là Int và độ chính xác bị mất.

  • px thay vì dp — ứng dụng trông khác nhau trên các thiết bị có mật độ khác nhau. Khắc phục bằng cách thay px bằng dp trong XML.
  • Giá trị nội dòng — kích thước được viết trực tiếp trong tệp bố cục. Sao chép giá trị làm phức tạp việc bảo trì và cập nhật.
  • sp cho văn bản — sử dụng dp cho kích thước phông chữ bỏ qua cài đặt người dùng, phá vỡ khả năng truy cập.
  • Phép chia số nguyên — trong Kotlin, chia Int cho Int cho ra Int, mất phần phân số. Luôn sử dụng Float.

Câu hỏi thường gặp

dp khác pt trong iOS như thế nào?

dp trong Android và pt (điểm) trong iOS là đơn vị đo lường tương đương. 1 dp trong Android gần bằng 1 pt trong iOS. Cả hai khái niệm đều mô tả điểm độc lập mật độ: trên các thiết bị cũ mật độ thấp 1 dp/pt = 1 px, trên thiết bị hiện đại — 2-4 px. Sự khác biệt nằm ở giá trị cơ sở: Android sử dụng 160 dpi làm mật độ cơ sở, iOS sử dụng 163 dpi, dẫn đến sai số dưới 2%.

Làm thế nào để chuyển đổi dp sang px trong Jetpack Compose?

Trong Jetpack Compose, không cần chuyển đổi — dp được tích hợp trong hệ thống kiểu. Tất cả bộ sửa đổi và bố cục chấp nhận Dp, không phải px. Nếu bạn cần lấy px từ dp, hãy sử dụng density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity cung cấp hệ số chuyển đổi có tính đến mật độ màn hình của thiết bị.

Tôi có cần sử dụng dp trong iOS không?

dp là thuật ngữ Android. Trong iOS, tương đương là pt (điểm). Swift tự động hoạt động với các điểm độc lập với mật độ màn hình. Trong UIKit và SwiftUI, tất cả kích thước được chỉ định bằng điểm và hệ thống chuyển đổi chúng thành px bằng hệ số tỷ lệ màn hình (UIScreen.main.scale). Cùng nguyên tắc, tên gọi khác nhau.

Tóm tắt

  • dp — Pixel độc lập mật độ, đơn vị trừu tượng cho kích thước UI trong Android, bằng 1/160 inch.
  • Công thức: px = dp × (dpi / 160). Trên mdpi 1 dp = 1 px, trên xxhdpi 1 dp = 3 px.
  • Tất cả kích thước trong đánh dấu XML phải được chỉ định bằng dp, kích thước văn bản bằng sp.
  • dimens.xml — lưu trữ tập trung kích thước. Một thay đổi cập nhật toàn bộ giao diện.
  • Lưới 8 điểm: tất cả kích thước là bội số của 8 dp, khoảng cách văn bản — 4 sp.
  • Trong mã lập trình, sử dụng TypedResource hoặc hàm mở rộng để chuyển đổi dp sang px.

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.

Thảo luận dự án

Đọc thêm