Gok*_*ari 10 fonts android react-native
我设法通过以下方式添加自定义字体:
把*.ttf文件放在ProjectName/android/app/src/main/assets/fonts/这样的:
并设置字体系列 fontFamily: "Open Sans"
但是我想要使用额外的字体权重,如'Semi Bold','Extra Bold'.我尝试将它们添加为"Open Sans_900.ttf"并进行设置,fontWeight: 900但这不起作用,它显示了字体的粗体版本.
有没有办法添加这些额外的字体权重?
Jul*_*lph 73
从React Native 0.66.0开始(用RN 0.66.3测试),绝对可行!解决方案是使用Android 的XML 字体功能。我在这里写了一份完整的指南,以获得一致的字体多平台体验。这篇文章主要关注Android端。结果:
\n
\n\n\n备注:自提交fd6386a07eb75a8ec16b1384a3e5827dea520b64 (2019 年 5 月 7 日)以来,此过程在 React Native 中可用,并添加了
\nReactFontManager::addCustomFont方法。
我将用于Raleway此示例,但此方法应该适用于任何字体系列!我假设您拥有整个 Raleway 字体系列 TTF 文件,并提取到临时文件夹中/tmp/raleway。那是:
Raleway-Thin.ttf(100)Raleway-ThinItalic.ttfRaleway-ExtraLight.ttf(200)Raleway-ExtraLightItalic.ttfRaleway-Light.ttf(300)Raleway-LightItalic.ttfRaleway-Regular.ttf(400)Raleway-Italic.ttfRaleway-Medium.ttf(500)Raleway-MediumItalic.ttfRaleway-SemiBold.ttf(600)Raleway-SemiBoldItalic.ttfRaleway-Bold.ttf(700)Raleway-BoldItalic.ttfRaleway-ExtraBold.ttf(800)Raleway-ExtraBoldItalic.ttfRaleway-Black.ttf(900)Raleway-BlackItalic.ttf\n\n您需要在系统中安装otfinfo才能执行此步骤。\n许多 Linux 发行版都附带了它。在 MacOS 上,通过lcdf-typetools brew 包安装它。
\n
otfinfo --family Raleway-Regular.ttf\nRun Code Online (Sandbox Code Playgroud)\n应打印“Raleway”。必须保留此值以供稍后使用。\n此名称将在 ReactfontFamily风格中使用。
mkdir android/app/src/main/res/font\ncp /tmp/raleway/*.ttf android/app/src/main/res/font\nRun Code Online (Sandbox Code Playgroud)\n我们必须按照以下规则重命名字体文件,以符合 Android 资源名称限制:
\n-用。。。来代替_;您可以使用以下 bash 脚本(确保将字体文件夹作为第一个参数):
\n#!/bin/bash\n# fixfonts.sh\n\ntypeset folder="$1"\nif [[ -d "$folder" && ! -z "$folder" ]]; then\n pushd "$folder";\n for file in *.ttf; do\n typeset normalized="${file//-/_}";\n normalized="${normalized,,}";\n mv "$file" "$normalized"\n done\n popd\nfi\nRun Code Online (Sandbox Code Playgroud)\n./fixfonts.sh /path/to/root/FontDemo/android/app/src/main/res/font\nRun Code Online (Sandbox Code Playgroud)\n创建android/app/src/main/res/font/raleway.xml包含以下内容的文件。基本上,我们必须为我们希望支持的fontStyle每个fontWeight组合创建一个条目,并注册相应的资产名称。
<?xml version="1.0" encoding="utf-8"?>\n<font-family xmlns:app="http://schemas.android.com/apk/res-auto">\n <font app:fontStyle="normal" app:fontWeight="100" app:font="@font/raleway_thin" />\n <font app:fontStyle="italic" app:fontWeight="100" app:font="@font/raleway_thinitalic"/>\n <font app:fontStyle="normal" app:fontWeight="200" app:font="@font/raleway_extralight" />\n <font app:fontStyle="italic" app:fontWeight="200" app:font="@font/raleway_extralightitalic"/>\n <font app:fontStyle="normal" app:fontWeight="300" app:font="@font/raleway_light" />\n <font app:fontStyle="italic" app:fontWeight="300" app:font="@font/raleway_lightitalic"/>\n <font app:fontStyle="normal" app:fontWeight="400" app:font="@font/raleway_regular" />\n <font app:fontStyle="italic" app:fontWeight="400" app:font="@font/raleway_italic"/>\n <font app:fontStyle="normal" app:fontWeight="500" app:font="@font/raleway_medium" />\n <font app:fontStyle="italic" app:fontWeight="500" app:font="@font/raleway_mediumitalic"/>\n <font app:fontStyle="normal" app:fontWeight="600" app:font="@font/raleway_semibold" />\n <font app:fontStyle="italic" app:fontWeight="600" app:font="@font/raleway_semibolditalic"/>\n <font app:fontStyle="normal" app:fontWeight="700" app:font="@font/raleway_bold" />\n <font app:fontStyle="italic" app:fontWeight="700" app:font="@font/raleway_bolditalic"/>\n <font app:fontStyle="normal" app:fontWeight="800" app:font="@font/raleway_extrabold" />\n <font app:fontStyle="italic" app:fontWeight="800" app:font="@font/raleway_extrabolditalic"/>\n <font app:fontStyle="normal" app:fontWeight="900" app:font="@font/raleway_black" />\n <font app:fontStyle="italic" app:fontWeight="900" app:font="@font/raleway_blackitalic"/>\n</font-family>\nRun Code Online (Sandbox Code Playgroud)\n在 中android/app/src/main/java/com/fontdemo/MainApplication.java,将字体系列名称与我们刚刚在方法内创建的资源绑定onCreate。
\n\n\xe2\x9a\xa0\xef\xb8\x8f 如果您要注册不同的字体,请确保将“Raleway”替换为上一步中找到的名称(查找字体系列名称)。
\n
\n// Add this!\nimport com.facebook.react.views.text.ReactFontManager;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n // ...\n @Override\n public void onCreate() {\n super.onCreate();\n // And that line! Note that "raleway" in R.font.raleway must be the name of\n // the XML file.\n ReactFontManager.getInstance().addCustomFont(this, "Raleway", R.font.raleway);\n }\n // ...\n}\n\nRun Code Online (Sandbox Code Playgroud)\n您现在可以渲染
\n<Text style={{ fontFamily: "Raleway", fontStyle: "italic", fontWeight: "900" }}>\n Hello world!\n</Text>\nRun Code Online (Sandbox Code Playgroud)\n在 Android 和 iOS 上(假设您将资产与 CLI 链接,请参阅 iOS 端的此文档)。
\n小智 26
对于Android上的自定义字体的开箱即用支持在React Native中有点受限.它不支持除(normal和bold它也支持italic fontStyle)之外的字体权重.如果您需要其他自定义权重,则必须将它们添加为具有不同名称的单独字体(如David在其答案中所述).
RN将找到的唯一字体文件具有以下格式:
{fontFamilyName}{fontFamilyName}_bold{fontFamilyName}_italic{fontFamilyName}_bold_italic支持的扩展:.ttf和.otf
这在任何地方都没有记录(我知道),但你可以在这里阅读字体管理器代码:https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/ COM/Facebook的/反应/视图/文本/ ReactFontManager.java
Bel*_*lom 10
fontWeight即使您尝试过,Android 也有使用属性的限制
{ fontFamily: 'fontFamily-bold', fontWeight: 'bold' }
Run Code Online (Sandbox Code Playgroud)
它不会正确显示字体,您需要删除fontWeight才能使其正常工作。
我的解决方案是依赖于 platform.OS 属性:
import { Platform, ... } from 'react-native';
const styles = StyleSheet.create({
text: {
fontFamily: 'fontFamily',
color: '#336666',
backgroundColor: 'transparent',
},
bold: Platform.OS === 'ios' ? {
fontFamily: 'fontFamily',
fontWeight: 'bold'
} : {
fontFamily: 'fontFamily-bold'
},
});
Run Code Online (Sandbox Code Playgroud)
在渲染部分:
<Text style={[styles.text, styles.bold]}>My bold text</Text>
Run Code Online (Sandbox Code Playgroud)
它适用于 iOS 和 Android
| 归档时间: |
|
| 查看次数: |
7595 次 |
| 最近记录: |