Android 修改應用程序字體

在網上搜索了相關資料,研究了兩種算是比較快速的改變程序字體的方法,好,先來介紹着兩種方法。java

首先第一種方法是重寫控件(以Textview爲例):android

 一、Android在寫程序的時候谷歌早已將全部字體都默認好了具體是什麼字體,本身也沒去研究,因此假如說要讓程序的字體變成本身想要的字體也是件不容易的事情,首先你要先下載字體庫(後綴爲ttf),英文的字體庫還不算大,而通常來講中文的字體庫就很大,因此能夠更加程序裏面出現的文字,對字體庫進行裁剪。要下載字體庫的能夠上網下載,網上一堆的是,csdn裏面的比較摳門,字體庫竟然還要積分,都不想吐槽了。佈局

  二、下載完字體庫後,你工程目錄assets文件夾中,新建一個文件夾「fonts」用於放字體庫,而後再加字體庫(.ttf)放到fonts文件夾下,固然你的字體庫文件不能以中文命名。字體

  三、重寫Textview,建立一個類繼承TextView,代碼以下:this

public class ChineseTextView extends TextView {


	public ChineseTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
		/*
		 * 必須事先在assets底下建立一fonts文件夾 並放入要使用的字體文件(.ttf)
		 * 並提供相對路徑給creatFromAsset()來建立Typeface對象
		 */
		Typeface fontFace = Typeface.createFromAsset(context.getAssets(),
				"fonts/Microsoft.ttf");
		// 字體文件必須是true type font的格式(ttf);
		// 當使用外部字體卻又發現字體沒有變化的時候(以 Droid Sans代替),一般是由於
		// 這個字體android沒有支持,而非你的程序發生了錯誤
		setTypeface(fontFace);
		}
	}

  四、在xml佈局文件直接用這個類代替Textview即可以:xml

            <com.example.androidsetting.ChineseTextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TextView" />

再來講說第二種方法,這種方法不須要繼承Textview,不過仍是須要字體庫。對象

 前兩個步驟更上面的同樣,這裏複製一下。blog

 一、Android在寫程序的時候谷歌早已將全部字體都默認好了具體是什麼字體,本身也沒去研究,因此假如說要讓程序的字體變成本身想要的字體也是件不容易的事情,首先你要先下載字體庫(後綴爲ttf),英文的字體庫還不算大,而通常來講中文的字體庫就很大,因此能夠更加程序裏面出現的文字,對字體庫進行裁剪。要下載字體庫的能夠上網下載,網上一堆的是,csdn裏面的比較摳門,字體庫竟然還要積分,都不想吐槽了。繼承

  二、下載完字體庫後,你工程目錄assets文件夾中,新建一個文件夾「fonts」用於放字體庫,而後再加字體庫(.ttf)放到fonts文件夾下,固然你的字體庫文件不能以中文命名。、get

  三、先建立一個方法,changeFont(ViewGroup root){},用來遍歷當前頁面的控件,目的就是爲了給同一類控件進行樣式設置,因此用這種方法也能比較快的進行字體設置

	protected void changeFont(ViewGroup root) {       
		Typeface tf = Typeface.createFromAsset(this.getAssets(),
		"fonts/Microsoft.ttf");
        for(int i = 0; i <root.getChildCount(); i++) {
                 View v = root.getChildAt(i);
                 if(v instanceof Button) {
                     ((Button)v).setTypeface(tf);
                     ((Button)v).setTextSize(15);
                     ((Button)v).setTextColor(Color.GRAY);
                 } else if(v instanceof TextView ) {
                     ((TextView)v).setTypeface(tf);
                     ((TextView)v).setTextSize(15);
                     ((TextView)v).setTextColor(Color.GRAY);
                 } else if(v instanceof EditText) {
                         ((EditText)v).setTypeface(tf);
                         ((EditText)v).setTextSize(15);
                         ((EditText)v).setTextColor(Color.GRAY);
                 } else if(v instanceof ViewGroup) {
                         changeFont((ViewGroup)v);
                 }
         }
     }

   四、在onCreate方法中,固然在setContentView(R.layout.activity_main);後面去實現

    ViewGroup root=(ViewGroup) this.getWindow().getDecorView();  //獲取本Activity下的獲取最外層控件
    changeFont(root);

  上面兩種方法都介紹了,下面總結一下這兩種方法的感覺,我以爲都各有優缺點。

第一種方法,不須要在activity中增長代碼,直接修改控件的就好了,可是呢,由於一頁面有須要控件都是有文字的,如button,checkbox,一堆,因此要是全都改的話不是要所有從新這些控件。第二種方法的話在activity裏面增長代碼,那麼就差很少都要在全部activity裏面增長代碼,而後沒了。對了第一種方法,實際上是在xml裏面去實現,就是說你的控件每出現一次就要TextView一次,用ScrollView來講明問題,ScrollView裏面有不少個Textview,都是經過第一種方法去修改字體,第一次加載界面,會加載一段時間(看你加載的多少)纔將頁面顯示出來,而後ScrollView往下拖動,以前看不到的textview要加載一遍,而後這期間有會有稍微的卡頓,這就是第一種方法最致命的一個缺點。相比之下,第二種方法不會這樣,由於它是先加載界面在修改。可是一樣,這兩種方法,第一次進入界面的時候都會先加載一段時間才能進去,體驗不是很好。

相關文章
相關標籤/搜索