您当前的位置:首页 > 计算机 > 编程开发 > 安卓(android)开发

getDimension与getDimensionPixelOffset与getDimensionPixelSize的区别

时间:02-04来源:作者:点击数:

这3个方法都是把dimens.xml文件中的dp或sp数值乘以屏幕scale来换算成px单位,那相乘之后可能会有小数,那这个小数怎么处理呢?区别在于此:

  • getDimension() 返回float型px值 精确
  • getDimensionPixelOffset() 返回int型px值 直接把小数删除
  • getDimensionPixelSize() 返回int型px值 进行四舍五入

各方法使用场景:

  • 如果你的代码中可以用float作为长度单位的话,就用getDimension()方法,因为最精确嘛
  • 如果只能接收int为长度单位的的话,那就看你自己的需求来选要用getDimensionPixelOffset()或getDimensionPixelSize()
  • 如果你在写代码的时候不记得这3个方法的区别了,无所谓了,随便用哪一个都可以,不就是相差小数点那一点点的大小而已嘛,差别很小可以忽略不计了

注意事项: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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门