TextView字体大小设置同方式的区别

时间:2020-11-24 17:28:20

文本字体大小的设置让我一直很疑惑,在xml、代码中的不同方式设置,如果都写成18的大小,但是出来的效果却是不同的字体大小,仔细研究了一下他们之间的差异,整理成文记录下来。

文本字体大小的设置方式有如下几种:

  1. android:textSize=”18sp”;
  2. tv.setTextSize(18);
  3. setTextSize(int unit, 18);

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

TypedValue.COMPLEX_UNIT_PX : Pixels

TypedValue.COMPLEX_UNIT_SP : Scaled Pixels

TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels


前两种方法我们都比较熟悉,分别用于XML、代码中设置字体大小。

但是如果使用相同的数值(如:18)则会得到不同的字体大小的效果,产生的原因是因为setText()的默认单位是sp,此方法后期还会调用setTextSize(int unit, float size)去将sp转换成px再去设置字体的大小,会导致单位不一致,出来的结果也不一样了。解决办法是使用第三种方式去指定单位设置文本大小,就可以实现效果一致。

 

在自定义控件的时候我们也会常使用一种单位转化方法来达到适配的目的

float size=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 18,getResources().getDisplayMetrics());

单位可选类型:

TypedValue.COMPLEX_UNIT_PX : Pixels

TypedValue.COMPLEX_UNIT_SP : Scaled Pixels

TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels

这种方式是将18sp转换成以px为单位的值,可以解决自定义控件屏幕适配的麻烦。最终也是以px为单位,若是设置文本大小,可以使用这种方式转化单位,也可以通过第三种方式直接指定单位设置大小。

 

从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

参考资料:http://www.jianshu.com/p/9cdfc2f26a52