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 正确指出的那样,您需要反向缩放。
您可以fontScale从LocalDensity:
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)
实际上这很容易。你可以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
| 归档时间: |
|
| 查看次数: |
8167 次 |
| 最近记录: |