Jetpack compose 从资源中获取 FontFamily

ikn*_*now 8 android android-theme android-jetpack-compose

在我这样res/font定义:font-family

<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
    <font app:fontStyle="normal" app:fontWeight="400" app:font="xyz_1"/>
    <font app:fontStyle="normal" app:fontWeight="500" app:font="xyz_2"/>
</font-family>
Run Code Online (Sandbox Code Playgroud)

如何将其加载到 Jetpack Compose 中并将其用作FontFamily对象?

Nag*_*obi 9

不幸的是,目前还没有一个简单的解决方案可以直接从 xml 中加载 Font-Familys。

我会考虑以下选项:

  1. 在 xml 中为主题定义 Material Design 文本样式(body1、body2 等),并使用MDC 主题适配器将它们迁移到MaterialTheme.typography
  2. 上述内容可能不适用于特殊字体系列,例如徽标或其他用例。在这种情况下,我会重新创建 FontFamily 进行撰写:
private val appFontFamily = FontFamily(
   fonts = listOf(
       Font(
           resId = R.font.roboto_black, 
           weight = FontWeight.W900, 
           style = FontStyle.Normal
       ),
       Font(
           resId = R.font.roboto_black_italic, 
           weight = FontWeight.W900, 
           style = FontStyle.Italic
       ),
       Font(
           resId = R.font.roboto_bold, 
           weight = FontWeight.W700, 
           style = FontStyle.Normal
       ),
       ...
   )
)
Run Code Online (Sandbox Code Playgroud)

这是关于此的好读物:https ://alexzh.com/jetpack-compose-theme-and-typography/ 。此外,人们还可以受到启发并为 Mdc 主题适配器做出贡献,以涵盖主题之外的这些特殊用例。我想读取文本样式进行撰写的逻辑已经存在,只需要提供一个 API 来读取自定义样式,而不是 Material 主题中指定的样式。


erv*_*eeg 7

val FontName = FontFamily(
    Font(R.font.font_reg, FontWeight.Normal),
    Font(R.font.font_light,FontWeight.Light),
    Font(R.font.font_sbold, FontWeight.SemiBold),
    Font(R.font.font_xbold, FontWeight.ExtraBold)
)
Run Code Online (Sandbox Code Playgroud)

在任何 Kotlin 文件中(类外)

然后在任何可组合项中使用:

@Composable
    fun FontStyledText(text: String) {
        Text(
            text = text,
            fontFamily = FontName,
            fontWeight = FontWeight.SemiBold
        )
    }
Run Code Online (Sandbox Code Playgroud)