为了账号安全,请及时绑定邮箱和手机立即绑定

android 字体修改

标签:
Android

android字体的设置有以下方法:

1)直接在代码设置

Typeface customFont = Typeface.createFromAsset(this.getAssets(), "1.ttf");
TextView textview1= (TextView) findViewById(R.id.activity_main_header);
textview1.setTypeface(customFont);

这种方法在少数文本需要修改字体的时候比较适用,如果一个项目整体都需要这样的字体的话,那代码就比较重复了,麻烦了、

2)自定义控件

你可以为每个文本组件创建一个子类,如TextView、Button等,然后在构造函数中加载自定义字体。

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)。

<com.your.package. MyTextView         
 android:layout_width="wrap_content"         
 android:layout_height="wrap_content"         
 android:text="小清新"/>

还有,你甚至可以直接在XML中添加自定义的字体属性。要实现这个,你需要定义你自己的declare-styleable属性,然后在组件的构造函数中解析它们。

在大多数情况下,这个方法还不赖,并且有一些优点(例如,切换字体粗细等等,字体可以在组件xml文件的typeface属性中定义)。但是我认为这个实现方法还是太重量级了,并且依赖大量的模板代码,为了一个替换字体的简单任务,有点儿得不偿失。


3)其他方案

理想的解决方案是自定义主题,然后应用到全局或者某个Activity。

但不幸的是,Android的android:typeface属性只能用来设置系统内嵌的字体,而非用户自定义字体(例如assets文件中的字体)。这就是为什么我们无法避免在Java代码中加载并设置字体。

所以我决定创建一个帮助类,使得这个操作尽可能的简单。使用方法:

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 < viewGroup.getChildCount(); 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的文本组件从布局中遍历出来而已。

早期采用的是第二种实现方法,但是缺点在于对于第三方组件,你需要去修改别人的代码,才能实现自定义字体,这恰恰违反了OC(Open & Close)原则,对扩展开放,对修改封闭。

刚看到第三种的时候,也是惊为天人,姑且不说结果,我觉得这种活跃的思路非常重要,很值得学习参考。

但是最后被team里的人否决了,理由是违背组件设计原则,实现方式略嫌粗暴。后来我仔细想想,一个是要做好内存管理(似乎会引起内存问题),视图状态改变,也要重复加载(横竖屏、onResume等),也绝对不是简单的活儿。

原文链接:http://www.apkbus.com/blog-408714-58822.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消