You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Compose Multiplatform项目的commonMain中使用自定义字体

在Compose Multiplatform中从commonMain资源加载自定义字体

要实现从commonMain的资源目录导入字体并使用Font(data: ByteArray),可以按照以下步骤操作:

1. 放置字体文件到commonMain资源目录

首先在commonMain/resources下创建子目录(比如fonts),把你的字体文件(比如CustomFont.ttf)放进去,目录结构如下:

src/
├─ commonMain/
│  ├─ resources/
│  │  ├─ fonts/
│  │  │  ├─ CustomFont.ttf

2. 编写通用的字体加载函数

在common模块的代码中,通过类加载器读取资源文件并转换为ByteArray,再创建Font和FontFamily:

import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.platform.Font
import java.io.InputStream

fun getCustomFontFamily(): FontFamily {
    // 资源路径相对于commonMain/resources目录
    val fontResourcePath = "fonts/CustomFont.ttf"
    // 通过类加载器获取资源输入流
    val inputStream: InputStream? = Thread.currentThread().contextClassLoader.getResourceAsStream(fontResourcePath)
    
    // 读取字节数组,若找不到资源则抛出异常
    val fontBytes = inputStream?.readBytes() ?: error("Failed to load font: $fontResourcePath not found in resources")
    
    return FontFamily(Font(data = fontBytes))
}

3. 在Compose中使用自定义字体

直接在Text或TextStyle中引用加载好的FontFamily即可:

import androidx.compose.foundation.layout.Column
import androidx.compose.material.Text
import androidx.compose.ui.unit.sp
import androidx.compose.runtime.Composable

@Composable
fun CustomFontDemo() {
    Column {
        Text(
            text = "这是自定义字体的示例",
            fontFamily = getCustomFontFamily(),
            fontSize = 24.sp
        )
    }
}

注意事项

  • 路径正确性:资源路径是相对于commonMain/resources的相对路径,不要以/开头;不同平台对文件名大小写敏感,要确保文件名和代码中的路径完全一致。
  • 多字体样式支持:如果需要加载粗体、斜体等不同样式的字体,只需重复上述步骤加载对应字体文件,创建Font时指定weight和style参数:
    FontFamily(
        Font(data = regularFontBytes),
        Font(data = boldFontBytes, weight = FontWeight.Bold),
        Font(data = italicFontBytes, style = FontStyle.Italic)
    )
    
  • 资源打包验证:确保构建工具(Gradle)正确打包了commonMain的资源,默认情况下Compose Multiplatform会自动处理,但如果有自定义资源配置,需确认资源被包含在最终产物中。

内容的提问来源于stack exchange,提问作者Vince

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:13:25