Android中的單位轉換一篇就夠了
阿新 • • 發佈:2018-12-18
Android中的單位
android 中的單位主要是以下幾種:
- px
- dip
- sp:
1、px
畫素,也就是我們常說的手機分別率單位,在不同裝置上和不同顯示器上的顯示效果一樣,大小值不變。
- px 轉dp :
public float px2dp(float pxValue, Context context){
float density = context.getResources().getDisplayMetrics().density;
return pxValue / density + 0.5F;
}
- 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),不同的裝置會有不同的顯示效果,跟螢幕密度有關,
一般我們在做適配時這個單位用的比較多。
- dp 轉 px
public float dp2px(float dpValue, Context context) {
float density= context.getResources().getDisplayMetrics().density;
return dpValue* density + 0.5F;
}
3、sp
放大畫素(scaled pixels)主要用於字型顯示。
- 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.6
而 4.6
在型別轉換時:(int)4.6 = 4;
而如果 4.5 以上的話,4.5+0.5F = 5.0
而5.0
在型別轉換時:(int)5.0= 5;
這樣就達到了一個四捨五入
的效果,使轉換結果更加精準。
看完後是不是明白了,感謝各位老鐵查閱,如有誤,請大佬留言指正,在此感謝!!!