其他答案已过时。从 React Native 0.60.0 开始,绝对可行!解决方案是为 Android 使用XML Fonts 功能。我已经写了一个完整的指南here 以获得一致的字体多平台体验。这篇文章侧重于 Android 方面。 结果:
备注:自提交 fd6386a07eb75a8ec16b1384a3e5827dea520b64(2019 年 5 月 7 日)起,此过程在 React Native 中可用,并添加了 ReactFontManager::addCustomFont 方法。
我将在此示例中使用Raleway,但此方法适用于任何字体系列!我假设你有whole Raleway font family TTF files,提取到一个临时文件夹/tmp/raleway。那就是:
-
Raleway-Thin.ttf (100)
Raleway-ThinItalic.ttf
-
Raleway-ExtraLight.ttf (200)
Raleway-ExtraLightItalic.ttf
-
Raleway-Light.ttf (300)
Raleway-LightItalic.ttf
-
Raleway-Regular.ttf (400)
Raleway-Italic.ttf
-
Raleway-Medium.ttf (500)
Raleway-MediumItalic.ttf
-
Raleway-SemiBold.ttf (600)
Raleway-SemiBoldItalic.ttf
-
Raleway-Bold.ttf (700)
Raleway-BoldItalic.ttf
-
Raleway-ExtraBold.ttf (800)
Raleway-ExtraBoldItalic.ttf
-
Raleway-Black.ttf (900)
Raleway-BlackItalic.ttf
0。查找确切的字体系列名称
您需要在系统中安装 otfinfo 才能执行此步骤。
它随许多 Linux 发行版一起提供。在 MacOS 上,通过安装它
lcdf-typetools brew 包。
otfinfo --family Raleway-Regular.ttf
应该打印“Raleway”。此值必须保留以备后用。
此名称将用于 React fontFamily 样式。
1。将资产复制并重命名到资源字体文件夹
mkdir android/app/src/main/res/font
cp /tmp/raleway/*.ttf android/app/src/main/res/font
我们必须按照这些规则重命名字体文件以符合 Android 资产名称限制:
您可以使用以下 bash 脚本(确保将字体文件夹作为第一个参数):
#!/bin/bash
# fixfonts.sh
typeset folder="$1"
if [[ -d "$folder" && ! -z "$folder" ]]; then
pushd "$folder";
for file in *.ttf; do
typeset normalized="${file//-/_}";
normalized="${normalized,,}";
mv "$file" "$normalized"
done
popd
fi
./fixfonts.sh /path/to/root/FontDemo/android/app/src/main/res/font
2。创建定义文件
使用以下内容创建android/app/src/main/res/font/raleway.xml 文件。基本上,
我们必须为每个我们希望支持的fontStyle / fontWeight 组合创建一个条目,并且
注册对应的资产名称。
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font app:fontStyle="normal" app:fontWeight="100" app:font="@font/raleway_thin" />
<font app:fontStyle="italic" app:fontWeight="100" app:font="@font/raleway_thinitalic"/>
<font app:fontStyle="normal" app:fontWeight="200" app:font="@font/raleway_extralight" />
<font app:fontStyle="italic" app:fontWeight="200" app:font="@font/raleway_extralightitalic"/>
<font app:fontStyle="normal" app:fontWeight="300" app:font="@font/raleway_light" />
<font app:fontStyle="italic" app:fontWeight="300" app:font="@font/raleway_lightitalic"/>
<font app:fontStyle="normal" app:fontWeight="400" app:font="@font/raleway_regular" />
<font app:fontStyle="italic" app:fontWeight="400" app:font="@font/raleway_italic"/>
<font app:fontStyle="normal" app:fontWeight="500" app:font="@font/raleway_medium" />
<font app:fontStyle="italic" app:fontWeight="500" app:font="@font/raleway_mediumitalic"/>
<font app:fontStyle="normal" app:fontWeight="600" app:font="@font/raleway_semibold" />
<font app:fontStyle="italic" app:fontWeight="600" app:font="@font/raleway_semibolditalic"/>
<font app:fontStyle="normal" app:fontWeight="700" app:font="@font/raleway_bold" />
<font app:fontStyle="italic" app:fontWeight="700" app:font="@font/raleway_bolditalic"/>
<font app:fontStyle="normal" app:fontWeight="800" app:font="@font/raleway_extrabold" />
<font app:fontStyle="italic" app:fontWeight="800" app:font="@font/raleway_extrabolditalic"/>
<font app:fontStyle="normal" app:fontWeight="900" app:font="@font/raleway_black" />
<font app:fontStyle="italic" app:fontWeight="900" app:font="@font/raleway_blackitalic"/>
</font-family>
3。注册新字体
在android/app/src/main/java/com/fontdemo/MainApplication.java 中,将字体系列名称与我们刚刚在onCreate 方法中创建的资产绑定。
⚠️ 如果您要注册不同的字体,请确保将“Raleway”替换为上一步中找到的名称(查找字体系列名称)。
// Add this!
import com.facebook.react.views.text.ReactFontManager;
public class MainApplication extends Application implements ReactApplication {
// ...
@Override
public void onCreate() {
super.onCreate();
// And that line!
ReactFontManager.getInstance().addCustomFont(this, "Raleway", R.font.raleway);
}
// ...
}
4。享受吧!
您现在可以渲染
<Text style={{ fontFamily: "Raleway", fontStyle: "italic", fontWeight: "900" }}>
Hello world!
</Text>
在 Android 和 iOS 上(假设您使用 CLI 链接资产,see this document for the iOS side)。