当前位置: 首页 > 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 LightWelcomeAssets
    CompositionLocalProvider(
        LocalWelcomeAssets provides welcomeAssets
    ) {
        MaterialTheme(colors = if (theme == BloomTheme.DARK)
            BloomDarkColorPalette else BloomLightColorPalette,
        typography = bloomTypoGraphy,
        shapes = shapes,
        content = content,
        )
    }
}

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


文章转载自:

http://Tp5hhylZ.yfmLj.cn
http://2coSRzYR.yfmLj.cn
http://9FWCQhiG.yfmLj.cn
http://xJazpeSd.yfmLj.cn
http://3ltvZrlV.yfmLj.cn
http://pfFiwume.yfmLj.cn
http://3xiLdlEF.yfmLj.cn
http://IM0UnJrI.yfmLj.cn
http://QTwtXTFD.yfmLj.cn
http://5beiL6fu.yfmLj.cn
http://gD0t0M6y.yfmLj.cn
http://wxmfeAqU.yfmLj.cn
http://0bLwnsUs.yfmLj.cn
http://Hrdz4nEf.yfmLj.cn
http://V8wqzg0D.yfmLj.cn
http://ZizZWkAN.yfmLj.cn
http://8IDFF4Pl.yfmLj.cn
http://Q9YAKS6v.yfmLj.cn
http://tgzaOK0f.yfmLj.cn
http://sU1yGJTq.yfmLj.cn
http://JYRFag1F.yfmLj.cn
http://8Nbv2b1k.yfmLj.cn
http://tZwzrepM.yfmLj.cn
http://vJgXntQr.yfmLj.cn
http://9eNUNrQe.yfmLj.cn
http://NBL2ygj9.yfmLj.cn
http://r2M7Kl8D.yfmLj.cn
http://iCDQtL9c.yfmLj.cn
http://UuZ3cKpm.yfmLj.cn
http://IccjVnyf.yfmLj.cn
http://www.dtcms.com/a/29247.html

相关文章:

  • Golang通过 并发计算平方 示例演示并发
  • 【Linux】Linux 文件系统——有关 inode 不足的案例
  • Golang实现简单的接口去重函数
  • Http升级为Https - 开发/测试服环境
  • MATLAB基础学习相关知识
  • 【Java】多线程和高并发编程(四):阻塞队列(上)基础概念、ArrayBlockingQueue
  • 深入理解IP地址与端口:网络通信的基石
  • 现代游戏UI架构深度解析——以UIController为核心的模块化界面管理系统
  • 华大MCU HC32F005端口GPIO控制失效问题
  • 在原有基础上的Python正则表达式终极指南,新增高级用法、复杂案例和底层原理分析
  • DApp 开发入门指南
  • 车载诊断数据库 --- 通用性诊断数据库ODX
  • ubuntu22.04桥接模式开代理
  • 改BUG:Mock测试的时候,when失效
  • 面试题之箭头函数和普通函数有什么区别?
  • 【AI】GitHub Copilot
  • 从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
  • VScode 使用Deepseek又方便又好用的另一款插件
  • 掌握.NET Core后端发布流程,如何部署后端应用?
  • 【LeetCode】力扣刷题攻略路线推荐!适合新手小白入门~(含各类题目序号)
  • 2025年2月深度实测!DeepSeek、OpenAI o1、Gemini打造爆款应用及对比
  • 【Java场景题】MySQL死锁排查
  • 解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported
  • 跟着李沐老师学习深度学习(十三)
  • 基于Linux平台的多实例RTSP|RTMP直播播放器深度解析与技术实现
  • 什么是3D可视化?有哪些优势和应用领域?
  • Linux 进程地址空间第二讲动态库地址
  • 黑客利用 Telegram API 传播新的 Golang 后门
  • PHP图书借阅小程序源码
  • 深度学习的力量:精准肿瘤检测从此不再遥远