Jetpack Compose 的 TextField 中的多种颜色

时间:2021-05-13 10:33:45

标签: android kotlin android-jetpack-compose android-textinputlayout android-jetpack-compose-text

是否可以在 Jetpack Compose 的 TextField 中获得不同的颜色?

类似于 Text 可与 AnnotatedString 组合,但 TextField 不允许 AnnotatedString 作为输入值。

可组合颜色的普通文本图像

enter image description here

2 个答案:

答案 0 :(得分:2)

你可以这样做:

Text(buildAnnotatedString {
    withStyle(style = SpanStyle(color = Color.Blue)) {
        append("H")
    }
    append("ello ")

    withStyle(style = SpanStyle(fontWeight = FontWeight.Bold, color = Color.Red)) {
        append("W")
    }
    append("orld")
})

在文档中查看更多信息:

https://developer.android.com/jetpack/compose/text#multiple-styles

答案 1 :(得分:2)

您可以在 VisualTransformation 中使用 TextField

TextField(
    value = text,
    onValueChange = { text = it },
    visualTransformation = ColorsTransformation()
)

VisualTransformation 中,您可以使用 AnnotatedString 以多种样式显示文本。

类似于:

class ColorsTransformation() : VisualTransformation {
    override fun filter(text: AnnotatedString): TransformedText {
        return TransformedText(
            buildAnnotatedStringWithColors(text.toString()), 
            OffsetMapping.Identity)
    }
}

与:

fun buildAnnotatedStringWithColors(text:String): AnnotatedString{
    val words: List<String> = text.split("\\s+".toRegex())// splits by whitespace
    val colors = listOf(Color.Red,Color.Black,Color.Yellow,Color.Blue)
    var count = 0

    val builder = AnnotatedString.Builder()
    for (word in words) {
        builder.withStyle(style = SpanStyle(color = colors[count%4])) {
            append("$word ")
        }
        count ++
    }
    return builder.toAnnotatedString()
}

enter image description here