Jetpack Compose Material 主题中出现意外的文本颜色 alpha

Fri*_*ice 7 android android-jetpack-compose android-compose-textfield android-jetpack-compose-material3

今天我发现 MaterialTheme 对文本颜色应用了 alpha 值。正如您从所附示例中看到的,当我更改背景颜色时,文本的颜色似乎有所不同,因为它具有透明度值。我可以强制设置颜色 ( Text(color = MaterialTheme.colors.onBackground, ....)) 并且这可以正常工作,但我不想对每个文本都执行此操作。

MaterialTheme 为什么要这样做?我该如何覆盖这种行为?

Compose 和 Material Compose Material 版本:1.2.1

@Preview
@Composable
private fun Preview_Playground() {
    MaterialTheme {
        Box(Modifier.background(Color.Green)) {
            Text("Test", fontWeight = FontWeight.ExtraBold, modifier = Modifier.alpha(1f))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述

Gab*_*tti 6

对于M2 ( androidx.compose.material), 的颜色Textcolor参数或应用TextStyle.
默认值为Color.Unspecified
如果 color =Color.Unspecified且 style 没有设置颜色,则会LocalContentColorLocalContentAlpha.current.

在 Text.kt 中您可以找到:

val textColor = color.takeOrElse {
        style.color.takeOrElse {
            LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
        }
    }
Run Code Online (Sandbox Code Playgroud)

对于M3 ( androidx.compose.material3) 它不会发生,因为LocalContentColor.current没有混合:

val textColor = color.takeOrElse {
    style.color.takeOrElse {
        LocalContentColor.current
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您必须使用 M2,您可以为您的 定义一个自定义可组合项Text,或者您可以更改LocalContentAlpha整个应用程序的主题(不仅仅是Text):

MaterialTheme(
    colors = colors,
    typography = Typography,
    shapes = Shapes
){

    CompositionLocalProvider(LocalContentAlpha provides 0.5f) {
        content()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这样做是正确的。谢谢。将颜色与当前 alpha 混合,以及 M2 中默认 alpha 值 < 1 真是令人头疼。 (2认同)