getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别
来源:互联网 发布:2017java程序设计竞赛 编辑:程序博客网 时间:2024/05/22 10:49
在自定义控件中使用自定义属性时,经常需要使用java代码获取在xml中定义的尺寸,相关有以下三个函数
(在类TypedArray和类Resources中都有这三个函数,功能类似,TypedArray中的函数是获取自定义属性的,Resources中的函数是获取android预置属性的)
- getDimension()是基于当前DisplayMetrics进行转换,获取指定资源id对应的尺寸。文档里并没说这里返回的就是像素,要注意这个函数的返回值是float,像素肯定是int。
- getDimensionPixelSize()与getDimension()功能类似,不同的是将结果转换为int,并且小数部分四舍五入。
- getDimensionPixelOffset()与getDimension()功能类似,不同的是将结果转换为int,并且偏移转换(offset conversion,函数命名中的offset是这个意思)是直接截断小数位,即取整(其实就是把float强制转化为int,注意不是四舍五入哦)。
由此可见,这三个函数返回的都是绝对尺寸,而不是相对尺寸(dp\sp等)。如果getDimension()返回结果是20.5f,那么getDimensionPixelSize()返回结果就是21,getDimensionPixelOffset()返回结果就是20。
看看android的源代码,来印证上述解释。
深入源码,我们可以发现其实这三个函数实现都很像,以Resources类的getDimension()为例
深入源码,我们可以发现其实这三个函数实现都很像,以Resources类的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"); } }
类TypedValue是动态类型数据的容器,主要用于盛放resource的值。上述代码第4行就是根据resId获取TypedValue的值,getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()函数体唯一的不同就是第4行:
- getDimension()调用的是TypedValue的complexToDimension方法
- getDimensionPixelSize调用的是TypedValue的complexToDimensionPixelSize方法
- getDimensionPixelOffset调用的是TypedValue的complexToDimensionPixelOffset方法
我们再深入类TypedValue,查看complexToDimension()、complexToDimensionPixelSize()和complexToDimensionPixelOffset()函数的区别,会发现这三个函数体内容还是差不多,以complexToDimension()为例:
public static float complexToDimension(int data, DisplayMetrics metrics){ return applyDimension( (data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK, complexToFloat(data), metrics); }complexToDimensionPixelOffset()与complexToDimension()不同的是将结果进行了强制转换,相当于直接截断小数部分;
complexToDimensionPixelSize()是将结果进行四舍五入,四舍五入的代码就是把结果加上0.5f再进行强制转换(因为java的float强制转换为int都是直接舍去小数的;如果大于等于0.5则加上0.5进位,强制转换后舍去小数相当于五入;如果小于0.5则加上0.5后整数部分不变,强制转换舍去小数后相当于四舍)
0 0
- getDimension,getDimensionPixelOffset和getDimensionPixelSize区别
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别
- getDimension,getDimensionPixelOffset和getDimensionPixelSize区别
- getDimension,getDimensionPixelOffset和getDimensionPixelSize区别
- getDimension/getDimensionPixelOffset/getDimensionPixelSize 区别
- getDimension,getDimensionPixelOffset和getDimensionPixelSize
- getDimension,getDimensionPixelOffset和getDimensionPixelSize
- getDimension,getDimensionPixelOffset和getDimensionPixelSize
- getDimension,getDimensionPixelOffset和getDimensionPixelSize
- getDimension,getDimensionPixelOffset和getDimensionPixelSize
- Android中getDimension,getDimensionPixelOffset和getDimensionPixelSize 区别
- 【android】getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
- getDimension,getDimensionPixelOffset和getDimensionPixelSize的区别
- getDimension(),getDimensionPixelOffset()和getDimensionPixelSize()区别(转载)
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()三者区别
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
- tp 741 WAN口位置不正确, openwrt编译不生成固件原因及解决
- 用java写的矩阵乘法(Strassen算法)
- 将在本地创建的Git仓库push到Git@OSC
- 子类自动调用父类默认无参构造器
- 嵌入式 编程错误小记
- getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别
- 【c语言】判断一个数是不是回文数
- android 数字签名使用 -- 参考网站
- 简单的光线追踪--GPU高性能编程CUDA实战第六章
- jeewx-api.jar入门教程
- Apache Mesos总体架构
- Swift闭包的使用
- Java Sax解析xml(转载)
- vs2012编译和调试QT工程的那些坑