1、px
即像素,1px代表屏幕上的一個物理像素點。
“pixel” 的縮寫,像素。是畫面顯示的基本單位,真實的像素並不是點或者方塊(雖然有時這樣顯示),也沒有實際固定長度,只是一個抽象的取樣。設計中的像素和實際顯示屏上的像素相對應。
屏幕的分辨率一般就描述爲“寬向像素數X縱向像素數”。比如 Android手機常見的分辨率有:320 X 480, 480 X 800, 1080 X 1920等。
2、dp
dip:device independent pixels(設備獨立像素),dp與dip一樣,不同的設備有不同的顯示效果,一般爲了支持WVGA、HVGA和QVGA推薦使用這個,不依賴像素。
定義dp爲 160dpi 時的一個像素大小;那麼到 320 dpi 時,它就相當於兩個像素。
px= dp (dpi/160)
這樣的話,假如做一個5050dp的icon,放到160dpi的屏幕上就是50px50px,放到320dpi的屏幕上就是100px100px。各元素的佈局和比例便不會失調。
3、sp
sp:scale-independent pixels(縮放獨立像素),與縮放無關的抽象像素,它和dp很相似,但唯一的區別在於,Android系統允許用戶自定義文字尺寸大小(小,正常,大,超大等),當文字尺寸是“正常”時,1sp=1dp=0.00625inch(英寸),當文字尺寸是“大”或“超大”時,1sp>1dp=0.00625inch
這裏插一句 sp 這個單位,sp 跟 dp 類似,全稱是 scale-independent pixel (也會縮寫爲 sip), 即“獨立比例像素”。sp 主要用作字體的單位,開發用此單位設置文字大小,這樣在不同像素密度的屏幕上能進行同比例的擴大縮小。
4、dpi
dpi是像素密度,指的是在系統軟件上指定的單位尺寸的像素數量,它往往是寫在系統出廠配置文件的一個固定值
我爲什麼要強調它是軟件系統上的概念?
因爲大家買手機的時候,往往會聽到另一個叫ppi的參數,這個在手機屏幕中指的也是像素密度,但是這個是物理上的概念,它是客觀存在的不會改變。dpi是軟件參考了物理像素密度後,人爲指定的一個值,這樣保證了某一個區間內的物理像素密度在軟件上都使用同一個值。這樣會有利於我們的UI適配。
比如,幾部相同分辨率不同尺寸的手機的ppi可能分別是是430,440,450,那麼在Android系統中,可能dpi會全部指定爲480.這樣的話,dpi/160就會是一個相對固定的數值,這樣就能保證相同分辨率下不同尺寸的手機表現一致。
我們可以說,通過dp加上自適應佈局和weight比例佈局可以基本解決不同手機上適配的問題,這基本是最原始的Android適配方案。
dpi:dots per inch(每英寸點數,或者說每英寸像素數目 更易懂),即:是指屏幕上每英寸(1英寸 = 2.54 釐米)距離中有多少個像素點。如果屏幕爲 320*240,屏幕長 2 英寸寬 1.5 英寸,Dpi = 320 / 2 = 240 / 1.5 = 160。
由設備決定,是寫死的,可以通過context.getResources().getDisplayMetrics().densityDpi獲取到。當然,也可以通過以下方法算出:
dpi=橫向分辨率/橫向英寸數=縱向分辨率/縱向英寸數
安卓手機種類多樣,有各種屏幕像素密度。比如120dpi是低密度(ldpi)類型,160dpi 是中密度(mdpi),240dpi是高密度(hdpi),320dpi是超高密度(xhdpi),480dpi是超超高密度(xxhdpi)。
Google 規定的屏幕密度列表:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi
就如有的UI給的圖會有這樣的標註:
屏幕快照 2019-05-21 上午10.00.15.png
5、 ppi
這個在手機屏幕中指的也是像素密度,但是這個是物理上的概念,它是客觀存在的不會改變
dpi是軟件參考了物理像素密度後,人爲指定的一個值,這樣保證了某一個區間內的物理像素密度在軟件上都使用同一個值。這樣會有利於我們的UI適配
6、 in
inches的縮寫,英寸。就是屏幕的物理長度單位。一英寸等於2.54cm。比如Android手機常見的尺寸有5寸、5.5寸、6寸等,這裏的長度都是指手機對角線的長度。
7、pt
“points” 的縮寫,點。一個點等於1/72英寸,所以“點”也是個長度單位而已。
8、 Density(密度)
這個是指屏幕上每平方英寸(2.54 ^ 2 平方釐米)中含有的像素點數量。
單位的換算:
dpi與density的關係
dpi = density*160
px與density
px = density * dp
px = (dpi / 160)*dp
dp與px
px=dp*(dpi/160)
dp=px/(dpi/160)
sp與px
px=sp*(dpi/160)
sp=px/(dpi/160)
獲取DisplayMetrics對象方法:
DisplayMetrics dm=new DisplayMetrics();
//獲得DisplayMetrics對象方法一
//dm=context.getResources().getDisplayMetrics();
//獲得DisplayMetrics對象方法二
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
px轉其他單位代碼:(該方法來自TypedValue)
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
另外一種px轉dp的代碼:
/**
* 根據手機的分辨率從 px(像素) 的單位 轉成爲 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
dp轉px:
/**
* 根據手機的分辨率從 dp 的單位 轉成爲 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
作者:楓葉1234
鏈接:https://www.jianshu.com/p/a895dbed1c3b