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