android Jetpack合成从资源中获取FontFamily

kgsdhlau  于 2022-12-02  发布在  Android
关注(0)|答案(5)|浏览(120)

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>

如何在Jetpack Compose中加载此文件并将其用作FontFamily对象?

xiozqbni

xiozqbni1#

不幸的是,目前还没有一个直接的解决方案来从xml直接加载Font-Familys。
我会考虑以下选项:
1.为主题定义xml格式的材料设计文本样式(body 1、body 2等),并使用MDC-theme adapter将它们迁移到MaterialTheme.typography
1.上面的方法可能不适用于特殊的字体系列,例如徽标或其他用例。在这种情况下,我会重新创建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
       ),
       ...
   )
)

这是一个很好的阅读:https://alexzh.com/jetpack-compose-theme-and-typography/。也可以得到启发,并贡献给Mdc主题适配器,以涵盖这些特殊的用例,也是在主题之外。我认为在文本样式中阅读的逻辑已经存在,人们只需要提供一个API来读取自定义的,而不是在材料主题中指定的。

pkwftd7m

pkwftd7m2#

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)
)

在任何Kotlin文件中(类外)
然后用在任何可组合的:

@Composable
    fun FontStyledText(text: String) {
        Text(
            text = text,
            fontFamily = FontName,
            fontWeight = FontWeight.SemiBold
        )
    }
rsl1atfo

rsl1atfo3#

对于任何想要更改应用程序字体的人,请执行以下操作
1.在res(res/font)中创建字体目录
1.复制res/font中的.ttf字体
1.找到Type.kt文件(在ui/theme目录中)
1.在Type.kt中创建字体变量

val MyCustomFont = FontFamily(
    Font(R.font.regular),
    Font(R.font.bold,FontWeight.Bold)
)
  1. Type.kt文件中存在版式瓦尔,您可以通过在此值中输入defaultFontFamily = MyCustomFont来更改整个应用程序的字体系列
val Typography = Typography(
    defaultFontFamily = MyCustomFont,
    body1 = TextStyle(
        fontFamily = MyCustomFont2,
        fontWeight = FontWeight.Normal,
        fontSize = 16.sp
 ),

1.您还可以将字体系列设置为特定的排版,如body 1、h1、h2...

x6h2sr28

x6h2sr284#

val QuickSand = FontFamily(
    Font(R.font.quicksand_light, weight = FontWeight.Light),
    Font(R.font.quicksand_regular, weight = FontWeight.Normal),
    Font(R.font.quicksand_medium, weight = FontWeight.Medium),
    Font(R.font.quicksand_semibold, weight = FontWeight.SemiBold),
    Font(R.font.quicksand_bold, weight = FontWeight.Bold)
)

// Set of Material typography styles to start with
val Typography = Typography(
    body1 = TextStyle(
        fontFamily = QuickSand,
        fontWeight = FontWeight.Light,
        fontSize = 16.sp,
    ),
    h1 = TextStyle(
        fontFamily = QuickSand,
        fontWeight = FontWeight.SemiBold,
        fontSize = 24.sp
    ),
    h2 = TextStyle(
        fontFamily = QuickSand,
        fontWeight = FontWeight.Bold,
        fontSize = 22.sp
    )
vtwuwzda

vtwuwzda5#

如果需要在合成文本中直接使用字体,则可以在合成文本中调用your_font_file_name.otf文件名,而不使用“***.otf***“。
快回答:

fontFamily = FontFamily(Font(R.font.your_font_file_name))

示例:

Text(
  text = "your_text" // OR stringResource(id = R.string.your_string_id),
  fontSize = 16.sp,
  fontFamily = FontFamily(Font(R.font.your_font_file_name))
)

相关问题