我如何限制字体尺寸的缩放,用jetpack组成? 从此处的示例中了解如何限制字体缩放: 文本( text =“这是“这是用字体刻度$ {localdents.current.fontscale}”调整文本的大小 fontsize = 20.sp ) 在

问题描述 投票:0回答:1

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()

中的计算

我认为问题在这条线上

android android-jetpack-compose android-jetpack android-compose-textfield
1个回答
0
投票

应该是

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}")
    }
}

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.