返回

全局替换字体,使用开源库更方便!

Android

前言

在 Android 下使用自定义字体已经是一个比较常见的需求了,那么按照惯例我又要出一篇有关 Android 修改字体相关的文章,但是写下来发现内容还挺多的,所以我决定将它们拆分一下,分几篇来详细的讲解。主要会是一些常用的替换字体的方案,最后还会介绍一些开源库,让你在替换字体的时候更加的方便。

方案一:通过assets目录加载字体

这是最简单的一种方案,我们只需要将字体文件拷贝到工程的assets目录下,然后在代码中使用Typeface.createFromAsset方法加载字体即可。

Typeface typeface = Typeface.createFromAsset(getAssets(), "fonts/myfont.ttf");

之后就可以将这个Typeface对象设置到TextView上,这样该TextView就使用了自定义字体了。

textView.setTypeface(typeface);

这种方案的优点是简单易用,但是缺点是只能加载一个字体文件,如果我们需要加载多个字体文件,就需要使用其他的方案了。

方案二:通过反射加载字体

这种方案可以加载多个字体文件,但是需要通过反射来实现,所以可能会对系统的稳定性造成一定的影响。

首先我们需要获取系统默认的字体管理器,然后通过反射来调用addFont方法加载字体文件。

TypefaceManager typefaceManager = TypefaceManager.getInstance();
java.lang.reflect.Method addFontMethod = typefaceManager.getClass().getDeclaredMethod("addFont", String.class, Integer.class);
addFontMethod.setAccessible(true);
addFontMethod.invoke(typefaceManager, "fonts/myfont.ttf", 0);

之后就可以使用Typeface.create方法来创建Typeface对象了。

Typeface typeface = Typeface.create("myfont", Typeface.NORMAL);

最后将这个Typeface对象设置到TextView上,这样该TextView就使用了自定义字体了。

textView.setTypeface(typeface);

这种方案的优点是可以加载多个字体文件,但是缺点是需要通过反射来实现,所以可能会对系统的稳定性造成一定的影响。

方案三:使用开源库

现在也有很多开源库可以帮助我们更方便地替换字体,这里推荐几个常用的开源库:

  • Calligraphy
  • Font Awesome
  • Android-Iconify

这些开源库都提供了非常方便的API,可以让我们轻松地加载和使用自定义字体。

例如,使用Calligraphy加载字体非常简单,只需要在Application类中初始化一下即可。

CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
        .setDefaultFontPath("fonts/myfont.ttf")
        .setFontAttrId(R.attr.fontPath)
        .build()
);

之后就可以在布局文件中使用自定义字体了。

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World"
    android:fontPath="fonts/myfont.ttf" />

总结

以上介绍了三种常用的替换字体的方案,以及一些可以帮助我们更方便地替换字体的开源库。大家可以根据自己的需要选择合适的方案来使用。