如何将Jetpack Compose Typeface转换为原生Typeface?
Jetpack Compose Typeface 转原生 Android Typeface 解决方案
方案1:直接转换(Compose 1.2.0+ 版本适用)
Compose 从 1.2.0 版本开始内置了跨类型转换的扩展函数,你可以直接调用 asAndroidTypeface() 实现转换:
import androidx.compose.ui.text.font.Typeface import androidx.compose.ui.text.font.asAndroidTypeface // 你已有的Compose Typeface实例 val composeTypeface: Typeface = ... // 转换为原生Typeface,返回可空值 val nativeTypeface: android.graphics.Typeface? = composeTypeface.asAndroidTypeface()
只要你的 Compose Typeface 是基于 Android 平台字体(包括系统内置字体、res/font 下的自定义字体、可下载字体)创建的,就可以正常返回非空的原生 Typeface 实例。
方案2:从 FontFamily 加载转换(适配低版本 Compose)
如果使用的 Compose 版本低于 1.2.0,可以通过 Compose 内置的字体加载器直接获取原生 Typeface:
- 首先从 Compose CompositionLocal 中获取
LocalFontLoader.current实例 - 调用
load()方法指定字体的权重、样式,直接返回原生 Typeface
代码示例:
import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.platform.LocalFontLoader val fontLoader = LocalFontLoader.current // 加载指定FontFamily、字重、样式对应的原生Typeface val nativeTypeface = fontLoader.load( fontFamily = FontFamily.Default, weight = FontWeight.Bold, style = FontStyle.Italic )
注意该方法为阻塞调用,不要在非绘制线程随意调用,避免出现性能问题。
注意事项
- 不要尝试通过获取字体路径的方式创建原生 Typeface:Compose 内部对字体资源做了全局缓存,跳过缓存直接读路径会导致内存占用升高,且可下载字体、系统动态字体本身没有固定本地路径,会出现加载失败的情况
- 如果使用自定义字体,确保所有字体资源都正常放置在
res/font目录下,避免加载时出现资源找不到的异常
内容的提问来源于stack exchange,提问作者Ehsan Msz
相关产品推荐
相关产品推荐

