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



相关文章
|
3月前
|
缓存 监控 Java
Java 性能天花板:JIT 即时编译、分层编译与代码缓存深度调优指南
JIT即时编译是Java性能优化的核心机制,本文深入解析了JIT的工作原理与优化技术。文章首先介绍了Java的双重执行模型,对比了解释执行与JIT编译的差异。重点讲解了分层编译机制,包括5个编译层级及其流转规则。针对代码缓存管理,详细说明了分段式架构和监控方法。通过JMH基准测试展示了方法内联、逃逸分析等核心优化技术的实际效果,其中方法内联性能提升10-20倍,逃逸分析优化可达50倍。最后提供了线上常见JIT问题的排查方案,强调JDK17默认参数已优化大部分场景,调优需基于监控数据。
477 1
|
11月前
|
JSON 文件存储 数据安全/隐私保护
微博超话自动签到神器, 微博自动签到神器app,贴吧微博签到脚本工具助手
核心模块包含超话列表获取和签到功能‌2使用配置文件存储cookies避免硬编码‌1
|
运维 自然语言处理 供应链
阿里云 × 用友BIP超级版联合发布暨产品分享
本次分享介绍阿里云与用友BIP超级版联合发布的解决方案,旨在帮助企业应对数字化转型中的挑战。主要内容分为三部分:一、市场需求及客户痛点,分析企业数字化转型的六大特征和中大型企业在数智化建设中面临的难题;二、用友BIP超级版on阿里云解决方案,涵盖业务架构、三大核心价值主张(超级领先、超级快、超级省)及智能应用;三、成功客户案例,如洛阳钼业在50天内完成采购供应链领域的数字化部署。该方案助力企业快速实现数字化转型,提升运营效率并降低成本。
516 0
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
1017 1
|
Android开发 UED 开发者
NavigableListDetailPaneScaffold
【9月更文挑战第12天】
348 5
|
API Android开发 开发者
NavigableListDetailPaneScaffold
【9月更文挑战第12天】
307 5
|
存储 算法 安全
堆 和 优先级队列(超详细讲解,就怕你学不会)
堆 和 优先级队列(超详细讲解,就怕你学不会)
|
XML 传感器 缓存
Android:四大组件之 Service
Service 是 Android 中实现程序后台运行的解决方案,它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。但不要被“后台”二字迷惑,Service 默认并不会运行在子线程中,它也不会运行在一个独立的进程中,它同样执行在 UI 线程中,因此,不要在 Service 中执行耗时的操作,除非你在 Service 中创建子线程来完成耗时操作。
569 0
Android:四大组件之 Service
|
存储 XML JSON
protobuf原理以及实例(Varint编码)
protobuf原理以及实例(Varint编码)
811 0