今天看到经常用的一个dp转px的方法
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
计算的最后都加0.5f,这是为什么呢,于是在网上搜索一番发现千篇一律的dp转px方法都写成这样,至于为什么也没有说明,于是翻看View的源码,在构造函数中对xml文件中的参数进行初始化,对于padding之类的尺寸的值的处理用到了这么一个方法
public static int complexToDimensionPixelSize(int data,
DisplayMetrics metrics)
{
final float value = complexToFloat(data);
final float f = applyDimension(
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
value,
metrics);
final int res = (int)(f+0.5f);
if (res != 0) return res;
if (value == 0) return 0;
if (value > 0) return 1;
return -1;
}
这是TypedValue中的一个方法
同样的在这个类中,发现了另一个方法
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;
}
Converts an unpacked complex data value holding a dimension to its final floating point value
将一个含有尺寸的没有包装的数据转换成一个浮点型的值
这两个方法的区别就是返回值的不同一个是int一个是float,根据自己的理解,applyDimension这个方法返回的换算结果更为精准,但是有时可能需要int型的数值,这时,如果用这个方法返回了一个float型0.x的数值转成int型时就会变成0,所以需要+0.5f,防止0的出现