全局替换字体,使用开源库更方便!
2023-09-23 21:56:25
前言
在 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" />
总结
以上介绍了三种常用的替换字体的方案,以及一些可以帮助我们更方便地替换字体的开源库。大家可以根据自己的需要选择合适的方案来使用。