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



相关文章
|
开发者 Python
新手困扰?该如何了解github的热门趋势和star排行?
新手困扰?该如何了解github的热门趋势和star排行?
783 0
|
API Android开发 开发者
NavigableListDetailPaneScaffold
【9月更文挑战第12天】
158 5
|
Android开发 UED 开发者
NavigableListDetailPaneScaffold
【9月更文挑战第12天】
149 5
|
前端开发 UED 开发者
React.lazy()与Suspense:实现按需加载的动态组件——深入理解代码分割、提升首屏速度和优化用户体验的关键技术
【8月更文挑战第31天】在现代Web应用中,性能优化至关重要,特别是减少首屏加载时间和提升用户交互体验。React.lazy()和Suspense组件提供了一种优雅的解决方案,允许按需加载组件,仅在需要渲染时加载相应代码块,从而加快页面展示速度。Suspense组件在组件加载期间显示备选内容,确保了平滑的加载过渡。
397 0
|
传感器 Android开发 UED
Android统一设置页面竖屏
【6月更文挑战第4天】
450 8
|
分布式计算 关系型数据库 数据处理
美柚与MaxCompute的数据同步架构设计与实践
数据处理与分析 一旦数据同步到MaxCompute后,就可以使用MaxCompute SQL或者MapReduce进行复杂的数据处理和分析。
|
存储 XML JSON
protobuf原理以及实例(Varint编码)
protobuf原理以及实例(Varint编码)
421 0
|
存储 Windows
下载Windows ISO镜像的方法
一、镜像介绍 1、大概介绍 .iso 是电脑上镜像的存储格式之一,所以通常在电脑中以后缀.iso命名,俗称iso镜像文件。 2、详细介绍 ISO镜像文件_百度百科 二、下载Windows 11镜像 1、Windows 11 官方下载网址 https://www.microsoft.com/zh-cn/software-download/windows11 2、步骤 点击官网地址,进入windows11官网,找到下载 Windows 11 磁盘映像 (ISO)
5458 0
Echarts柱状图折线图混合使用
Echarts柱状图折线图混合使用
424 0
|
Linux 开发工具 git
Git别名和配置文件
本文参考于廖雪峰老师的博客Git 教程。依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文。 如果,如果这么神器的 Git 版本控制系统,可以简化命令。比如git status,直接用git
404 0
Git别名和配置文件