【转】Android 为什么 dp2px 或 px2dp 公式需要加 0.5f
2017-09-26 00:41
302 查看
转自:http://blog.csdn.net/changcsw/article/details/52440543
网上 dp2px 和 px2dp 公式:
[java] view plain copy
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
这两个公式网上很多,但为什么 最后都要加上0.5f 呢?
按正常的推理应该是 dip = pxValue / scale 和 px = dipValue * scale ,
实际上准确的值就应该是 咱们推理出来的,之所以后面加上0.5f是因为 咱们要的只不是那么精准,根据推理算出来的是个浮点数,而咱们程序中一般使用int类型就够了,这里涉及到一个类型转换精准度问题,熟悉java特效的同学应该知道
float 类型的 4.1 和4.9 强转成int类型后,会失去精准度变成 int类型的4, 而如果咱们想四舍五入的话,把他们都加上0.5f,这样转换出来的结果就是:
4.4 + 0.5 = 4.9 转为int 还是4,而4.5 + 0.5 = 5.0 转换成int后就是5,正好是四舍五入,这样就保证了咱们算出来的值相对精准。
网上 dp2px 和 px2dp 公式:
[java] view plain copy
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
public static int dip2px(Context context, float dipValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
这两个公式网上很多,但为什么 最后都要加上0.5f 呢?
按正常的推理应该是 dip = pxValue / scale 和 px = dipValue * scale ,
实际上准确的值就应该是 咱们推理出来的,之所以后面加上0.5f是因为 咱们要的只不是那么精准,根据推理算出来的是个浮点数,而咱们程序中一般使用int类型就够了,这里涉及到一个类型转换精准度问题,熟悉java特效的同学应该知道
float 类型的 4.1 和4.9 强转成int类型后,会失去精准度变成 int类型的4, 而如果咱们想四舍五入的话,把他们都加上0.5f,这样转换出来的结果就是:
4.4 + 0.5 = 4.9 转为int 还是4,而4.5 + 0.5 = 5.0 转换成int后就是5,正好是四舍五入,这样就保证了咱们算出来的值相对精准。
相关文章推荐
- Android 为什么 dp2px 或 px2dp 公式需要加 0.5f
- Android 为什么 dp2px 或 px2dp 公式需要加 0.5f
- (一)android为什么需要recovery升级?
- Android解惑之Handler为什么需要是static的
- Android面试题-为什么需要token
- Android屏幕适配全攻略(最权威的官方适配指导)Android屏幕适配出现的原因 在我们学习如何进行屏幕适配之前,我们需要先了解下为什么Android需要进行屏幕适配。 由于Android系统
- Android中为什么需要服务?
- android 为什么需要cygwin
- Android为什么需要广播Broadcast
- 为什么 Android 截屏需要 root 权限
- 编译android代码时为什么需要“交叉编译环境”
- 配置Android应用开发环境为什么需要安装配置JDK、SDK、ADT
- Android onclicklistener中使用外部类变量时为什么需要final修饰【转】
- Android之TypedArray 为什么需要调用recycle()
- android 为什么需要签名
- android为什么需要签名与数据共享
- 为什么Android系统需要使用C、C++和Java语言共同开发
- Android之TypedArray 为什么需要调用recycle()
- 为什么Android系统需要使用C、C++和Java语言共同开发
- Android开发环境为什么需要依赖jvm