这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定义如下变量:
<resources>
<dimen name="dp">3.5dp</dimen>
<dimen name="sp">3.5sp</dimen>
</resources>
Android代码如下:
MySystemParams params = MySystemParams.getInstance(this);
String densityInfo = "sp = 3.5,dp = 3.5,测试在各种屏幕密度下各种获取方法取得的值"
+ "\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);
在各种屏幕密度不一样的手机上运行结果如下:
以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