Liên hệ
android java

Tìm hiểu các đơn vị px, dp, pt, in, mm, dip trong Androi

Hiểu về đơn vị xác định độ dài khi trình bày layout, khi vẽ canvas trong Android, chuyển đổi qua lại giữa các đơn vị px, dp, pt ... Xác định thông tin màn hình hiện thị như mật độ điểm ảnh, chiều cao, chiều rộng

Kích thước màn hình

Màn hình hiện đại dù hình ảnh rất mịn mạng, nhưng thực chất được tạo ra từ hàng ngàn những điểm rất nhỏ, mỗi điểm nhỏ đó được gọi gọi là điểm ảnh pixel ký hiệu là px, chúng bố trí tạo ra một lưới các điểm ảnh.

Các pixel được trí từ trái qua phải là X, từ trên xuống dưới là trục Y (khoảng cách 2 pixel theo trục X và Y có thể bằng nhau, có thể khác nhau). Ví dụ một màn hình 320 x 480 (width x height) thì có 320 pixel theo trục X và 480 pixel theo trục Y.

Khái niệm về kích thước màn hình

Kích thước màn hình mà mọi người vẫn quen sử dụng đối với smartphone, laptop, Tivi đó là đơn vị inch (1 inch = 2.54 cm = 25.4 mm) (màn hình laptop 17 inch chẳng hạn). Đây là kích thước đo bằng đường chéotừ góc trên bên trái tới góc dưới bên phải màn hình. Nếu biết chiều rộng, chiều cao màn hình thì có thể tính toán ra kích thước màn hình theo khái niệm trên. Như ví dụ sau, màn hình kích thước 3.2 inch

Mật độ điểm ảnh PPI và DPI

PPI Pixels Per Inch - Mật độ điểm ảnh có nghĩa là số lượng pixel trên một Inch. Như vậy màn hình nào có mật độ điểm ảnh lớn sẽ cho ảnh sắc nét hơn, vì thế đây là thông số quan tâm khi mua một thiết bị mới.

DPI Dots Per Inch - Mật điểm điểm trên một inch, khá giống với PPI, khái niệm này rất đầu tiên dùng trong kỹ thuật in, DPI là số điểm ảnh mà máy in ra trên một inch. Một cách tương đối thì PPI là mật độ điểm ảnh trên màn hình, DPI là mật độ điểm ảnh trên máy in.

Để kích thước ảnh hiện thị một cách độc lập với PPI (kích thước ảnh giống nhau trên các màn hình có PPI khác nhau), khi vẽ ảnh, xây dựng tài nguyên Android có thể dùng tới đơn vị phái sinh từ DPI là . Đơn vị dp (Density Independent Pixel) được tính dựa theo màn hình gốc ban đầu làm chuẩn. Android phần chia ra các loại màn hình theo DPI

  • MDPI - màn hình có độ phân giải trung bình - là màn hình làm chuẩn: 1dp = 1px (có khoảng 160dp trong 1 in, mật độ density = 1)
  • LPDI - màn hình có độ phân giải thấp: 1dp = 0,75px, (density = 0,75)
  • HDPI - màn hình có độ phân giải cao: 1dp = 1,5px, (density = 1,5)
  • XHDPI - màn hình có độ phân giải siêu cao: 1dp = 2px, (density = 2)
  • XXDPI - màn hình có độ phân giải siêu siêu cao: 1dp = 3pixel, (density = 3)
  • XXDPI - màn hình có độ phân giải siêu siêu siêu cao: 1dp = 4pixel, (density = 4)

Các đơn vị xác định kích thước, khoảng cách màn hình trong lập trình Android / IOS

Có hai nhóm đơn vị, thứ nhất là các đơn vị độc lập mật độ và các đơn vị phụ thuộc vào mật độ điểm ảnh trên màn hình.

  • Đơn vị phụ thuộc PPI, có nghĩa nó loại đơn vị tương đối, kích thước theo đơn vị này khi thể hiện thật trên các màn hình có mật độ điểm ảnh khác nhau là khác nhau, đó là đơn vị px
    • px - một pixel thực tế trên màn hình (Khi bạn vẽ ảnh 100px thì kích thước thật (theo mm, cm ...) thể hiện trên màn hình là khác nhau cho các màn hình có mật độ điểm ảnh khác nhau)
  • Đơn vị độc lập với PPI có nghĩa là nó thể hiện đúng kích thước vật lý, dù đó là màn hình nào. Đó là các đơn in, mm, pt, dp, sp
    • in - (1 in = 2.54cm)- kích thước vật lý thật trên mọi màn hình
    • mm - kích thước vật lý 1mm, giống nhau cho mọi màn hình
    • pt - điểm (point), đây là đơn vị phổ biến dùng biểu diễn kích thước font chữ (72pt = 1inch = 25.4mm) hay 1pt = (1/72)in
    • dp - (hoặc ký hiệu dip) mặc dù xếp vào loại đơn vị độc lập với PPI, nhưng một dp trên các màn hình khác nhau có một chút sai số nhỏ (chỉ xấp xỉ bằng nhau trên các loại màn hình khác nhau). 1 in ≃ 160 dp
    • sp - (scale independent pixel), được dùng chủ yếu cho cỡ chữ, nó khá tương đồng với sp nhằm mục đích chữ có cỡ giống nhau sẽ hiện thị kích thước giống nhau trên các màn hình có PPI khác nhau. Tỷ lệ giữa sp và dp có thể điều chỉnh lại bởi người dùng.

Tỷ lệ tương đối giữa sp và dp có thể điều chỉnh lại

Các đơn vị trên: px, in, mm, pt, dp, sp đều có thể dùng trong XML trình bày layout, dùng trong các values.xml ...

Vì dụ trong XML trình bày layout

<TextView
    android:layout_width="100dp"
    android:textSize="16sp"
    android:layout_marginTop="1in"
    android:layout_marginLeft="8mm"
    android:layout_height="wrap_content"
    android:text="Example" />

Ví dụ trong: values/dimens.xml

<resources>
    <dimen name="text_margin">16dp</dimen>
    <dimen name="myftextsize">14sp</dimen>
    <dimen name="myavatar">100px</dimen>
    <dimen name="myfontsize">20pt</dimen>
</resources>

Việc sự dụng đơn vị như thế nào do ý thích của bạn, tuy nhiên để đảm bảo độc lập về thiết bị thì nên dùng dp trong trình bày đơn vị liên quan đến layout, như kích thước, margin, padding, width, height ... Dùng sp cho cơ chữ.

Sử dụng các đơn vị trong Android - Thông tin màn hình thiết bị

Sử dụng DisplayMetrics để biết thông tin hiện thị trên màn hình thiết bị

DisplayMetrics (android.util.DisplayMetrics) là lớp chứa các hằng số, phương thức cho bạn biết thông tin về màn hình thiết bị, cấu hình hiện thị. Để có được một DisplayMetrics có thể làm như sau:

Trong các Activity

 DisplayMetrics metrics = new DisplayMetrics();
 getWindowManager().getDefaultDisplay().getMetrics(metrics);

Khi đã có Context

 DisplayMetrics metrics = context.getResources().getDisplayMetrics()

DisplayMetrics cung cấp các thuộc tính

density Mật độ logic (tương quan DPI và PPI)
densityDpi chính là DPI
heightPixels, widthPixels Lấy chiều cao, chiều rộng hiện thị theo px
scaledDensity Tỷ lệ cho font chữ (đơn vị sp), scaledDensity thường là bằng với density, trừ khi người dùng điều chỉnh
xdpi, ydpi Số pixel trong 1 inch chính xác theo chiều X (ngang), chiều Y

Chuyển đổi giữa các đơn vị

Nhiều trường hợp bạn có nhu cầu chuyển đổi giá trị theo đơn vị này sang giá trị theo đơn vị khác trong lập trình Android

Chuyển từ DP sang PX

public static int convertDpToPixels(float dp, Context context) {
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
    context.getResources().getDisplayMetrics());
    return px;
}

Chuyển từ SP sang PX

public static int convertSpToPixels(float sp, Context context) {
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,
    context.getResources().getDisplayMetrics());
    return px;
}

Từ px tính ra dp

dp = (kích_thước_theo_pixel * 160) / density

Ngoài ra bạn cũng có thể khai báo giá trị 1 đơn vị trong values/dimens.xml rồi đọc giá trị đó, để biết 1 đơn vị mô tả có bao nhiêu pixel. Ví dụ trong values/dimens.xml thêm các dòng:

<resources>
<dimen name="one_unit_dp">1dp</dimen>
<dimen name="one_unit_sp">1sp</dimen>
<dimen name="one_unit_pt">1pt</dimen>
<dimen name="one_unit_in">1in</dimen>
<dimen name="one_unit_mm">1mm</dimen>
</resources>
int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.one_unit_dp);

Mật độ màn hình và tài nguyên trong dự án Adnroid

Mật độ màn hình density chính là tỷ tệ tượng quan giữa số point và pixel, để lấy được giá trị này trong Android có đoạn code sau:

    float density = context.getResources().getDisplayMetrics().density;
    if (density == 0.75)
    {
        //Màn hình LDPI
    }
    else if (density == 1)
    {
        //Màn hình MDPI
    }
    else if (density == 1.5)
    {
        //Màn hình HDPI
    }
    else if (density == 2)
    {
        //Màn hình XHDPI
    }
    else if (density == 3)
    {
        //Màn hình XXHDPI
    }
    else if (density == 4)
    {
        //Màn hình XXXHDPI
    }

Chính từ giá trị mật độ này, khi xây dựng các tài nguyên như hình ảnh, các ảnh có lưu trong thư mục trùng với tên màn hình tương ứng, khi ứng dụng chạy nó sẽ tìm tới ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi tài nguyên phù hợp với màn hình

Chú ý, ảnh lưu trong folder-nodpi sẽ vẽ đúng kích thước pixel ảnh, tương ứng số pixel màn hình

Vui lòng đăng ký ủng hộ kênh