第一次写博文,虽然是这里参考一点,那里摘抄一点,但学会总结也算是一大进步了。期待菜鸟到雄鹰的蜕变。

言归正传,下面正式说说android下自定义字体的使用方法。

参考了不少前辈写的博文和代码,发现实现自定义字体总共3种方法。(小弟在android上还是菜鸟一枚,欢迎大家指导讨论……)。

三种方法的大致步骤都一样,都是引入字体库文件,然后调用字体库:

在 assets 目录下创建 fonts 文件夹并放入要使用的字体文件 (**.ttf) ,并提供相对路径给 createFromAsset(AssetManager mgr, String path)  来创建 Typeface 对象,再通过TextView.setTypeface(Typeface tf)  指定文本显示的字体。

 

具体实现可分为三种:

1.针对需要使用自定义字体的控件分别调用 setTypeface(Typeface tf) 方法。个人觉得这是最不值得借鉴的代码,需要实现自定义字体的控件少还好说,一旦控件多了,那就需要一个个控件来调用 setTypeface(Typeface tf) 方法,这样代码量会非常多,而且冗余,不推荐使用。

代码示例如下:

Typeface face = Typeface.createFromAsset(getAssets(),"fonts/**.TTF");

        tv_title = (TextView) findViewById(R.id.tv_title);
        tv_title.setTypeface(face);

        tv_author = (TextView) findViewById(R.id.tv_author);
        tv_author.setTypeface(face);

        tv_line1 = (TextView) findViewById(R.id.tv_line1);
        tv_line1.setTypeface(face);

        tv_line2 = (TextView) findViewById(R.id.tv_line2);
        tv_line2.setTypeface(face);
        tv_line3 = (TextView) findViewById(R.id.tv_line3);
        tv_line3.setTypeface(face);

        tv_line4 = (TextView) findViewById(R.id.tv_line4);
        tv_line4.setTypeface(face);




2.自定义需要实现自定义字体的控件,在构造方法中创建 Typeface 对象,然后使用 setTypeface(tf)方法设置字体。

代码示例如下:

package android_serialport_api.view;

import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * <p>
 *  自定义TextView,实现控件自定义字体
 * </p>
 * @author zhouyi
 * @version $Id: CustomTextView.java,v 0.1 2014年12月5日 下午4:45:11 zhouyi Exp $
 */
public class CustomTextView extends TextView {

	private static Typeface tf = null;

	public CustomTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context);
	}

	/** 初始化使用自定义字体 */
	private void init(Context context) {
		getTypefaceInstance(context);
		setTypeface(tf);
	}

	/** 单例模式创建Typeface实例 */
	private static Typeface getTypefaceInstance(Context context) {
		if (null == tf) {
			tf = Typeface.createFromAsset(context.getAssets(), "fonts/**.TTF");
		}
		return tf;
	}

}

注:1.此处只实现了TextView,如果要实现Button、EditText等控件的自定义字体,可以自行实现,反正代码是类似的。

    2.因为字库的尺寸少则几兆,多则几十兆,所以每次使用 Typeface.createFromAsset(context.getAssets(), "fonts/**.TTF") 创建Typeface实例会很费时间,所以最好使用单例模式。

    3.遍历Activity中的控件,然后给需要使用自定义字体的控件上setTypeface。

示例代码如下:

/**改变全局字体*/
	protected void changeFont(ViewGroup root) {
		if(null==tf){
			tf = Typeface.createFromAsset(getAssets(),
					"fonts/chaocusongjian.ttf");
		}
		for (int i = 0; i < root.getChildCount(); i++) {
			View v = root.getChildAt(i);
			if (v instanceof TextView) {
				((TextView) v).setTypeface(tf);
			} else if (v instanceof Button) {
				((Button) v).setTypeface(tf);
			} else if (v instanceof EditText) {
				((EditText) v).setTypeface(tf);
			} else if (v instanceof ViewGroup) {
				changeFont((ViewGroup) v);
			}
		}

	}

同样,这里Typeface实例最好使用单例模式写。

还需要补充说明一下:

虽然采用这种方式可以实现自己想要的显示效果,但是在采用这种方法之前开发人员还是需要考虑下性能消耗和运行环境以及自己 APP 的风格,然后再做出对应的选择。原因有以下几点:

字库文件的大小:因为字库的尺寸少则几兆,多则几十兆,文件打包的时候对 *.ttf 格式的文件压缩率很低,所以会无形中增大 APP 的体积。

运行环境的考虑:如果你的应用面向的是高版本的运行环境,可以考虑使用这种方法,如果用户的运行环境是 Android 2.2 需要放弃该方法。

应用风格的考虑:如果你的应用既面向高版本运行环境,并且你的应用中统一使用指定的字体,可以考虑使用该方法;若是单单为了应用中的某几个字的显示效果就使用字库,则会得不偿失。 

最后,这是小弟第一次写博文,而且小弟在android方面还是一个不知不扣的菜鸟,如果有android前辈大牛知道还有其他方法的,欢迎指正。小弟拜谢!