天天看點

TextView字型大小設定同方式的差別

文本字型大小的設定讓我一直很疑惑,在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