Expo 字体
一个允许在运行时加载字体并在 React Native 组件中使用它们的库。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
expo-font 允许从 Web 加载字体并在 React Native 组件中使用它们。有关更详细的用法信息,请参阅 Fonts 指南。
安装
- npx expo install expo-fontIf you are installing this in an existing React Native app, make sure to install expo in your project.
app config 中的配置
向应用添加字体有两种方式:使用 expo-font 配置插件(推荐用于 Android 和 iOS)或在运行时加载它们(适用于包括 web 在内的所有平台)。
在 Android 和 iOS 上,该插件允许你在构建时嵌入字体文件,这比 useFonts 或 loadAsync 更高效。设置好配置插件并运行 prebuild 之后,你就可以立即渲染自定义字体。该插件可以通过不同方式进行配置,关于如何使用它请参阅 Fonts 指南。
Example app.json with config plugin
{ "expo": { "plugins": [ [ "expo-font", { "fonts": ["./path/to/file.ttf"], "android": { "fonts": [ { "fontFamily": "Source Serif 4", "fontDefinitions": [ { "path": "./path/to/SourceSerif4-ExtraBold.ttf", "weight": 800 } ] } ] } } ] ] } }
Configurable properties
| Name | Default | Description |
|---|---|---|
fonts | [] | 要链接到原生项目的字体定义数组。路径应相对于项目根目录。在 Android 上,文件名会成为字体族名称。在 iOS 上,字体族名称总是直接取自字体文件,可能与文件名不一致 — 请遵循 命名建议,或使用 |
android | [] | 要链接到 Android 原生项目的字体定义数组。使用对象语法可嵌入带有自定义族名称的 xml 字体。 |
ios | [] | 要链接到 iOS 原生项目的字体文件路径数组。字体族名称直接取自字体文件。 |
Are you using this library in an existing React Native app?
- Android: 将字体文件复制到 android/app/src/main/assets/fonts。
- iOS: 请参阅 Apple Developer 文档中的 Adding a Custom Font to Your App。
用法
如果你不想使用 配置插件,可以像下面的代码片段一样,使用 useFonts Hook 在运行时加载字体:
import { useFonts } from 'expo-font'; import * as SplashScreen from 'expo-splash-screen'; import { useEffect } from 'react'; import { Text, View, StyleSheet } from 'react-native'; SplashScreen.preventAutoHideAsync(); export default function App() { // 仅当你无法使用配置插件时,才使用 `useFonts`。 const [loaded, error] = useFonts({ 'Inter-Black': require('./assets/fonts/Inter-Black.otf'), }); useEffect(() => { if (loaded || error) { SplashScreen.hideAsync(); } }, [loaded, error]); if (!loaded && !error) { return null; } return ( <View style={styles.container}> <Text style={{ fontFamily: 'Inter-Black', fontSize: 30 }}>Inter Black</Text> <Text style={{ fontSize: 30 }}>平台默认</Text> </View> ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', }, });
API
import * as Font from 'expo-font';
Constants
Type: UseFontHook
Load a map of fonts at runtime with loadAsync. This returns true if the fonts are
loaded and ready to use. It also returns an error if something went wrong, to use in development.
Note, the fonts are not "reloaded" when you dynamically change the font map.
Example
const [loaded, error] = useFonts({ 'Inter-Black': require('./assets/fonts/Inter-Black.otf'), });
Methods
Synchronously get all the fonts that have been loaded.
This includes fonts that were bundled at build time using the config plugin, as well as those loaded at runtime using loadAsync.
string[]Returns array of strings which you can use as fontFamily style prop.
| Parameter | Type | Description |
|---|---|---|
| fontFamily | string | The name used to load the |
Synchronously detect if the font for fontFamily has finished loading.
booleanReturns true if the font has fully loaded.
| Parameter | Type | Description |
|---|---|---|
| fontFamily | string | The name used to load the |
Synchronously detect if the font for fontFamily is still being loaded.
booleanReturns true if the font is still loading.
| Parameter | Type | Description |
|---|---|---|
| fontFamilyOrFontMap | string | Record<string, FontSource> | String or map of values that can be used as the |
| source(optional) | FontSource | The font asset that should be loaded into the |
An efficient method for loading fonts from static or remote resources which can then be used
with the platform's native text elements. In the browser, this generates a @font-face block in
a shared style sheet for fonts. No CSS is needed to use this method.
Note: We recommend using the config plugin instead whenever possible.
Promise<void>Returns a promise that fulfils when the font has loaded. Often you may want to wrap the
method in a try/catch/finally to ensure the app continues if the font fails to load.
| Parameter | Type | Description |
|---|---|---|
| glyphs | string | Text to be exported. |
| options(optional) | RenderToImageOptions | RenderToImageOptions. |
Creates an image with provided text.
Promise<RenderToImageResult>Promise which fulfils with image metadata.
Interfaces
| Property | Type | Description |
|---|---|---|
| color(optional) | string | Font color Default: 'black' |
| fontFamily(optional) | string | Font family name. Default: system default |
| lineHeight(optional) | number | Line height of the text. Accepts number in dp units. |
| size(optional) | number | Size of the font. Default: 24 |
| Property | Type | Description |
|---|---|---|
| height | number | Image height in dp. |
| scale | number | Scale factor of the image. Multiply the dp dimensions by this value to get the dimensions in pixels. |
| uri | string | The file uri to the image. |
| width | number | Image width in dp. |
Types
An object used to dictate the resource that is loaded into the provided font namespace when used
with loadAsync.
| Property | Type | Description |
|---|---|---|
| default(optional) | string | - |
| display(optional) | FontDisplay | Only for: Web Sets the |
| testString(optional) | string | Only for: Web Sets a custom test string passed to the FontFace Observer. |
| uri(optional) | string | number | - |
Literal Type: union
The different types of assets you can provide to the loadAsync() function.
A font source can be a URI, a module ID, or an Expo Asset.
Acceptable values are: string | number | Asset | FontResource
Enums
Sets the font-display
for a given typeface. The default font value on web is FontDisplay.AUTO.
Even though setting the fontDisplay does nothing on native platforms, the default behavior
emulates FontDisplay.SWAP on flagship devices like iOS, Samsung, Pixel, etc. Default
functionality varies on One Plus devices. In the browser this value is set in the generated
@font-face CSS block and not as a style property meaning you cannot dynamically change this
value based on the element it's used in.
FontDisplay.AUTO = "auto"(Default) The font display strategy is defined by the user agent or platform. This generally defaults to the text being invisible until the font is loaded. Good for buttons or banners that require a specific treatment.
FontDisplay.BLOCK = "block"The text will be invisible until the font has loaded. If the font fails to load then nothing will appear - it's best to turn this off when debugging missing text.
FontDisplay.FALLBACK = "fallback"Splits the behavior between SWAP and BLOCK.
There will be a 100ms timeout
where the text with a custom font is invisible, after that the text will either swap to the
styled text or it'll show the unstyled text and continue to load the custom font. This is good
for buttons that need a custom font but should also be quickly available to screen-readers.
FontDisplay.OPTIONAL = "optional"This works almost identically to FALLBACK, the only difference is that the browser will
decide to load the font based on slow connection speed or critical resource demand.
错误代码
| 代码 | 描述 |
|---|---|
| ERR_FONT_API | 如果传递给 loadAsync 的参数无效。 |
| ERR_FONT_SOURCE | 提供的资源类型不正确。 |
| ERR_WEB_ENVIRONMENT | 浏览器的 document 元素不支持注入字体。 |
| ERR_DOWNLOAD | 下载提供的资源失败。 |
| ERR_FONT_FAMILY | 提供了无效的字体族名称。 |
| ERR_UNLOAD | 尝试卸载尚未完成加载的字体。 |