默认情况下,Surface(color = MaterialTheme.colors.primary) 上的文本有点透明。我可以将所有文本可组合项设为 100% 不透明吗?

Text on Surface(color = MaterialTheme.colors.primary) is a little bit transparent by default. Can I make it 100% opaque for ALL Text composables?

Text() 可组合项在具有原色的表面上绘制具有一定透明度的文本:

val Purple500 = Color(0xFF6200EE)

private val LightColorPalette = lightColors(
    primary = Purple500,
    primaryVariant = Purple700,
    secondary = Teal200
)


ColorsTestTheme {
    // A surface container using the 'background' color from the theme
    Surface(color = MaterialTheme.colors.primary) {
        Column {
            Text("Android", fontSize = 55.sp)
            Text("Android", color = Color.White, fontSize = 55.sp)
        }
    }
}

我可以将 ALL Text() 可组合项的文本与一些 BUILT-IN API 设为 100% 不透明吗?

通常我会得到带有不透明文本的设计模型:)

我意识到我可以像 OpaqueText(<params>, @Composable () -> Unit) 那样实现自己的可组合项 并用它来绘制不透明的文本 :)。我只是想知道是否有一种方法可以在 compose 中配置一些东西,以便使用内置的 Text() composable 获得相同的结果。

我认为这是一个错误。我认为 LocalContentAlpha 应该根据 Material guidelines 根据当前背景进行更新。目前仅根据此设置在 MaterialTheme 中:

Dark text on light backgrounds (shown here as #000000 on #FFFFFF) applies the following opacity levels: High-emphasis text has an opacity of 87%

作为 tmp 修复,要覆盖此行为,您可以为您的应用程序的一部分提供 [​​=11=] 值和 CompositionLocalProvider,或者您可以将其嵌入到您的主题中:

@Composable
fun ColorsTestTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {
    val colors = if (darkTheme) {
        DarkThemeColors
    } else {
        LightThemeColors
    }
    MaterialTheme(
        colors = colors,
        typography = typography,
        shapes = shapes,
    ) {
        CompositionLocalProvider(
            LocalContentAlpha provides 1f,
            content = content
        )
    }
}