getDimension,getDimensionPixelOffset和getDimensionPixelSize区别
来源:互联网 发布:淘宝买的酒是真的吗 编辑:程序博客网 时间:2024/05/22 02:02
问题
网上搜了下这3个方法:
resources.getDimension()
resources.getDimensionPixelOffset()
resources.getDimensionPixelSize()
很多说前两个对dp和sp乘以密度做转化,px不会,后面的方法不不管是px,dp,sp都会乘以密度转化
分析
这三个方法分别调用了
TypedValue.complexToDimension
TypedValue.complexToDimensionPixelOffset
TypedValue.complexToDimensionPixelSize
查看代码,最终都会这样调用
final float value = complexToFloat(data); final float f = applyDimension( (data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK, value, metrics);
complexToDimension返回了applyDimension的返回值,为float
complexToDimensionPixelOffset返回了applyDimensiond的值并强转为int
complexToDimensionPixelSize返回了applyDimensiond的值并做了修正:
final int res = (int)(f+0.5f);
if (res != 0) return res;
if (value == 0) return 0;
if (value > 0) return 1;
return -1;
看看TypeValue.applyDimension
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; }
px类型直接返回
sp类型*metrics.scaledDensity返回
dp类型* metrics.density返回
验证
int a2=getResources().getDimensionPixelOffset(R.dimen.d_12); int a3=getResources().getDimensionPixelSize(R.dimen.d_12); float b1=getResources().getDimension(R.dimen.p_12); int b2=getResources().getDimensionPixelOffset(R.dimen.p_12); int b3=getResources().getDimensionPixelSize(R.dimen.p_12); float c1=getResources().getDimension(R.dimen.s_12); int c2=getResources().getDimensionPixelOffset(R.dimen.s_12); int c3=getResources().getDimensionPixelSize(R.dimen.s_12); Log.e("test", "getDimension= "+a1+", getDimensionPixelOffset="+a2+",getDimensionPixelSize="+a3); Log.e("test", "getDimension= "+b1+", getDimensionPixelOffset="+b2+",getDimensionPixelSize="+b3); Log.e("test", "getDimension= "+c1+", getDimensionPixelOffset="+c2+",getDimensionPixelSize="+c3);
打印如下:
E/test: getDimension= 36.0, getDimensionPixelOffset=36,getDimensionPixelSize=36 E/test: getDimension= 12.0, getDimensionPixelOffset=12,getDimensionPixelSize=12 E/test: getDimension= 36.0, getDimensionPixelOffset=36,getDimensionPixelSize=36
结论
三个方法的返回值大体一致,没什么差别,都可以使用dp,sp,px的dimen资源通过类型的不同对密度做转化
1. resources.getDimension() 直接返回float
2. resources.getDimensionPixelOffset() 强转为int
3. resources.getDimensionPixelSize() 传入不为0时候结果做了修正+0.5f再强转为int
实际使用中都可以差别不大
- 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()区别详解
- SQL Server 扩展属性
- ==与equal区别
- 设计模式之--简单工厂模式
- 设计模式的应用场景(10)--桥模式
- github上传步骤
- getDimension,getDimensionPixelOffset和getDimensionPixelSize区别
- Python、R、Java、 C++ 等:从业界反馈看机器学习语言趋势
- Java9正则表达式新特性
- Jetty之Debug-yellowcong
- C++字符串操作详解
- 机器学习模型性能度量
- 二叉树中序遍历
- 只读事务(@Transactional(readOnly = true))的一些概念
- Android 快速开发系列 ORMLite 框架最佳实践