android 变化字体,android 字体修改
android字體的設(shè)置有以下方法:
1)直接在代碼設(shè)置Typeface?customFont?=?Typeface.createFromAsset(this.getAssets(),?"1.ttf");
TextView?textview1=?(TextView)?findViewById(R.id.activity_main_header);
textview1.setTypeface(customFont);
這種方法在少數(shù)文本需要修改字體的時候比較適用,如果一個項目整體都需要這樣的字體的話,那代碼就比較重復(fù)了,麻煩了、
2)自定義控件
你可以為每個文本組件創(chuàng)建一個子類,如TextView、Button等,然后在構(gòu)造函數(shù)中加載自定義字體。public?class?MyTextView?extends?TextView?{
public?MyTextView?(Context?context,?AttributeSet?attrs,?int?defStyle)?{
super(context,?attrs,?defStyle);
}
public?MyTextView?(Context?context,?AttributeSet?attrs)?{
super(context,?attrs);
}
public?MyTextView?(Context?context)?{
super(context);
}
public?void?setTypeface(Typeface?tf,?int?style)?{
super.setTypeface(Typeface.createFromAsset(getContext().getAssets(),?"1.tff"))
}
}
然后只需要將標準的文本控件替換成你自定義的就可以了(例如BrandTextView替換TextView)。
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="小清新"/>
還有,你甚至可以直接在XML中添加自定義的字體屬性。要實現(xiàn)這個,你需要定義你自己的declare-styleable屬性,然后在組件的構(gòu)造函數(shù)中解析它們。
在大多數(shù)情況下,這個方法還不賴,并且有一些優(yōu)點(例如,切換字體粗細等等,字體可以在組件xml文件的typeface屬性中定義)。但是我認為這個實現(xiàn)方法還是太重量級了,并且依賴大量的模板代碼,為了一個替換字體的簡單任務(wù),有點兒得不償失。
3)其他方案
理想的解決方案是自定義主題,然后應(yīng)用到全局或者某個Activity。
但不幸的是,Android的android:typeface屬性只能用來設(shè)置系統(tǒng)內(nèi)嵌的字體,而非用戶自定義字體(例如assets文件中的字體)。這就是為什么我們無法避免在Java代碼中加載并設(shè)置字體。
所以我決定創(chuàng)建一個幫助類,使得這個操作盡可能的簡單。使用方法:
FontHelper.applyFont(context, findViewById(R.id.activity_root), "fonts/YourCustomFont.ttf");
并且這行代碼會用來加載所有的基于TextView的文本組件(TextView、Button、RadioButton、ToggleButton等等),而無需考慮界面的布局層級如何。
標準(左)與自定義(右)字體的用法。
Standard (left) and Custom (right) fonts usage.
這是怎么做到的?非常簡單:1.??public?static?void?applyFont(final?Context?context,?final?View?root,?final?String?fontName)?{
2.??????try?{
3.??????????if?(root?instanceof?ViewGroup)?{
4.??????????????ViewGroup?viewGroup?=?(ViewGroup)?root;
5.??????????????for?(int?i?=?0;?i?
6.??????????????????applyFont(context,?viewGroup.getChildAt(i),?fontName);
7.??????????}?else?if?(root?instanceof?TextView)
8.??????????????((TextView)?root).setTypeface(Typeface.createFromAsset(context.getAssets(),?fontName));
9.??????}?catch?(Exception?e)?{
10.????????Log.e(TAG,?String.format("Error?occured?when?trying?to?apply?%s?font?for?%s?view",?fontName,?root));
11.????????e.printStackTrace();
12.????}
13.}
正如你所看到的,所需要做的僅僅是將基于TextView的文本組件從布局中遍歷出來而已。
早期采用的是第二種實現(xiàn)方法,但是缺點在于對于第三方組件,你需要去修改別人的代碼,才能實現(xiàn)自定義字體,這恰恰違反了OC(Open & Close)原則,對擴展開放,對修改封閉。
剛看到第三種的時候,也是驚為天人,姑且不說結(jié)果,我覺得這種活躍的思路非常重要,很值得學(xué)習(xí)參考。
但是最后被team里的人否決了,理由是違背組件設(shè)計原則,實現(xiàn)方式略嫌粗暴。后來我仔細想想,一個是要做好內(nèi)存管理(似乎會引起內(nèi)存問題),視圖狀態(tài)改變,也要重復(fù)加載(橫豎屏、onResume等),也絕對不是簡單的活兒。
總結(jié)
以上是生活随笔為你收集整理的android 变化字体,android 字体修改的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言调用tuxedo步骤,tuxedo
- 下一篇: android自定义view圆,Andr