首先來(lái)看屏幕密度DPI和分辨率PPI
DPI
DPI的全稱是 Dots Per Inch,Inch是一個(gè)物理單位(無(wú)論在任何設(shè)備上,其大小都是固定的),所以DPI就指在一個(gè)Inch的物理長(zhǎng)度內(nèi)有多少個(gè)Dot,160DPI的屏幕就表示一個(gè)Inch包含160個(gè)Dot。Android設(shè)備用DPI來(lái)表示屏幕密度(Density),屏幕密度大就表示一個(gè)Inch包含的Dot比較多。
PPI
其實(shí)對(duì)Android而言,DPI等價(jià)于PPI(Pixels-Per-Inch)。
通常我們說(shuō)一個(gè)設(shè)備是多少寸時(shí),指的是屏幕對(duì)角線(Diagonal)是多少inch,所以用對(duì)角線的像素值(px)除以對(duì)角線長(zhǎng)度(inch),就可以計(jì)算出PPI。
Android中有哪些尺寸單位?
主要包括:dp,sp,pt,px,mm,in
dp
即dip(Density-independent Pixels),是一種與屏幕密度無(wú)關(guān)的尺寸單位,當(dāng)屏幕密度是160dpi時(shí),1dp = 1px。當(dāng)運(yùn)行在高dpi的屏幕上時(shí),dp就會(huì)按比例放大,當(dāng)運(yùn)行在低dpi的屏幕上時(shí),dp就會(huì)被按比例縮小。
當(dāng)屏幕密度是320時(shí),1dp = 2px,因此dp是一種簡(jiǎn)單的解決view在不同大小屏幕上顯示的問(wèn)題的解決辦法。
sp
sp(Scale-independent Pixels)和dp是比較相似的,但是它會(huì)隨著用戶對(duì)系統(tǒng)字體大小的設(shè)置進(jìn)行比例縮放,換句話說(shuō),它能夠跟隨用戶系統(tǒng)字體大小變化。所以它更加適合做為字體大小的單位。
pt
pt(Point)是一個(gè)基于屏幕大小的物理尺寸,1pt等于1/72英寸(inch)。(不常用)
px
px(Pixels)相當(dāng)于實(shí)際屏幕的像素,由于不同屏幕的像素?cái)?shù)差異比較大,因此這個(gè)單位不被推薦用于尺寸單位,
mm
mm(Millimeters)即毫米,這是一個(gè)基于屏幕物理尺寸的單位。(不常用)
in
in(Inches)即英寸,也是一個(gè)基于屏幕物理尺寸的單位。(不常用)
dp與px之間的換算
px = dp * (dpi / 160)
舉例來(lái)說(shuō),小米Pad的屏幕密度為326dpi,如果需要顯示的圖片大小為20dp,那么就需要提供一個(gè) 20 (326 / 160) = 40px的圖片才能達(dá)到最佳顯示效果,如果還要適配一個(gè)163dpi的屏幕,那么還需要再提供一個(gè)20 (163 / 160) = 20px的圖片。
各個(gè)尺寸之間的轉(zhuǎn)換
dp轉(zhuǎn)px
public static int dip2px(Context context,float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue*scale+ 0.5f);
}
注意:這塊為啥沒(méi)有160呢?
因?yàn)椴榭丛创a就知道了。
px轉(zhuǎn)dp
public static int px2dip(Context context,float px){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(px/scale +0.5f);
}
sp轉(zhuǎn)px
public static int sp2px(Context context,float spValue){
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int)(spValue*fontScale+0.5f);
}
px轉(zhuǎn)sp
public static int px2sp(Context context,float pxValue){
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int)(pxValue/fontScale+0.5f);
}
mm轉(zhuǎn)in
public static double mm2in(double mmValue){
return mmValue*(10/254);
}
in轉(zhuǎn)mm
public static double in2mm(double inValue){
return inValue*(25.4);
}
參考鏈接:
http://www.itdecent.cn/p/913943d25829
http://blog.csdn.net/wenwen091100304/article/details/49744951