转载请说明出处,本文来自Android菜鸟:http://blog.csdn.net/android_cai_niao/article/details/43701747 QQ:2717521606
这3个方法都是把dimens.xml文件中的dp或sp数值乘以屏幕scale来换算成px单位,那相乘之后可能会有小数,那这个小数怎么处理呢?区别在于此:
注意事项:mTextView.setTextSize(),这个方法默认就是用sp为单位的,因此,如果你就是想要使用sp为单位,那就直接把数值填进去就可以了,如setTextSize(15);这样就是设置了字体大小为15sp。所以这里的15不能写到dimens.xml文件中,因为getDeimension等方法会把dimens.xml中的数值乘以对应的屏幕scale。因此写在dimens.xml中的sp一般只用在xml布局中的引用变量,很少用到代码中去,因为代码中的setTextSize()方法默认就是以sp为单位的。
也许有人会问:“这3个getDemension方法的功能真的是像你说的那样吗?”,答:我是通过下面的方法来得出结论的:
在dimens.xml定义如下变量:
Android代码如下:
在各种屏幕密度不一样的手机上运行结果如下:
以sp=3.5,dp=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 (3.5 x 3.0 = 10.5)
屏幕fontScale3.0
getDimension(dp) = 10.5
getDimensionPixelOffset(dp) = 10 (直接删除小数)
getDimensionPixelSize(dp) = 11 (四舍五入)
getDimension(sp) = 10.5
getDimensionPixelOffset(sp) = 10
getDimensionPixelSize(sp) = 11