android 的px,dp與sp的區別以及換算

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)
這樣的話,假如做一個50
50dp的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章