android之getDimension、getDimensionPixelSize、getDimensionPixelOffset区别
2015-12-18 12:24
465 查看
大家都知道这三个方法都是返回dimen xml配好的像素值,它们之间有什么区别呢?
且看代码:(不用太详细看是怎么回事,只要对比它们之间的区别)
可以看它的返回类型完全是float 的,所以,假如有一个1.3dp经2倍的手机得出来的是2.6
(int)applyDimension()表示只取整数,小数不要,所以1.3dp经2倍的手机得出来的是2
(int)(f+0.5f);可以看出,它用的是四舍五入的机制,所以1.3dp经2倍的手机得出来的是3
系统是怎么用它们的呢?可以看View的构造函数,像:width,height,padding用的都是四舍五入的方式,scrollX,scrollY,translationX,用的是取整.一些系数如:Factor之类的,用的是取float也就是getDimension
如果大家在用布局的时候,用错了会导致多了一条线之类的问题。
且看代码:(不用太详细看是怎么回事,只要对比它们之间的区别)
public float getDimension(int id) throws NotFoundException { synchronized (mTmpValue) { TypedValue value = mTmpValue; getValue(id, value, true); if (value.type == TypedValue.TYPE_DIMENSION) { return TypedValue.complexToDimension(value.data, mMetrics); } throw new NotFoundException( "Resource ID #0x" + Integer.toHexString(id) + " type #0x" + Integer.toHexString(value.type) + " is not valid"); } } public static float complexToDimension(int data, DisplayMetrics metrics) { return applyDimension( (data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK, complexToFloat(data), metrics); } public static float complexToFloat(int complex) { return (complex&(TypedValue.COMPLEX_MANTISSA_MASK <<TypedValue.COMPLEX_MANTISSA_SHIFT)) * RADIX_MULTS[(complex>>TypedValue.COMPLEX_RADIX_SHIFT) & TypedValue.COMPLEX_RADIX_MASK]; }
可以看它的返回类型完全是float 的,所以,假如有一个1.3dp经2倍的手机得出来的是2.6
public int getDimensionPixelOffset(int id) throws NotFoundException { synchronized (mTmpValue) { TypedValue value = mTmpValue; getValue(id, value, true); if (value.type == TypedValue.TYPE_DIMENSION) { return TypedValue.complexToDimensionPixelOffset( value.data, mMetrics); } throw new NotFoundException( "Resource ID #0x" + Integer.toHexString(id) + " type #0x" + Integer.toHexString(value.type) + " is not valid"); } } public static int complexToDimensionPixelOffset(int data, DisplayMetrics metrics) { return (int)applyDimension( (data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK, complexToFloat(data), metrics);//此处做了取整,舍去小数 }
(int)applyDimension()表示只取整数,小数不要,所以1.3dp经2倍的手机得出来的是2
public int getDimensionPixelSize(int id) throws NotFoundException { synchronized (mTmpValue) { TypedValue value = mTmpValue; getValue(id, value, true); if (value.type == TypedValue.TYPE_DIMENSION) { return TypedValue.complexToDimensionPixelSize( value.data, mMetrics); } throw new NotFoundException( "Resource ID #0x" + Integer.toHexString(id) + " type #0x" + Integer.toHexString(value.type) + " is not valid"); } } 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; }
(int)(f+0.5f);可以看出,它用的是四舍五入的机制,所以1.3dp经2倍的手机得出来的是3
系统是怎么用它们的呢?可以看View的构造函数,像:width,height,padding用的都是四舍五入的方式,scrollX,scrollY,translationX,用的是取整.一些系数如:Factor之类的,用的是取float也就是getDimension
如果大家在用布局的时候,用错了会导致多了一条线之类的问题。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories