getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()区别详解
2015-12-10 14:29
447 查看
在dimens.xml定义如下变量:
[java]view plaincopy
<resources>
<dimen name="dp">16dp</dimen>
<dimen name="sp">16sp</dimen>
</resources>
Android代码如下:
[java]view
plaincopy
MySystemParams params = MySystemParams.getInstance(this);
String densityInfo = "数值为16,测试各种单位、各种获取方法取得的数值"
+ "\n屏幕densityDpi:" + params.densityDpi
+ "\n屏幕scale:" + params.scale
+ "\n屏幕fontScale" + params.fontScale + "\n";
Log.i("MainActivity", densityInfo);
float dp1 = getResources().getDimension(R.dimen.dp);
int dp2 = getResources().getDimensionPixelOffset(R.dimen.dp);
int dp3 = getResources().getDimensionPixelSize(R.dimen.dp);
float sp1 = getResources().getDimension(R.dimen.sp);
int sp2 = getResources().getDimensionPixelOffset(R.dimen.sp);
int sp3 = getResources().getDimensionPixelSize(R.dimen.sp);
String text = "getDimension(dp) = " + dp1 + "\n"
+ "getDimensionPixelOffset(dp) = " + dp2 + "\n"
+ "getDimensionPixelSize(dp) = " + dp3 + "\n" + "\n"
+ "getDimension(sp) = " + sp1 + "\n"
+ "getDimensionPixelOffset(sp) = " + sp2 + "\n"
+ "getDimensionPixelSize(sp) = " + sp3;
Log.i("MainActivity", text);
在各种屏幕密度不一样的手机上运行结果如下:
数值为16,测试各种单位、各种获取方法取得的数值
屏幕densityDpi:160
屏幕scale:1.0
屏幕fontScale:1.0
getDimension(dp) = 16.0
getDimensionPixelOffset(dp) = 16
getDimensionPixelSize(dp) = 16
getDimension(sp) = 16.0
getDimensionPixelOffset(sp) = 16
getDimensionPixelSize(sp) = 16
---------------------------------------------------
屏幕densityDpi:240
屏幕scale:1.5
屏幕fontScale:1.5
getDimension(dp) = 24.0
getDimensionPixelOffset(dp) = 24
getDimensionPixelSize(dp) = 24
getDimension(sp) = 24.0
getDimensionPixelOffset(sp) = 24
getDimensionPixelSize(sp) = 24
---------------------------------------------------
屏幕densityDpi:320
屏幕scale:2.0
屏幕fontScale:2.0
getDimension(dp) = 32.0
getDimensionPixelOffset(dp) = 32
getDimensionPixelSize(dp) = 32
getDimension(sp) = 32.0
getDimensionPixelOffset(sp) = 32
getDimensionPixelSize(sp) = 32
---------------------------------------------------
屏幕densityDpi:480
屏幕scale:3.0
屏幕fontScale:3.0
getDimension(dp) = 48.0
getDimensionPixelOffset(dp) = 48
getDimensionPixelSize(dp) = 48
getDimension(sp) = 48.0
getDimensionPixelOffset(sp) = 48
getDimensionPixelSize(sp) = 48
结论:getDimension()、getDimensionPixelOffset()、getDimensionPixelSize()这3个方法
相同点:1、它们都是把dimens.xml中的数值乘以屏幕scale。
2、dimens.xml中的单位写dp或sp感觉上没有区别,但如果你是用在设置字体大小的话还是建议用sp单位的。
3、这3个方法返回的值都是px,也就是说它们把dp或sp转换为了px。
不同点:getDimension()返回的是float,精度更高,另外两个方法返回的是int,应该会四舍五入,那问题就来了,这两个返回int的方法有什么区别呢?试验如下:
把dimens.xml中的数值改为:3.5,运行结果如下:
数值为3.5,测试各种单位、各种获取方法取得的数值
屏幕densityDpi:160
屏幕scale:1.0 3.5 x1.0 = 3.5
屏幕fontScale1.0
getDimension(dp) = 3.5
getDimensionPixelOffset(dp) = 3 直接删除小数
getDimensionPixelSize(dp) = 4 四舍五入
getDimension(sp) = 3.5
getDimensionPixelOffset(sp) = 3
getDimensionPixelSize(sp) = 4
-----------------------------------------------------------------------------------
屏幕densityDpi:240
屏幕scale:1.5 3.5 x 1.5 = 5.25
屏幕fontScale1.5
getDimension(dp) = 5.25
getDimensionPixelOffset(dp) = 5 直接删除小数
getDimensionPixelSize(dp) = 5 四舍五入
getDimension(sp) = 5.25
getDimensionPixelOffset(sp) = 5
getDimensionPixelSize(sp) = 5
-----------------------------------------------------------------------------------
屏幕densityDpi:320
屏幕scale:2.0 3.5 x 2.0 = 7.0
屏幕fontScale2.0
getDimension(dp) = 7.0
getDimensionPixelOffset(dp) = 7 直接删除小数
getDimensionPixelSize(dp) = 7 四舍五入
getDimension(sp) = 7.0
getDimensionPixelOffset(sp) = 7
getDimensionPixelSize(sp) = 7
-----------------------------------------------------------------------------------
屏幕densityDpi:480
屏幕scale:3.0
屏幕fontScale3.0
getDimension(dp) = 10.5
getDimensionPixelOffset(dp) = 10 直接删除小数
getDimensionPixelSize(dp) = 11 四舍五入
getDimension(sp) = 10.5
getDimensionPixelOffset(sp) = 10
getDimensionPixelSize(sp) = 11
通过上面的试验,结论是:getDimensionPixelOffset()是直接把小数删除,而getDimensionPixelSize()则会进行四舍五入。使用场景:如果是设置调用setTextSize(float)方法,则使用getDimension()方法即可,这个是精度最准的,而如果你要使用这些值的地方只接受int类型,则可以使用getDimensionPixelOffset()或getDimensionPixelSize(),根据你是需要直接删除小数,还是要四舍五入来选择一个即可。
注:这里有一个错误:“调用setTextSize(float)方法,则使用getDimension()方法”,这是错误的,因为setTextSize(float)方法默认单位就是sp,内部会自动乘以scale来转换为px(像素),所以当在代码中设置setTextSize(float)时,直接把数值写在这个方法参数里即可,如果调用getDimension的话,则这个size值会乘两次scale,因此得到的值就是变大了。最后结论就是getDimension()、getDimensionPixelOffset()、getDimensionPixelSize()这3个方法只适用于获取dimens.xml中定义的dp的值转换为等价的px值(像素值),对于sp的值这3个方法无用武之地。
正确用法应该是:setTextSize(TypeValue.COMPLEX_UNIT_PX, getResource().getDimension(id))
转自:http://www.codes51.com/article/detail_107753.html
[java]view plaincopy
<resources>
<dimen name="dp">16dp</dimen>
<dimen name="sp">16sp</dimen>
</resources>
Android代码如下:
[java]view
plaincopy
MySystemParams params = MySystemParams.getInstance(this);
String densityInfo = "数值为16,测试各种单位、各种获取方法取得的数值"
+ "\n屏幕densityDpi:" + params.densityDpi
+ "\n屏幕scale:" + params.scale
+ "\n屏幕fontScale" + params.fontScale + "\n";
Log.i("MainActivity", densityInfo);
float dp1 = getResources().getDimension(R.dimen.dp);
int dp2 = getResources().getDimensionPixelOffset(R.dimen.dp);
int dp3 = getResources().getDimensionPixelSize(R.dimen.dp);
float sp1 = getResources().getDimension(R.dimen.sp);
int sp2 = getResources().getDimensionPixelOffset(R.dimen.sp);
int sp3 = getResources().getDimensionPixelSize(R.dimen.sp);
String text = "getDimension(dp) = " + dp1 + "\n"
+ "getDimensionPixelOffset(dp) = " + dp2 + "\n"
+ "getDimensionPixelSize(dp) = " + dp3 + "\n" + "\n"
+ "getDimension(sp) = " + sp1 + "\n"
+ "getDimensionPixelOffset(sp) = " + sp2 + "\n"
+ "getDimensionPixelSize(sp) = " + sp3;
Log.i("MainActivity", text);
在各种屏幕密度不一样的手机上运行结果如下:
数值为16,测试各种单位、各种获取方法取得的数值
屏幕densityDpi:160
屏幕scale:1.0
屏幕fontScale:1.0
getDimension(dp) = 16.0
getDimensionPixelOffset(dp) = 16
getDimensionPixelSize(dp) = 16
getDimension(sp) = 16.0
getDimensionPixelOffset(sp) = 16
getDimensionPixelSize(sp) = 16
---------------------------------------------------
屏幕densityDpi:240
屏幕scale:1.5
屏幕fontScale:1.5
getDimension(dp) = 24.0
getDimensionPixelOffset(dp) = 24
getDimensionPixelSize(dp) = 24
getDimension(sp) = 24.0
getDimensionPixelOffset(sp) = 24
getDimensionPixelSize(sp) = 24
---------------------------------------------------
屏幕densityDpi:320
屏幕scale:2.0
屏幕fontScale:2.0
getDimension(dp) = 32.0
getDimensionPixelOffset(dp) = 32
getDimensionPixelSize(dp) = 32
getDimension(sp) = 32.0
getDimensionPixelOffset(sp) = 32
getDimensionPixelSize(sp) = 32
---------------------------------------------------
屏幕densityDpi:480
屏幕scale:3.0
屏幕fontScale:3.0
getDimension(dp) = 48.0
getDimensionPixelOffset(dp) = 48
getDimensionPixelSize(dp) = 48
getDimension(sp) = 48.0
getDimensionPixelOffset(sp) = 48
getDimensionPixelSize(sp) = 48
结论:getDimension()、getDimensionPixelOffset()、getDimensionPixelSize()这3个方法
相同点:1、它们都是把dimens.xml中的数值乘以屏幕scale。
2、dimens.xml中的单位写dp或sp感觉上没有区别,但如果你是用在设置字体大小的话还是建议用sp单位的。
3、这3个方法返回的值都是px,也就是说它们把dp或sp转换为了px。
不同点:getDimension()返回的是float,精度更高,另外两个方法返回的是int,应该会四舍五入,那问题就来了,这两个返回int的方法有什么区别呢?试验如下:
把dimens.xml中的数值改为:3.5,运行结果如下:
数值为3.5,测试各种单位、各种获取方法取得的数值
屏幕densityDpi:160
屏幕scale:1.0 3.5 x1.0 = 3.5
屏幕fontScale1.0
getDimension(dp) = 3.5
getDimensionPixelOffset(dp) = 3 直接删除小数
getDimensionPixelSize(dp) = 4 四舍五入
getDimension(sp) = 3.5
getDimensionPixelOffset(sp) = 3
getDimensionPixelSize(sp) = 4
-----------------------------------------------------------------------------------
屏幕densityDpi:240
屏幕scale:1.5 3.5 x 1.5 = 5.25
屏幕fontScale1.5
getDimension(dp) = 5.25
getDimensionPixelOffset(dp) = 5 直接删除小数
getDimensionPixelSize(dp) = 5 四舍五入
getDimension(sp) = 5.25
getDimensionPixelOffset(sp) = 5
getDimensionPixelSize(sp) = 5
-----------------------------------------------------------------------------------
屏幕densityDpi:320
屏幕scale:2.0 3.5 x 2.0 = 7.0
屏幕fontScale2.0
getDimension(dp) = 7.0
getDimensionPixelOffset(dp) = 7 直接删除小数
getDimensionPixelSize(dp) = 7 四舍五入
getDimension(sp) = 7.0
getDimensionPixelOffset(sp) = 7
getDimensionPixelSize(sp) = 7
-----------------------------------------------------------------------------------
屏幕densityDpi:480
屏幕scale:3.0
屏幕fontScale3.0
getDimension(dp) = 10.5
getDimensionPixelOffset(dp) = 10 直接删除小数
getDimensionPixelSize(dp) = 11 四舍五入
getDimension(sp) = 10.5
getDimensionPixelOffset(sp) = 10
getDimensionPixelSize(sp) = 11
通过上面的试验,结论是:getDimensionPixelOffset()是直接把小数删除,而getDimensionPixelSize()则会进行四舍五入。使用场景:如果是设置调用setTextSize(float)方法,则使用getDimension()方法即可,这个是精度最准的,而如果你要使用这些值的地方只接受int类型,则可以使用getDimensionPixelOffset()或getDimensionPixelSize(),根据你是需要直接删除小数,还是要四舍五入来选择一个即可。
注:这里有一个错误:“调用setTextSize(float)方法,则使用getDimension()方法”,这是错误的,因为setTextSize(float)方法默认单位就是sp,内部会自动乘以scale来转换为px(像素),所以当在代码中设置setTextSize(float)时,直接把数值写在这个方法参数里即可,如果调用getDimension的话,则这个size值会乘两次scale,因此得到的值就是变大了。最后结论就是getDimension()、getDimensionPixelOffset()、getDimensionPixelSize()这3个方法只适用于获取dimens.xml中定义的dp的值转换为等价的px值(像素值),对于sp的值这3个方法无用武之地。
正确用法应该是:setTextSize(TypeValue.COMPLEX_UNIT_PX, getResource().getDimension(id))
转自:http://www.codes51.com/article/detail_107753.html
相关文章推荐
- 代理模式(Proxy)—山下的水泥厂
- 列表
- 安装完CentOS 7 后必做的七件事
- 安装完CentOS 7 后必做的七件事
- 安装完CentOS 7 后必做的七件事
- 安装完CentOS 7 后必做的七件事
- 安装完CentOS 7 后必做的七件事
- SpringMVC的Date与String互转
- 一步一步学写makefile
- 剑指offer系列之二十八:最小的k个数
- leetcode:237 Delete Node in a Linked List-每日编程第四题
- 【剑指offer】之连续子数组的最大和
- .NET Framework Regular Expressions
- Spring Security 自定义登录页面
- 【十大经典数据挖掘算法】CART
- Java之旅--ConcurrentModificationException关于异常原因和解决方法
- eclipse_mars不支持testng插件
- (java)Pascal's Triangle II
- 线搜索(line search)方法
- BOM与DOM简介