【问题标题】:Prevent Text in Jetpack Compose from enlarging when device font size is increases防止 Jetpack Compose 中的文本在设备字体大小增加时放大
【发布时间】:2021-09-08 18:29:53
【问题描述】:

我的应用中有一个显示计时器的屏幕。如果用户决定在设备设置菜单中增加字体大小,那么文本对于布局来说变得太大并且开始换行。对于我的其他文字较多的屏幕来说,这不是问题。对于这个屏幕 - 并且只有这个屏幕 - 如果使用辅助功能选项,我希望防止计时器文本变大。

如果添加上下文,有问题的代码如下所示:

HorizontalPager(state = pagerState, dragEnabled = dragEnabled) { page ->
    val timeInSeconds = abs(steps[page % steps.size] / 1000L)
    val minutes = (timeInSeconds / 60).toString().padStart(2, '0')
    val seconds = (timeInSeconds % 60).toString().padStart(2, '0')

    Text(
        modifier = Modifier.fillMaxWidth(0.85f),
        text = stringResource(R.string.pomodoro_active_notification_content_body, minutes, seconds),
        textAlign = TextAlign.Center,
        fontSize = LocalDimens.current.intervalTimeFontSize,
        style = MaterialTheme.typography.h1
    )
}

【问题讨论】:

  • 你需要在dp而不是sp中指定字体大小,我确信MaterialTheme使用sp
  • 如果这是您希望应用此代码更改的唯一屏幕,为什么不直接声明顶级val 并硬编码屏幕的大小?只需使用 AS 用新 val 替换旧引用的所有实例,我认为你很好。
  • @CommonsWare 可组合的Text 不接受dp,只接受TextUnit,它是spem
  • 是的,我认为您必须进行一些转换才能撤消文本比例。假设您想要16dp,并且用户的文本比例为 1.5 倍。如果你尝试使用16.sp,你会得到24dp的实际大小。您可以获得当前的文本比例(LocalConfigurationIIRC)。因此,您将计算“反缩放”大小 = 16 / 1.5 = 10.66 并将 .sp 应用于它,因此当应用文本比例时,您将获得所需的 16dp 大小。

标签: android kotlin android-jetpack-compose


【解决方案1】:

正如@CommonsWare 正确指出的那样,您需要反向缩放。

你可以从LocalDensity得到fontScale

fontSize = with(LocalDensity.current) {
    (LocalDimens.current.intervalTimeFontSize / fontScale).sp
},

【讨论】:

  • 完美运行,谢谢(和@CommonsWare)
  • 谢谢!但是,如果他们只留下可用性来设置 dp 的字体大小,那就太容易了
【解决方案2】:
val textStyle = MaterialTheme.typography.h1

val fontSizeDp = with(LocalDensity.current) { textStyle.fontSize.value.dp.toSp() }
Text(
    ...
    style = textStyle,
    fontSize = fontSizeDp,
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-14
    • 2015-11-02
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多