getDimension与getDimensionPixelOffset与getDimensionPixelSize的区别

转载请说明出处,本文来自Android菜鸟:http://blog.csdn.net/android_cai_niao/article/details/43701747   QQ:2717521606


这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定义如下变量:

[java]  view plain copy
  1.   
  2.   
  3.     "dp">3.5dp    
  4.     "sp">3.5sp   
  5.   
  6.   

Android代码如下:

[java]  view plain copy
  1. MySystemParams params = MySystemParams.getInstance(this);  
  2. String densityInfo = "sp = 3.5,dp = 3.5,测试在各种屏幕密度下各种获取方法取得的值"  
  3.              + "\n屏幕densityDpi:" + params.densityDpi  
  4.              + "\n屏幕scale:" + params.scale  
  5.              + "\n屏幕fontScale" + params.fontScale + "\n";  
  6. Log.i("MainActivity", densityInfo);  
  7.   
  8. float dp1 = getResources().getDimension(R.dimen.dp);    
  9.    int dp2 = getResources().getDimensionPixelOffset(R.dimen.dp);    
  10.    int dp3 = getResources().getDimensionPixelSize(R.dimen.dp);    
  11.      
  12.    float sp1 = getResources().getDimension(R.dimen.sp);    
  13.    int sp2 = getResources().getDimensionPixelOffset(R.dimen.sp);    
  14.    int sp3 = getResources().getDimensionPixelSize(R.dimen.sp);  
  15.    
  16.    String text = "getDimension(dp) = " + dp1 + "\n"  
  17.             + "getDimensionPixelOffset(dp) = " + dp2 + "\n"  
  18.             + "getDimensionPixelSize(dp) = " + dp3 + "\n" + "\n"  
  19.             + "getDimension(sp) = " + sp1 + "\n"  
  20.             + "getDimensionPixelOffset(sp) = " + sp2 + "\n"  
  21.             + "getDimensionPixelSize(sp) = " + sp3;  
  22. 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

你可能感兴趣的:(android)