先上代码,拿来即用
1 | /** |
源码解析
关于dp和px、sp和px的互转,网上很多都是这样写的,很多人都是copy过来直接使用,但是有没有人想过为什么呢?
其实Android原生Api有提供dip和sp转px的方法,使用如下:
1 | // 10dp转px |
我们再看下TypedValue.applyDimension()方法的源码
1 | /** |
看了以上源码是不是瞬间就明白了dp2px和sp2px的原理,只要看以上源码的第二和第三个case
- px = dp * density
- px = sp * scaledDensity
然后我们又可以反推出
- dp = px / density
- sp = px / scaledDensity
为什么还要加0.5
可能有人会问了,为什么我们开头的dp2px、sp2px、px2dp、px2sp四个方法里都还要加0.5?
其实也可以不加0.5,如果返回值是float的话
1 | /** |
但是Android中很多有关尺寸的设置都是px,且是int类型,比如view.setWidth()、view.setHeight()的参数都是int类型,所以更多时候我们需要用到的是int类型。
那么如果要转化为int类型就需要加上0.5达到四舍五入的效果。
那么问题又来了,为什么加上0.5就可以四舍五入呢?举个栗子
java中浮点型强制类型转换成int类型是没有四舍五入的,而是直接把小数点后的值直接去掉
1 | i1 = (int) 1.0; // 结果为1 |
如果加上0.5再转换,看下结果
1 | i1 = (int) (1.0 + 0.5); // 结果为1 |
只要小数点后一位大于等于5再加上0.5就会达到五入的效果,得到更精确的值。这也就是为什么要加0.5的原因。