Android使用自定义字体

4,290 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

Android使用自定义字体

有时候界面在设计app时会使用一些比较美观的字体,在安卓中使用起来也并不困难,随着安卓SDK的更新,它的实现方式也有所不同,该文章来看看怎么实现自定义字体。

普通方法

设置字体。 TextView.setTypeface(Typeface)

 public void setTypeface(@Nullable Typeface tf) {
 }

那么我们也很简单,直接创建一个Typeface,然后TextView的设置Typeface就可以了。

需求场景是这样的,我们从服务器下载了很多个字体,让用户去选择字体,那么在选择字体的界面,也要把字体预览出来。

先看一张效果图

Screenshot_2021-11-08-22-37-00-39_044a90f142017e664e5aeeaf6c580f40.jpg

我们要做就是将字体下载,然后在适配器中设置字体即可。来看看适配器中的代码:

public class FontAdapter extends BaseRecyclerViewAdapter<FontInfo> {

    public FontAdapter(@Nullable List<FontInfo> data) {
        super(R.layout.item_font, data);
    }

    @Override
    public void convert(BaseViewHolder helper, FontInfo item, int position) {
        // 显示字体名称
        TextView textView = helper.getView(R.id.item_font_name);
        textView.setText(item.getName());
        String fontPath = FontManager.getFontPathByCoding(item.getId());
        Typeface typeface = Typeface.createFromFile(fontPath);
        if (typeface != null)
            textView.setTypeface(typeface);
    }
}

这段代码中没有很复杂的地方,从服务器下载到本地的代码已经省去,我们要做的是获取本地的字体路径,然后进行显示,这里要注意的地方时一定要注意typeface的非空判断,不然程序会闪退。

Fonts in XML

Fonts in XML 是Android 8.0中推出的功能,这意味着我们可以像使用R.string.xx那样使用Font资源,能够像使用其他资源文件一样使用字体,这样替换全局的字体的就会更加简单。使用它呢,就@font/myfontR.font.myfont就可以,来看看具体如何实现吧。

1. 创建font目录

鼠标移动到res文件夹,然后右键,然后 New > Android resource directory,然后在Resource type选择font,目录名也必须要为font,否则无法识别。参考下面的图。

Image.png

2. 添加字体和引用

将一个或者多个字体文件复制到font文件夹下,文件格式支持ttf和otf。复制进来之后,我们开始使用它,我们可以通过@font/myfontR.font.myfont 来使用,我们也可以在style文件中创建一个样式,目的是为了统一,方便直接在配置文件的xml中引用。

  <style name="FontStyle" parent="AppTheme">
        <item name="android:fontFamily">@font/font_1</item>
    </style>

3. 使用字体

如何使用字体呢?

<activity
            android:name=".MainActivity"
            android:theme="@style/FontStyle">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

当然也可以全局使用

 <application
        android:theme="@style/FontStyle">
 </application>