1. 程式人生 > 其它 >Android的疑問-px,dp和sp,這些單位有什麼區別

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
    (extra-extra-extra-high) ~640dpi

__________________________________________________________________________________

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