美文网首页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