Android自定义字体类库Calligraphy--快速实现自定义应用字体

现在手机上字体美化软件越来越多,各种怪状各种风格的字体都有,
这里写图片描述
作为Android开发人员,应用中有时会需要强制使用某种字体(这样做会增大应用的内存消耗,而且字体包越大消耗内存越大),所以我们就需要尽量的减少内存消耗,同时使用我们自定义的字体

####设置自定义字体的方法
在xml中,可以看到一个属性

1
android:typeface="sans"

不过在xml中只能设置为 none,sans,serif,monospace 中的一种
在java代码中,可以找到TextView的一个方法
这里写图片描述

我们通过textview.setTypeface(typeface);即可实现自定义字体,typeface对象我们可以Typeface类的createFromAsset静态方法创建(这里是不是就是前面所学的工厂模式呢),
总之,实现起来跟简单.

1
2
3
textview = (TextView) findViewById(R.id.textview);
Typeface typeface1 = Typeface.createFromAsset(getAssets(), "fzltxh_gbk.ttf");
textview.setTypeface(typeface1);

但是不能每次都这样重新获取TextView再重新设置字体吧,这样太麻烦,而且消耗性能,所以我们就可以自定义TextView,然后重写onDraw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class CoustomFontTextView extends TextView {
public CoustomFontTextView(Context context) {
this(context, null);
}

public CoustomFontTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public CoustomFontTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);

this.setTypeface(Typeface.createFromAsset(getResources().getAssets(), "fzltxh_gbk.ttf"));
}
}

布局文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="8dp" >

<com.zyh.testcustomfont.CustomFontTextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:lineSpacingMultiplier="1.1"
android:text="@string/content"
android:textColor="@android:color/black"
android:textSize="16sp" />

<com.zyh.testcustomfont.CustomFontTextView
android:id="@+id/textview2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:lineSpacingMultiplier="1.1"
android:text="@string/content"
android:textColor="@android:color/black"
android:textSize="16sp" />

<com.zyh.testcustomfont.CustomFontTextView
android:id="@+id/textview3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:lineSpacingMultiplier="1.1"
android:text="@string/content"
android:textColor="@android:color/black"
android:textSize="16sp" />

</LinearLayout>

然后运行起来,一看占内存情况,惊呆了,使用了3个我们自定义的TextView,
这里写图片描述

这里主要的原因就是我们每次使用该控件就调用了Typeface.createFromAsset(getResources().getAssets(), “fzltxh_gbk.ttf”),产生typeface对象十分耗内存,这里我们可以把typeface设计成单例模式,

1
2
3
4
5
6
7
8
9
10
11
public class FontManager {

private static Typeface typeface = null;

public static Typeface getTypeface(Context context) {
if (typeface == null) {
typeface = Typeface.createFromAsset(context.getAssets(), "fzltxh_gbk.ttf");
}
return typeface;
}
}

这样可以减少内存消耗,

使用字体包较小的字体文件也能大大减少内存消耗


下面介绍一个开源库Calligraphy,很方便的进行字体更换,
github地址: Calligraphy

使用:
1.引用库,在assets/fonts/ 下放入需要的字体
2.在你的应用的Application类中的onCreate方法中初始化

1
2
3
4
5
6
7
8
9
@Override
public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/Roboto-ThinItalic.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
}

3.在你的Activity中重写 attachBaseContext方法

1
2
3
4
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

运行起来会看到应用中实现了自定义字体,快试试吧