如何在Jetpack Compose中禁止特定页面Text随系统字体大小放大
方案1:仅针对计时器Text组件固定大小,不影响同页面其他组件
只需要修改Text的fontSize计算逻辑,强制忽略系统字体缩放系数:
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') // 生成忽略字体缩放的Density实例 val noScaleDensity = LocalDensity.current.run { Density(density = density, fontScale = 1f) } Text( modifier = Modifier.fillMaxWidth(0.85f), text = stringResource(R.string.pomodoro_active_notification_content_body, minutes, seconds), textAlign = TextAlign.Center, // 使用无缩放的Density转换字体大小 fontSize = with(noScaleDensity) { LocalDimens.current.intervalTimeFontSize.toSp() }, style = MaterialTheme.typography.h1, // 额外加一层保险,防止极端情况换行 maxLines = 1 ) }
方案2:针对整个计时器页面区域禁用字体缩放
如果整个计时器页面的内容都不需要跟随系统字体放大,可以在外层包裹CompositionLocalProvider覆盖局部的字体缩放系数,内部原有代码不需要做任何修改:
CompositionLocalProvider( LocalDensity provides LocalDensity.current.run { Density(density = density, fontScale = 1f) } ) { // 原有HorizontalPager代码完全不变 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 ) } }
实现原理
Compose中默认的sp单位会自动乘以系统设置的fontScale系数来适配字体大小,我们通过手动将局部的fontScale固定为1,即可让这部分组件的字体大小完全按照代码中定义的数值显示,不会跟随系统无障碍字体设置发生变化,且完全不影响应用内其他页面的字体缩放逻辑。
参考图示:


内容的提问来源于stack exchange,提问作者Poliziano
相关产品推荐
相关产品推荐

