暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Android中dp、px、sp单位之间的转换

WTech 2018-04-18
749


Android原生系统API自带dp、px、sp单位转换,中可以使用TypedValue进行单位转换。例子:调用系统api转换单位,获得转换后的px值。

float pxDimension = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,16,context.getResources().getDisplayMetrics());

TypedValue类中可以进行pxdpspptinmm单位转换,它的函数是这样的:

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;



文章转载自WTech,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论