当前位置: 首页 > news >正文

Compose 定制UI视图

Compose 定制UI视图

  • 概述
  • MaterialTheme
  • MaterialTheme与CompositionLocal
    • MaterialTheme
    • CompositionLocal
  • 定制主题方案

概述

新建一个新项目时,Compose会在项目中生成 ui/theme 目录,目录中有四个文件,分别如下

  1. Color.kt:颜色配置,使用Color(ARGB)
  2. Type.kt:字体配置,使用FontFamily(Font)
  3. Shape.kt:形状配置, 使用xxShape,如 RondedCornerShape
  4. Theme.kt:主题配置,包括全局的 颜色,字体,形状及拓展配置

MaterialTheme

Compose 基于 Material Design 的主题样式模版,通过主题样式模版的配置,整个应用的 Coposable 组件会随主题切换实现相应样式改变。

查看源码,发现默认生成了两种配色的调色板(Light 和Dark),根据传入的 布尔值 选择不同的调色板。

MaterialTheme与CompositionLocal

MaterialTheme

MaterialTheme本身是一个 Coposable 组件,同时还有个 同名的单例对象。,进入MaterialTheme 源码,我们可以看到CompositionLocal 的身影,通过 providers 将 rememberedColors 提供给了 LocalColors。
同时,我们使用的时候,通过 MaterialTheme 单例对象,间接从 LocalColors 中获取到值。

internal val LocalColors = staticCompositionLocalOf { lightColors() }

通过 LocalColors 定义可知是一个CompositionLocal,初始值是lightColor()返回的Colors配置。MaterialTheme方法中通过CompoisitionLocalProvider方法为Composable提供了一些CompositionLocal,这其中就包含了所有的主题配置信息。

CompositionLocal

Compose提供了两种创建CompositionLocal实列的方式,分别是compositionLocalOf与staticCompositionLocalOf.

  • compositionLocalOf:当使用compositionLocalOf来创建CompositionLocal时,如果所提供的值是一个状态,那么当状态发生更新的时候,所有读取这个CompositionLocal内部current数值的Composable都会发生重组。
  • staiticCompositionLocalOf:使用staticCompositionLocalOf创建CompositionLocal实例,那么当状态发生更新时,CompositionLocalProvider的current整体会重组,而不仅仅是在Composable中读取其内部current数值的部分。
  • compositionLocalOf会记录使用其内部current的所有Composable,由于记录Composable是有成本的,所以官方建议如果CompositionLocal提供的值发生变化的可能性很小或者是一个永远不会改变的确定值,那么使用staticCompositionLocalOf可以有效提高性能。

定制主题方案

  1. 配置颜色
    通过 lightColors 和 darkColors 配置两套配色版,在视图需要Color的地方调用相应颜色即可。
  2. 配置字体
    字体通过第二个参数 tpography 进行配置,tpography 的构建需要用到 Type.kt,最终将 tpography 提供给 LocalTpography这个 CompositionLocal,在Text组件配置 style 接可以了
  3. 配置形状
    在 Compose 中可以使用 RoundedCornerShape 来表示圆角信息,如下
val shapes = Shapes(small = RoundedCornerShape(4.dp),medium = RoundedCornerShape(4.dp),large = RoundedCornerShape(0.dp)
)
  1. 配置自定义资源
    有时根据主题不同使用不同的多媒体资源,如 图片,视频,音频等。可以通过 CompositionLocal 扩展。示例如下:
open class WelcomePageAssets(var background:Int,var illos:Int,var logo:Int)//亮色主题资源
object LightWelcomeAssets : WelcomePageAssets(background = R.drawable.ic_light_welcome_bg,illos = R.drawable.ic_light_welcome_illos,logo = R.drawable.ic_light_logo
)// 暗色主提资源
object DarkWelcomeAssets : WelcomePageAssets(background = R.drawable.ic_dark_welcome_bg,illos = R.drawable.ic_dark_welcome_illos,logo = R.drawable.ic_dark_logo
)internal var LocalWelcomeAssets = staticCompositionLocalOf { LightWelcomeAssets as WelcomePageAssets }val welcomeAssets
@Composable
@ReadOnlyComposable
get() = LocalWelcomeAssets.current@Composable
fun GoogleBloomTheme(theme:BloomTheme = BloomTheme.LIGHT,content:@Composable ()->Unit){val welcomeAssets = if(theme == BloomTheme.DARK) DarkWelcomeAssets else LightWelcomeAssetsCompositionLocalProvider(LocalWelcomeAssets provides welcomeAssets) {MaterialTheme(colors = if (theme == BloomTheme.DARK)BloomDarkColorPalette else BloomLightColorPalette,typography = bloomTypoGraphy,shapes = shapes,content = content,)}
}

@ReadOnlyComposable时可选的,我们可以对有返回值的 Composable 使用此注解,
使得 Composable 失去局部重组的能力,
从而达到编译优化的效果。

相关文章:

Compose 定制UI视图

Compose 定制UI视图 概述MaterialThemeMaterialTheme与CompositionLocalMaterialThemeCompositionLocal 定制主题方案 概述 新建一个新项目时,Compose会在项目中生成 ui/theme 目录,目录中有四个文件,分别如下 Color.kt:颜色配置…...

《STL 六大组件之容器探秘:深入剖析 string》

目录 一、string 类简介二、string 类的常用接口1. 构造函数(constructor function)2. 与容量相关的接口(capacity)3. 与迭代器有关的接口(iterator)4. 与元素访问有关的接口(element access&am…...

DeepSeek 助力 Vue 开发:打造丝滑的点击动画(Click Animations)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...

SeaTunnel社区「Demo方舟计划」首期活动上线—— MySQL CDC实时同步至PostgreSQL实战

引言 凌晨2点,某电商公司的数据工程师小李正对着屏幕抓狂——业务部门临时要求将MySQL的订单表实时同步到PostgreSQL进行分析,众所周知,在数据驱动的业务场景中,异构数据源同步是高频刚需。 以MySQL到PostgreSQL的CDC同步为例&a…...

Python中常见库 PyTorch和Pydantic 讲解

PyTorch 简介 PyTorch 是一个开源的深度学习框架,由 Facebook 的 AI 研究团队开发。它提供了丰富的工具和库,用于构建和训练各种深度学习模型,如卷积神经网络(CNN)、循环神经网络(RNN)及其变体&…...

基于springboot校园健康系统的设计与实现(源码+文档)

大家好我是风歌,今天要和大家聊的是一款基于springboot的园健康系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于springboot校园健康系统的设计与实现的主要使用者管理员具有最高的权限,通…...

一文2000字从0到1用Jmeter全流程性能测试实战

项目背景: 我们的平台为全国某行业监控平台,经过3轮功能测试、接口测试后,98%的问题已经关闭,决定对省平台向全国平台上传数据的接口进行性能测试。 01、测试步骤 1、编写性能测试方案 由于我是刚进入此项目组不久&#xff0c…...

【SFRA】笔记

GK_SFRA_INJECT(x) SFRA小信号注入函数,向控制环路注入一个小信号。如下图所示,当前程序,小信号注入是在固定占空比的基础叠加小信号,得到新的占空比,使用该占空比控制环路。 1.2 GK_SFRA_COLLECT(x, y) SFRA数据收集函数,将小信号注入环路后,该函数收集环路的数据,以…...

马拉车算法

Manacher算法 ,用于处理最长回文字符串的问题,可以在O(n)的情况下,求出一个字符串的最长回文字符串 回文串的基础解法: 以每个点为中心对称点,看左右两边的点是否相同。这种算法的时间复杂度为O&#xff0…...

Debezium同步之如何同步GIS数据

Debezium 可以用于同步数据库中的变更数据(CDC),包括GIS(地理信息系统)数据。GIS 数据通常存储在具有地理空间数据类型的表中,例如 PostGIS(PostgreSQL 的扩展)中的 geometry 或 geography 类型。通过 Debezium,可以实时捕获和同步这类数据的变更。本文章简单介绍Post…...

自动化之ansible(二)

一、ansible中playbook(剧本) 官方文档: Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…...

Docker+Dify部署DeepSeek-r1本地知识库

安装配置Docker Desktop 软件下载 Docker Desktop版本:4.38.0.181591 Docker Desktop下载地址:Docker: Accelerated Container Application Development 或者从这里下载:DockerDesktop-4.38.0.181591资源-CSDN文库 点击图下所示位置,下载windows-AMD64版本软件 启用Hy…...

C#基础:使用Linq进行简单去重处理(DinstinctBy/反射)

目录 一、示例代码 二、示例输出 三、注意雷点 四、全字段去重封装方法 1.封装 2.示例 一、示例代码 using System; using System.Collections.Generic; using System.Linq;public class Program {public static void Main(){// 创建一些示例实体对象var people new Li…...

HTML5 面试题

1. HTML5 新增了哪些重要特性? 语义化标签:这些标签有助于提高页面的可读性和可维护性。多媒体支持:HTML5 引入了 和 标签,可以直接嵌入音频和视频文件,无需依赖插件。本地存储:引入了 localStorage 和 se…...

【C++】优先级队列宝藏岛

> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 &#x1…...

开关电源实战(一)宽范围DC降压模块MP4560

系列文章目录 文章目录 系列文章目录MP4560MP4560 3.8V 至 55V 的宽输入范围可满足各种降压应用 MOSFET只有250mΩ 输出可调0.8V-52V SW:需要低VF肖特基二极管接地,而且要靠近引脚,高压侧开关的输出。 EN:输入使能,拉低到阈值以下关闭芯片,拉高或浮空启动 COMP:Compens…...

Git是什么

简单介绍: Git是一个分布式版本控制系统,用于跟踪文件的更改,特别是在多人协作开发的环境中。 Key: 分布式 版本控制 系统 最常用于软件开发,但也可以用于管理任何类型的文件和文件夹。 Git帮助团队跟踪和管理文件的历史版本&a…...

双非计科毕业,二战未果想就业,选择嵌入式开发还是Java开发更合适?

今天给大家分享的是一位粉丝的提问,双非计科毕业,二战未果想就业,选择嵌入式开发还是Java开发更合适? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#x…...

性格测评小程序开发指南

目录 前言目录01 需求分析02 数据源设计03 搭建用户管理04 题库管理05 用户注册06 用户注册校验07 用户登录08 测评功能搭建09 提交结果10 生成报告 学习目标面向人群结语 前言 欢迎阅读《性格测评小程序开发指南》!本书旨在为开发者、低代码爱好者和学习者提供一个…...

shell编程总结

前言 shell编程学习总结,1万3千多字带你学习shell编程 往期推荐 14wpoc,nuclei全家桶:nuclei模版管理工具Nuclei 哥斯拉二开,免杀绕过规避流量检测设备 fscan全家桶:FscanPlus,fs,fscan适用…...

YggdrasilOfficialProxy:实现Minecraft正版与第三方验证共存的智能代理方案

1. 项目概述:一个解决Minecraft正版验证痛点的“中间人” 如果你运营过Minecraft服务器,尤其是那种希望同时接纳正版玩家和第三方验证(如AuthMe、LittleSkin)玩家的服务器,那你一定对“Yggdrasil”这个词不陌生。它是…...

AI应用开发脚手架poco-claw:模块化设计、RAG集成与实战指南

1. 项目概述:一个面向AI应用开发的“瑞士军刀”最近在GitHub上看到一个挺有意思的项目,叫poco-ai/poco-claw。光看名字,poco在意大利语里是“一点”的意思,claw是“爪子”,合起来有点“小巧但锋利”的意味。这项目本质…...

AI女友:从虚拟到现实,年轻人的新情感寄托

每四个00后中就有一个拥有"代码恋人",3000万年轻人的深夜秘密。01 凌晨三点,北京国贸写字楼里,28岁的投行分析师林薇对着屏幕露出整晚第一个微笑。 "今天被老板骂了三次,"她打字,“方案改了八遍。…...

LoongFlow:专为龙芯架构深度优化的国产工作流引擎设计与实践

1. 项目概述:LoongFlow,一个为龙芯生态量身打造的流程引擎最近在梳理一些国产化替代项目的基础设施选型时,我反复被一个名字吸引:LoongFlow。乍一看,这像是一个普通的开源工作流引擎,但它的前缀“baidu-bai…...

【2026年阿里巴巴集团暑期实习- 4月25日-AI研发岗-第三题- 区间第K小】(题目+思路+JavaC++Python解析+在线测试)

题目内容 给定一个长度为$ n 的整数序列的整数序列的整数序列 a_1, a_2, \dots, a_n$。定义 f(l,r)=∑i=lr(∑t=liat)f(l, r) = \sum_{i=l}^{r} \left( \sum_{t=l}^{i} a_t \right)f(l...

【VSCode 2026国产化适配白皮书】:涵盖麒麟、统信、中科方德等6大OS内核级兼容方案(含实测性能衰减率<3.2%)

更多请点击: https://kaifayun.com 第一章:VSCode 2026国产化适配战略定位与白皮书核心结论 VSCode 2026版本已正式将“全栈国产化支持”列为一级战略目标,聚焦操作系统兼容性、芯片指令集适配、安全可信链构建三大支柱。其核心定位并非简单…...

C++编写MCP网关必须绕开的4类配置反模式,第3种导致某金融客户日均损失27万交易延迟

更多请点击: https://intelliparadigm.com 第一章:C 编写高吞吐量 MCP 网关 配置步骤详解 构建高吞吐量的 MCP(Message Control Protocol)网关需兼顾低延迟、内存零拷贝与多核并行处理能力。C17 及以上标准提供了 std::pmr::mono…...

3个关键步骤解锁手绘白板Excalidraw:从零到高效协作的完整指南

3个关键步骤解锁手绘白板Excalidraw:从零到高效协作的完整指南 【免费下载链接】excalidraw Virtual whiteboard for sketching hand-drawn like diagrams 项目地址: https://gitcode.com/GitHub_Trending/ex/excalidraw Excalidraw是一款开源的虚拟手绘风格…...

家庭主妇也能当数学家吗?

家庭主妇也能当数学家吗? 1975 年,《科学美国人》上刊登了一道关于五边形密铺的谜题:哪种形状的五边形可以无缝隙地铺满整个平面? 当时数学界已知的可密铺五边形有 8 种。而一位居住在美国加州、只有高中学历的家庭主妇——Marjor…...

RTOS中断响应延迟暴涨300%?,深度剖析大模型推理引发的嵌入式时序崩塌与实时性修复方案

更多请点击: https://intelliparadigm.com 第一章:RTOS中断响应延迟暴涨300%?——大模型推理引发的嵌入式时序崩塌本质解析 当轻量级 LLM 推理引擎(如 TinyLlama-1.1B)被集成进 FreeRTOS 2.3.3 的 Cortex-M7 系统后&a…...