在網上搜索了相關資料,研究了兩種算是比較快速的改變程序字體的方法,好,先來介紹着兩種方法。
首先第一種方法是重寫控件(以Textview為例):
1、Android在寫程序的時候谷歌早已將所有字體都默認好了具體是什么字體,自己也沒去研究,所以假如說要讓程序的字體變成自己想要的字體也是件不容易的事情,首先你要先下載字體庫(后綴為ttf),英文的字體庫還不算大,而一般來說中文的字體庫就很大,所以可以更加程序里面出現的文字,對字體庫進行裁剪。要下載字體庫的可以上網下載,網上一堆的是,csdn里面的比較摳門,字體庫居然還要積分,都不想吐槽了。
2、下載完字體庫后,你工程目錄assets文件夾中,新建一個文件夾“fonts”用於放字體庫,然后再加字體庫(.ttf)放到fonts文件夾下,當然你的字體庫文件不能以中文命名。
3、重寫Textview,創建一個類繼承TextView,代碼如下:
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); } }
4、在xml布局文件直接用這個類代替Textview便可以:
<com.example.androidsetting.ChineseTextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" />
再來說說第二種方法,這種方法不需要繼承Textview,不過還是需要字體庫。
前兩個步驟更上面的一樣,這里復制一下。
1、Android在寫程序的時候谷歌早已將所有字體都默認好了具體是什么字體,自己也沒去研究,所以假如說要讓程序的字體變成自己想要的字體也是件不容易的事情,首先你要先下載字體庫(后綴為ttf),英文的字體庫還不算大,而一般來說中文的字體庫就很大,所以可以更加程序里面出現的文字,對字體庫進行裁剪。要下載字體庫的可以上網下載,網上一堆的是,csdn里面的比較摳門,字體庫居然還要積分,都不想吐槽了。
2、下載完字體庫后,你工程目錄assets文件夾中,新建一個文件夾“fonts”用於放字體庫,然后再加字體庫(.ttf)放到fonts文件夾下,當然你的字體庫文件不能以中文命名。、
3、先創建一個方法,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); } } }
4、在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要加載一遍,然后這期間有會有稍微的卡頓,這就是第一種方法最致命的一個缺點。相比之下,第二種方法不會這樣,因為它是先加載界面在修改。但是同樣,這兩種方法,第一次進入界面的時候都會先加載一段時間才能進去,體驗不是很好。