如何在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
相关产品推荐
相关产品推荐

