Text(
text = "This is resizing text with font scale ${LocalDensity.current.fontScale}",
fontSize = 20.sp
)
在Android中,我可以在系统可访问性设置1.0(= 100%)和2.0(= 200%)之间设置系统范围的字体缩放。
@Composable
fun Float.limitFontScale(maxScale: Int = 200): TextUnit {
val fontScale = LocalDensity.current.fontScale
val fontScaleLimited = fontScale.coerceAtMost(maxScale.toFloat() / 100f)
val scaledSp = (this * fontScaleLimited).sp
return scaledSp
}
当系统设置设置为2.0(= 200%)时,我想将缩放缩放缩小到150%。我的代码中有:
Text(
text = "This is resizing text with font scale ${LocalDensity.current.fontScale}",
fontSize = 20.sp.value.limitFontScale(150)
)
i我希望text()组合的结果对于遵循终端中的ADB命令是相同的:
ADBSHELL设置放置系统FONT_SCALE2.00
ADBSHELL设置放置系统FONT_SCALE1.50但不幸的是,2.00的可见结果明显更大。我希望两者都在设备上具有相同的尺寸吗?!
?怎么了?
limitFontScale()
中的计算
我认为问题在这条线上
应该是
val scaledSp = (this.value/fontScale * fontScaleLimited).sp
首先,您必须获得原始值,然后将其扩展到所需的内容。
我是我用于测试的代码。如果需要进一步修改功能,则可以使用它。
i将其复制并从Katie的Github Repo(
Https://github.com/katiebarnett/katiebarnett/experiments/blob/blob/main/main/jc-text/src/src/main/java/java/dev/dev/katiebarnett/katiebarnett/experiments/jctextextextextextextextextextextextextextextextextextextextextextextextextextextext/ nonresizingText.kt)
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
val standardFontSize = 16.sp
@Composable
fun RegularResizingText(
textToDisplay: String,
modifier: Modifier = Modifier
) {
Text(
text = textToDisplay,
fontSize = standardFontSize,
modifier = modifier
)
}
val TextUnit.nonScaledSp
@Composable
get() = (this.value / LocalDensity.current.fontScale).sp
@Composable
fun TextUnit.limitFontScale(maxScale: Int = 200): TextUnit {
val fontScale = LocalDensity.current.fontScale
val fontScaleLimited = fontScale.coerceAtMost(maxScale.toFloat() / 100f)
val scaledSp = (this.value/fontScale * fontScaleLimited).sp
return scaledSp
}
@Composable
fun NonResizingTextSp(
textToDisplay :String,
modifier: Modifier = Modifier
) {
Text(
text = textToDisplay,
fontSize = standardFontSize.limitFontScale(150),
modifier = modifier
)
}
@Preview(
name = "large font",
group = "Font scaling",
fontScale = 1.5f,
showBackground = true
)
@Preview(
name = "extra large font",
group = "Font scaling",
fontScale = 2f,
showBackground = true
)
annotation class FontScalePreviews
@FontScalePreviews
@Composable
fun RegularResizingTextPreview() {
Box(modifier = Modifier.width(500.dp)) {
RegularResizingText(textToDisplay = "This is regular resizing text with font scale ${LocalDensity.current.fontScale}")
}
}
@FontScalePreviews
@Composable
fun NonResizingTextSpPreview() {
Box(modifier = Modifier.width(500.dp)) {
NonResizingTextSp(textToDisplay = "This is non-resizing text with font scale ${LocalDensity.current.fontScale}")
}
}