Android系統中自帶的Api中可以使用TypedValue進行單位轉換
1,調用系統api轉換單位
// 獲得轉換后的px值
float pxDimension = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 16,context.getResources().getDisplayMetrics());
2,分析TypedValue.applyDimension搞了什么事情?
// 在TypedValue類中
/**
* px、dp、sp、pt、in、mm單位轉換
* @param unit 轉換類型
* @param value 轉換值(float)
* @param metrics 當前設備顯示密度
* @return 轉換單位后的值
*/
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
switch (unit) {
case COMPLEX_UNIT_PX: // 轉換為px(像素)值
return value;
case COMPLEX_UNIT_DIP: // 轉換為dp(密度)值
return value * metrics.density;
case COMPLEX_UNIT_SP: // 轉換為sp(與刻度無關的像素)值
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT: // 轉換為pt(磅)值
return value * metrics.xdpi * (1.0f / 72);
case COMPLEX_UNIT_IN: // 轉換為in(英寸)值
return value * metrics.xdpi;
case COMPLEX_UNIT_MM: // 轉換為mm(毫米)值
return value * metrics.xdpi * (1.0f / 25.4f);
}
return 0;
}
3,分析context.getResources().getDisplayMetrics()搞了什么事情
// 在Resource類中
final DisplayMetrics mMetrics = new DisplayMetrics();
// 構造方法,初始化了mMetrics
public Resources(AssetManager assets, DisplayMetrics metrics, Configuration config,
CompatibilityInfo compatInfo) {
mAssets = assets;
mMetrics.setToDefaults();
if (compatInfo != null) {
mCompatibilityInfo = compatInfo;
}
updateConfiguration(config, metrics);
assets.ensureStringBlocks();
}
// 獲取密度值的方法
public DisplayMetrics getDisplayMetrics() {
if (DEBUG_CONFIG) Slog.v(TAG, "Returning DisplayMetrics: " + mMetrics.widthPixels
+ "x" + mMetrics.heightPixels + " " + mMetrics.density);
return mMetrics;
}
}
// 在DisplayMetrics類中
public void setToDefaults() {
widthPixels = 0;
heightPixels = 0;
density = DENSITY_DEVICE / (float) DENSITY_DEFAULT;
densityDpi = DENSITY_DEVICE; // 獲取密度值
scaledDensity = density;
xdpi = DENSITY_DEVICE;
ydpi = DENSITY_DEVICE;
noncompatWidthPixels = widthPixels;
noncompatHeightPixels = heightPixels;
noncompatDensity = density;
noncompatDensityDpi = densityDpi;
noncompatScaledDensity = scaledDensity;
noncompatXdpi = xdpi;
noncompatYdpi = ydpi;
}
// 獲取密度值
public static int DENSITY_DEVICE = getDeviceDensity();
private static int getDeviceDensity() {
return SystemProperties.getInt("qemu.sf.lcd_density", // 獲取當前系統的密度值
SystemProperties.getInt("ro.sf.lcd_density", DENSITY_DEFAULT)); // 沒有,則取默認值
}
// 獲取密度缺省值:160
public static final int DENSITY_DEFAULT = DENSITY_MEDIUM;
public static final int DENSITY_MEDIUM = 160;
當然在實際編程中,我們一般都把單位轉換寫成工具類,通過工具類來調用:
/**
* 根據手機分辨率從DP轉成PX
* @param context
* @param dpValue
* @return
*/
public static int dip2px(Context context, float dpValue) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 將sp值轉換為px值,保證文字大小不變
* @param spValue
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
/**
* 根據手機的分辨率PX(像素)轉成DP
* @param context
* @param pxValue
* @return
*/
public static int px2dip(Context context, float pxValue) {
float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 將px值轉換為sp值,保證文字大小不變
* @param pxValue
* @return
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}