android:Jetpack Compose中的autoSizeTextType

android:Jetpack Compose中的autoSizeTextType,android,kotlin,android-jetpack,android-jetpack-compose,Android,Kotlin,Android Jetpack,Android Jetpack Compose,是否有办法根据固定高度调整文本大小 我有一个固定高度的专栏,里面的文字应该总是适合 Column(modifier = Modifier.height(150.dp).padding(8.dp)) { Text("My really long long long long long text that needs to be resized to the height of this Column") } 试试这个: var width by

是否有办法根据固定高度调整文本大小

我有一个固定高度的专栏,里面的文字应该总是适合

 Column(modifier = Modifier.height(150.dp).padding(8.dp)) {
   Text("My really long long long long long text that needs to be resized to the height of this Column")
}
试试这个:

            var width by remember { mutableStateOf(0) }
            var height by remember { mutableStateOf(0) }
            Column(Modifier.preferredHeight(150.dp).padding(8.dp).onPositioned {
                width = it.size.width
                height = it.size.height
            }) {
                Text(
                    modifier = Modifier.preferredSize(width.dp, height.dp),
                    text = "very long text"
                )
            }
试试这个:

            var width by remember { mutableStateOf(0) }
            var height by remember { mutableStateOf(0) }
            Column(Modifier.preferredHeight(150.dp).padding(8.dp).onPositioned {
                width = it.size.width
                height = it.size.height
            }) {
                Text(
                    modifier = Modifier.preferredSize(width.dp, height.dp),
                    text = "very long text"
                )
            }

这是基于穆罕默德的回答

您必须找到一种更好的方法,通过使用方框的高度和消息的长度来计算字体大小

@Composable
fun Greeting() {
    var width by remember { mutableStateOf(0) }
    var height by remember { mutableStateOf(0) }
    val msg = "My really long long long long long text that needs to be resized to the height of this Column"
    Column(modifier = Modifier.height(150.dp).padding(8.dp).background(Color.Blue).onPositioned {
        width = it.size.width
        height = it.size.height
    }) {
        Log.d("mainactivity", "width = $width")
        Log.d("mainactivity", "height = $height")
        Text(
                modifier = Modifier.background(Color.Green).fillMaxHeight(),
                style = TextStyle(fontSize = calculateFontSize(msg, height).sp),
                text = msg
        )
    }
}

fun calculateFontSize(msg: String, height: Int): Int {
    return height / (msg.length / 5)
}

这是基于穆罕默德的回答

您必须找到一种更好的方法,通过使用方框的高度和消息的长度来计算字体大小

@Composable
fun Greeting() {
    var width by remember { mutableStateOf(0) }
    var height by remember { mutableStateOf(0) }
    val msg = "My really long long long long long text that needs to be resized to the height of this Column"
    Column(modifier = Modifier.height(150.dp).padding(8.dp).background(Color.Blue).onPositioned {
        width = it.size.width
        height = it.size.height
    }) {
        Log.d("mainactivity", "width = $width")
        Log.d("mainactivity", "height = $height")
        Text(
                modifier = Modifier.background(Color.Green).fillMaxHeight(),
                style = TextStyle(fontSize = calculateFontSize(msg, height).sp),
                text = msg
        )
    }
}

fun calculateFontSize(msg: String, height: Int): Int {
    return height / (msg.length / 5)
}

我使用以下方法根据可用宽度调整字体大小:

val textStyleBody1=材料主题。排版。正文1 val textStyle,updateTextStyle=记住{mutableStateOftextStyleBody1} 文本 text=此处显示长文本, style=textStyle, maxLines=1, softWrap=false, onTextLayout={textLayoutResult-> 如果textLayoutResult.didOverflowWidth{ updateTextStyletextStyle.copyfontSize=textStyle.fontSize*0.9 } } 要根据高度调整字体大小,请使用文本组合的属性,并使用didOverflowHeight而不是didOverflowWidth:

val textStyleBody1=材料主题。排版。正文1 val textStyle,updateTextStyle=记住{mutableStateOftextStyleBody1} 文本 text=此处显示长文本, style=textStyle, 溢出=文本溢出.Clip, onTextLayout={textLayoutResult-> 如果textLayoutResult.didOverflowHeight{ updateTextStyletextStyle.copyfontSize=textStyle.fontSize*0.9 } } 如果需要在列表中的多个项目之间同步字体大小,请将文本样式保存在可组合函数之外:

private val textStyle=mutableStateOfMaterialTheme.typography.body1 @组合的 有趣的组合{ 文本 }
这当然不是完美的,因为您将看到文本缩小到适合的程度。对我来说,它工作得很好,因为调整发生在第一个绘制周期内,几乎无法识别。

我使用以下方法根据可用宽度调整字体大小:

val textStyleBody1=材料主题。排版。正文1 val textStyle,updateTextStyle=记住{mutableStateOftextStyleBody1} 文本 text=此处显示长文本, style=textStyle, maxLines=1, softWrap=false, onTextLayout={textLayoutResult-> 如果textLayoutResult.didOverflowWidth{ updateTextStyletextStyle.copyfontSize=textStyle.fontSize*0.9 } } 要根据高度调整字体大小,请使用文本组合的属性,并使用didOverflowHeight而不是didOverflowWidth:

val textStyleBody1=材料主题。排版。正文1 val textStyle,updateTextStyle=记住{mutableStateOftextStyleBody1} 文本 text=此处显示长文本, style=textStyle, 溢出=文本溢出.Clip, onTextLayout={textLayoutResult-> 如果textLayoutResult.didOverflowHeight{ updateTextStyletextStyle.copyfontSize=textStyle.fontSize*0.9 } } 如果需要在列表中的多个项目之间同步字体大小,请将文本样式保存在可组合函数之外:

private val textStyle=mutableStateOfMaterialTheme.typography.body1 @组合的 有趣的组合{ 文本 }
这当然不是完美的,因为您将看到文本缩小到适合的程度。对我来说,它工作得很好,因为调整发生在第一个绘制周期内,几乎无法识别。

尝试BoxWithConstraints,学习SubcomposeLayout的概念

带约束的盒子 修饰语=修饰语 .fillMaxWidth .5F { val大小=最小最大宽度*1.7f,最大高度 val fontSize=尺寸*0.8f 文本 text=第一个, 颜色=颜色, fontSize=LocalDensity.current.run{fontSize.toSp}, modifier=modifier.fillMaxSize, textAlign=textAlign.Center, }
尝试BoxWithConstraints,学习SubcomposeLayout概念

带约束的盒子 修饰语=修饰语 .fillMaxWidth .5F { val大小=最小最大宽度*1.7f,最大高度 val fontSize=尺寸*0.8f 文本 text=第一个, 颜色=颜色, fontSize=LocalDensity.current.run{fontSize.toSp}, modifier=modifier.fillMaxSize, textAlign=textAlign.Center, }
我想补充一点,如果你不想从@Brian的答案中看到中间状态,你可以试试这个

        modifier = Modifier
            .drawWithContent {
                if (calculationFinish) { // replace by your logic 
                    drawContent()
                }
            },

我想补充一点,如果你不想从@Brian的答案中看到中间状态,你可以试试这个

        modifier = Modifier
            .drawWithContent {
                if (calculationFinish) { // replace by your logic 
                    drawContent()
                }
            },

它不改变textSize,它只改变文本组件的尺寸,类似于FillMaxHeights。它不改变textSize,它只改变文本组件的尺寸,类似于FillMaxHeights。它计算相对于外部l的可组合文本
布局。但它没有考虑到文本本身。因此,无论你有10个字符还是100个字符,文本都会以相同的字体大小呈现。@Brian Yep,这很简单。实现AutoResizeTextView ish将更加复杂。这将计算相对于外部布局的文本可组合性。但它没有考虑到文本本身。因此,无论你有10个字符还是100个字符,文本都会以相同的字体大小呈现。@Brian Yep,这很简单。要实现AutoResizeTextView,ish将更加复杂。内联fun MemberCalculation的计算参数内不允许使用kotlin可组合调用:->TypeVariableT:TypeVariableT kotlin val textStyle,updateTextStyle=记住{mutableStateOfMaterialTheme.Typegraphy.body1}@Forntoh您需要将主题引用从记住调用中移除。由于内联fun remembercalculation:->TypeVariableT:TypeVariableT kotlin val textStyle,updateTextStyle=记住{mutableStateOfMaterialTheme.typography.body1}的计算参数内不允许.kotlin可组合调用,因此情况似乎发生了变化@Forntoh您需要将主题引用从记住调用中移除。从那以后,情况似乎发生了变化。