美文网首页Android Tips程序员Android技术知识
【TextView】代码中设置文本大小时的单位问题

【TextView】代码中设置文本大小时的单位问题

作者: 亦枫 | 来源:发表于2015-12-08 23:00 被阅读3311次

大家知道,在Android代码中获取res资源dimens.xml文件中定义的尺寸大小,可以通过如下三个方法:

  • getDimension
  • getDimensionPixelOffset
  • getDimensionPixelSize

他们的相同点和区别是:

  1. getDimension和getDimensionPixelOffset功能类似,唯一区别就是返回类型不一样,前者返回类型为int类型,后者为float类型;

  2. 如果resources中dimen属性值的单位是dp或者sp,三者都需要将其乘以density,然后返回对应px值;

  3. 如果单位是px,getDimension和getDimensionPixelOffset返回原值,而getDimensionPixelSize仍需乘以density;

比如,在dimens.xml资源文件中定义如下测试尺寸:

<resources>  
    <dimen name="dp_01">16dp</dimen>  
    <dimen name="px_01">16px</dimen>  
    <dimen name="sp_01">16sp</dimen>  
 </resources>  

测试代码:

float a1=getResources().getDimension(R.dimen.dp_01);    
int a2=getResources().getDimensionPixelOffset(R.dimen.dp_01);    
int a3=getResources().getDimensionPixelSize(R.dimen.dp_01);    
  
float b1=getResources().getDimension(R.dimen.px_01);  
int b2=getResources().getDimensionPixelOffset(R.dimen.px_01);    
int b3=getResources().getDimensionPixelSize(R.dimen.px_01);    
  
float c1=getResources().getDimension(R.dimen.sp_01);    
int c2=getResources().getDimensionPixelOffset(R.dimen.sp_01);    
int c3=getResources().getDimensionPixelSize(R.dimen.sp_01);    
  
Log.d("test", "getDimension= "+a1+", getDimensionPixelOffset="+a2+",getDimensionPixelSize="+a3);    
Log.d("test", "getDimension= "+b1+", getDimensionPixelOffset="+b2+",getDimensionPixelSize="+b3);    
Log.d("test", "getDimension= "+c1+", getDimensionPixelOffset="+c2+",getDimensionPixelSize="+c3); 

测试结果:

//Device (480*800,240dpi,density=1.5):   
getDimension= 24.0, getDimensionPixelOffset=24,getDimensionPixelSize=24    
getDimension= 16.0, getDimensionPixelOffset=16,getDimensionPixelSize=24    
getDimension= 24.0, getDimensionPixelOffset=24,getDimensionPixelSize=24    

了解了上述区别后,再来看看在代码中设置TextSize的问题。

setTextSize(float size)的默认大小单位是sp,所以通过该方法设置的文本大小和在布局中通过android:textSize属性设置的文本大小不一致,所以需要用到设置文本大小的另一个方法,指定单位:
setTextSize(int unit, float size)

其中,第一个参数的可选单位值为:

  • TypedValue.COMPLEX_UNIT_PX : Pixels
  • TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
  • TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels

可以根据在资源中定义的不同尺寸选择合适的单位格式,这样,就能在代码中设置和布局中相同大小的文本。

关注微信公众号,第一时间获取技术资讯!

微信公众号【技术鸟】_二维码.gif

相关文章

网友评论

  • 2690e3ff7b05:楼主:
    他们的相同点和区别是:
    getDimension和getDimensionPixelOffset功能类似,唯一区别就是返回类型不一样,前者返回类型为int类型,后者为float类型;写反了。
    public float getDimension(@DimenRes int id) throws NotFoundException {},
    public int getDimensionPixelOffset(@DimenRes int id) throws NotFoundException {}
  • 6ff8b31e1dc6:👍👍

本文标题:【TextView】代码中设置文本大小时的单位问题

本文链接:https://www.haomeiwen.com/subject/kzbehttx.html