Android的手機多種多樣,不同手機的屏幕密度也不同,故在相同物理尺寸下的所包含的像素點是不同的。
開發(fā)使用
在日常開發(fā)中,界面的xml文件中我們使用的是 dp 的單位,但是開發(fā)中使用的Android 的 API 則是 px。對于xml文件,系統(tǒng)在進行界面繪制時,會根據手機屏幕密度計算出對應的像素尺寸,所以我們在編寫代碼需要進行適配,根據不同手機屏幕的密度設置像素尺寸。
密度是單位體積的質量,所以相同物理尺寸下的屏幕區(qū)域中,密度越大,那么這塊區(qū)域內的像素點也就越多。如果在代碼中添了設計給的像素尺寸,那么在密度大的手機上,實際的顯示效果就會比設計圖上的小了。
dp與px轉換公式
px = dp * (dpi / 160)
dp = px / (dpi / 160)
這個公式的由來是因為,android官方規(guī)定,在dpi為160的設備下,1dp = 1px,其中 dpi / 160 也稱之為密度。那么在320dpi設置下,1dp = 2px。
Google的官方文檔給出過解釋,因為第一款 Android 設備( HTC 的T-Mobile G1)是屬于(注意,是屬于,不是等于)160dpi的,
dp 與 px 轉換代碼
public static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public static int pxToDip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
在代碼中轉換時最后加上了0.5f,Android官方文檔給的解釋是為了向上取整,這樣轉換也就更精確
相關概念
DPI
DPI 全稱為 Dots Per Inch. (Inch的含義是英寸),意思也就是『一英寸內點的個數』。Android 設備采用 DPI 來表示屏幕的『密度』。DPI 原本是印刷行業(yè)的概念,意思是一英寸內有多少個墨點。
PPI
PPI(Pixels Per Inch) 意思是『每英寸內的像素數』,這是通用的概念
屏幕尺寸
手機所說的5.0寸指的是屏幕對角線的長度為5.0英寸。1英寸 = 2.54cm
分辨率
指的是屏幕的像素總數,1920 X 1080 的分辨率指的屏幕是由長為1920個像素點,寬為1080個像素點所組成的長方形區(qū)域。
屏幕密度
可以通過屏幕的長寬算出對角線的長度除以對角線的長度,就可以算出每英寸的屏幕密度
px
px 就是像素 pixel 的縮寫。1px 代表一個顯示設備中的一個像素點。
dp
DP 或者 DIP 叫做(Density-Independent pixel),Android 中的特有單位,它的大小是由操作系統(tǒng)根據手機屏幕密度動態(tài)渲染出來的,1dp 對應多少 px 在不同的設備上,可能是不一致的。