Android的疑問-px,dp和sp,這些單位有什麼區別
1、px
即畫素,1px代表螢幕上的一個物理畫素點。
2、dp
dip:device independent pixels(裝置獨立畫素),dp與dip一樣,不同的裝置有不同的顯示效果,一般為了支援WVGA、HVGA和QVGA推薦使用這個,不依賴畫素。
3、sp
sp:scale-independent pixels(縮放獨立畫素),與縮放無關的抽象畫素,它和dp很相似,但唯一的區別在於,Android系統允許使用者自定義文字尺寸大小(小,正常,大,超大等),當文字尺寸是“正常”時,1sp=1dp=0.00625inch(英寸),當文字尺寸是“大”或“超大”時,1sp>1dp=0.00625inch
4、dpi
dpi:dots per inch(每英寸點數,或者說每英寸畫素數目 更易懂),由裝置決定,是寫死的,可以通過context.getResources().getDisplayMetrics().densityDpi獲取到。當然,也可以通過以下方法算出:
dpi=橫向解析度/橫向英寸數=縱向解析度/縱向英寸數
Google 規定的螢幕密度列表:
- ldpi(low) ~120dpi
- mdpi(medium) ~160dpi
- hdpi(high) ~240dpi
- xhdpi(extra-high) ~320dpi
- xxhdpi(extra-extra-high) ~480dpi
- xxxhdpi
__________________________________________________________________________________
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); }
引用自https://www.cnblogs.com/libertycode/p/5247421.html