
Android原生系统API自带dp、px、sp单位转换,中可以使用TypedValue进行单位转换。例子:调用系统api转换单位,获得转换后的px值。
float pxDimension = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,16,context.getResources().getDisplayMetrics());
在TypedValue类中可以进行px、dp、sp、pt、in、mm单位转换,它的函数是这样的:
applyDimension(int unit, float value, DisplayMetrics metrics)
unit 转换类型
value 转换值(float)
metrics 当前设备显示密度
完整的函数是这样的:
public static float applyDimension(int unit, float value, DisplayMetrics metrics) {
switch (unit) { // 转换为px(像素)值
case COMPLEX_UNIT_PX:
return value;
// 转换为dp(密度)值
case COMPLEX_UNIT_DIP:
return value * metrics.density;
// 转换为sp(与刻度无关的像素)值
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
// 转换为pt(磅)值
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f / 72);
// 转换为in(英寸)值
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
// 转换为mm(毫米)值
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f / 25.4f);
}
return 0;
}
context.getResources().getDisplayMetrics()是用来获取当前设备显示密度的,在Resource类中final DisplayMetrics mMetrics = new DisplayMetrics()。
// Resource构造方法,初始化了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();
}
//在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 DisplayMetrics getDisplayMetrics() {
if (DEBUG_CONFIG){ Slog.v(TAG, "Returning DisplayMetrics: " + mMetrics.widthPixels+ "x" + mMetrics.heightPixels + " " + mMetrics.density);
}
return mMetrics;
}
}
//获取密度值
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;





