当设备字体大小增加时,防止 Jetpack Compose 中的文本放大

Pol*_*ano 18 android kotlin android-jetpack-compose

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

格式良好的撰写页面 设备字体设置 撰写页面格式不正确

如果添加了上下文,有问题的代码看起来像这样:

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
    )
}
Run Code Online (Sandbox Code Playgroud)

Phi*_*hov 33

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

您可以fontScaleLocalDensity

val Int.nonScaledSp
    @Composable
    get() = (this / LocalDensity.current.fontScale).sp
Run Code Online (Sandbox Code Playgroud)

用法:

10.nonScaledSp
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用dp相关的文本大小:它会忽略系统字体大小设置,但会考虑显示大小设置 - 当您有一些容器视图大小dp并且希望文本具有与该大小相关的大小时,它会很有用。家长家长:

val density = LocalDensity.current
val textSize = with(density) { 15.dp.toSp() }
Run Code Online (Sandbox Code Playgroud)


Dwa*_*e13 9

实际上这很容易。你可以CompositionLocalProvider像这样设置新的

CompositionLocalProvider(
    LocalDensity provides Density(
        LocalDensity.current.density,
        1f // - we set here default font scale instead of system one
    )
) {
    //your composables that will use no-scale
}
Run Code Online (Sandbox Code Playgroud)

请记住,文本缩放的存在是有目的的。不要只是将整个应用程序包装在本地的组合中。可访问性确实很重要

您可以检查元素的最大比例是否正常工作,然后编写如下内容:

val myFontScale = LocalDensity.current.fontScale.coerceIn(0.75f, 1.5f)
Run Code Online (Sandbox Code Playgroud)

然后简单地传递这个值CompositionLocal而不是1f