Compose默认主题Color不够用怎么办?,一招解决

简介: Compose默认主题Color不够用怎么办?,一招解决

为什么要自定义主题


primary: Color,
    primaryVariant: Color,
    secondary: Color,
    secondaryVariant: Color,
    background: Color,
    surface: Color,
    error: Color,
    onPrimary: Color,
    onSecondary: Color,
    onBackground: Color,
    onSurface: Color,
    onError: Color,
    isLight: Boolean
复制代码

上面代码中的颜色是系统默认主题中的颜色,他能满足我们大部分颜色的需求,不过对于庞大的业务来说总会有多余的颜色需要处理,并且也可能需要适配深色和亮色两种模式,在这种情况下自定义主题就很有必要了。

还有一点,系统默认主题提供的颜色字段无法与我们的业务属性关联。


如何定义


我们使用系统主题分类一样的方式来实现,通过两个apiCompositionLocalProvidercompositionLocalOf实现。这两个api适用的场景很少,主题中的使用是最常见的。

我们可以使用CompositionLocalProvider包裹布局,compositionLocalOf变量提供值,这样当值发生定义后,整个树内部的相关属性都可以统一改变。


部分代码


  1. 定义我们自定义的颜色类,包含两个变量,colorBg背景颜色,textColor文字颜色
class CustomColor(
    colorBg: Color,
    textColor: Color,
) {
    val colorBg by mutableStateOf(colorBg)
    val textColor by mutableStateOf(textColor)
}
复制代码


  1. 生成亮色和深色两个颜色集合
fun customDarkTheme(
    colorBg: Color = Color(0xFFA243B3),
    textColor: Color = Color.Green,
): CustomColor = CustomColor(
    colorBg, textColor
)
fun customLightTheme(
    colorBg: Color = Color.White,
    textColor: Color = Color.Black,
): CustomColor = CustomColor(
    colorBg, textColor
)
复制代码


  1. 生成compositionLocalOf变量MultipleTheme
val MultipleTheme = compositionLocalOf<CustomColor> {
    customLightColor
}
复制代码

如上代码是自定义主题颜色集合,下面是使用方法

  1. 在我们的根树部分使用CompositionLocalProvider包裹组合
CompositionLocalProvider(MultipleTheme provides if (isSystemInDarkTheme()) customDartColor else customLightColor) {
                    Surface(modifier = Modifier.fillMaxSize(),
                        color = MaterialTheme.colors.background) {
                        Greeting("Android")
                    }
                }
复制代码


  1. 定义布局
@Composable
fun Greeting(name: String) {
    Box(Modifier
        .fillMaxSize()
        .background(MultipleTheme.current.colorBg),
        contentAlignment = Alignment.Center) {
        Text(text = "公众号:安安安安卓",
            style = TextStyle(color = MultipleTheme.current.textColor, fontSize = 40.sp))
    }
}
复制代码


效果展示


  1. 深色

image.png


  1. 亮色

image.png



相关文章
|
5月前
|
Java Shell Python
【经验分享】Typora 设置代码块的默认语言并设置为开机启动
在Typora中设置代码块默认语言为Java(或其他语言)的自动化方法。通过下载AHK(AutoHotkey)软件,创建一个.ahk脚本,设定`Ctrl+Shift+K`快捷键触发代码块并输入指定语言。将脚本改名为.ahk扩展名并运行,确保图标出现在任务栏。要实现开机启动,使用Win+R打开&quot;运行&quot;,输入shell:startup并粘贴.ahk文件到启动文件夹。
218 2
|
5月前
|
前端开发 iOS开发 MacOS
vscode自动跟随Mac或window系统系统切换主题色-白天用亮色主题、晚上用暗黑主题
vscode自动跟随Mac或window系统系统切换主题色-白天用亮色主题、晚上用暗黑主题
240 0
Butterfly安装文档(三)主题配置-1(三)
Butterfly安装文档(三)主题配置-1(三)
Butterfly安装文档(三)主题配置-1(二)
Butterfly安装文档(三)主题配置-1(二)
|
前端开发
Butterfly安装文档(三)主题配置-1(一)
Butterfly安装文档(三)主题配置-1
element-plus 自动引入修改主题色
element-plus 自动引入修改主题色
1035 0
|
编解码
flstudio怎么改主题,如何更改FL Studio21背景图片
FL Studio 21更换嵌入背景,通过自定义背景这个小功能可以让你随意更新FL Studio这款编曲软件的背景,让软件焕然一新。 自定义背景
195 0
flstudio怎么改主题,如何更改FL Studio21背景图片
|
人工智能 前端开发 搜索推荐
利用ChatGPT修改xaringan默认字体
利用ChatGPT修改xaringan默认字体
141 0
|
前端开发
零基础CSS入门教程(9)——背景颜色和背景图片
我们在images文件夹下放置一张图片,然后通过background-image来设置背景图。本小结我们学习了背景图片设置,背景颜色的设置,这两个设置再css里面很常用,我们要熟练掌握。如果觉得背景色不够好看,还可以找一张图片作为背景图,就想我们电脑或者手机的壁纸一般。我们前几小节学习了如何设置字体格式,我们这一小节学习一下如何设置背景颜色和图片。
零基础CSS入门教程(9)——背景颜色和背景图片
JetPack Compose主题配色太少怎么办,来设计自己的颜色系统吧(上)
JetPack Compose 正式版已经发布好几个月了,在这段时间里,除了业务相关需求之外,我也开始了 Compose 在实际项目中的落地实验,因为一旦要接入当前项目,那么遇到的问题其实远远大于新创建一个项目所需要的问题。
357 0