1. 程式人生 > >Android中的單位轉換一篇就夠了

Android中的單位轉換一篇就夠了

Android中的單位

android 中的單位主要是以下幾種:

  • px
  • dip
  • sp:

1、px

畫素,也就是我們常說的手機分別率單位,在不同裝置上和不同顯示器上的顯示效果一樣,大小值不變。
  1. px 轉dp
public float px2dp(float pxValue, Context context){
        float density = context.getResources().getDisplayMetrics().density;
        return  pxValue / density + 0.5F;
}
  1. px 轉 sp
public float
px2sp(float pxValue, Context context){ float scale = context.getResources().getDisplayMetrics().scaledDensity; return pxValue / scale + 0.5F; }

2、dp(dip)

裝置獨立畫素 (device independent pixels),不同的裝置會有不同的顯示效果,跟螢幕密度有關,
	一般我們在做適配時這個單位用的比較多。
  1. dp 轉 px
public float dp2px(float dpValue, Context context)
{ float density= context.getResources().getDisplayMetrics().density; return dpValue* density + 0.5F; }

3、sp

放大畫素(scaled pixels)主要用於字型顯示。
  1. sp 轉 px
public float sp2px(float spValue, Context context){
        float scale= context.getResources().getDisplayMetrics().scaledDensity;
        return
spValue* scale + 0.5F; }

那麼,是怎麼知道這個單位轉換方式呢?

接下來機遇是班門弄斧的時間了,copy 下原始碼出來,請移駕下看 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

系統提供給我們轉換方法

TypedValue.applyDimension(int unit, float value,DisplayMetrics metrics);
	/**
     * Converts an unpacked complex data value holding a dimension to its final floating 
     * point value. The two parameters <var>unit</var> and <var>value</var>
     * are as in {@link #TYPE_DIMENSION}.
     *  
     * @param unit The unit to convert from.
     * @param value The value to apply the unit to.
     * @param metrics Current display metrics to use in the conversion -- 
     *                supplies display density and scaling information.
     * 
     * @return The complex floating point value multiplied by the appropriate 
     * metrics depending on its unit. 
     */
    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;
    }

這個我就不多說了,提供一下用這個方法 將 dp 轉換為px的方法

public float dp2px(float dpValue, Context context) {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                dpValue, context.getResources().getDisplayMetrics());
}

為什麼轉換的時候我們 +0.5F

為什麼 ? 原始碼說明,沒有說要 +0.5F 這個操作,為什麼呢?

我覺得是為了更加精確的轉換數值的,我也搜了下,在此做下記錄,方便以後在此檢視
  • 我們在什麼時候要用到 轉換單位 比如說:
	- view.setWidth(int width) ;

這個 width 引數時 int 型別,而我們轉換單位後的值 是個float 型別,熟悉java的應該都知道 float 轉 int 會丟失精度

  • 比如說上面提到的 px2dp: 這個方法
public float px2dp(float pxValue, Context context){
        float density = context.getResources().getDisplayMetrics().density;
        return  pxValue / density + 0.5F;
}

如果 pxValue / density = 4.1的話,那麼4.1+0.5=4.64.6在型別轉換時:(int)4.6 = 4; 而如果 4.5 以上的話,4.5+0.5F = 5.05.0在型別轉換時:(int)5.0= 5; 這樣就達到了一個四捨五入 的效果,使轉換結果更加精準。

看完後是不是明白了,感謝各位老鐵查閱,如有誤,請大佬留言指正,在此感謝!!!