探索Jetpack Compose的Material You主题

news2025/1/20 18:24:14

Material You by Jasmin Phong

探索Jetpack Compose的Material You主题

在本文中,我们将了解可用于 Jetpack Compose 的新 Material You 库,并了解我们如何将其动态颜色应用到 Stream Chat Compose SDK,以获得有趣、多彩和个性化的消息传递体验。
Material You for stream chat
在本文中,您将了解有关 Material You 的所有信息,以及如何将颜色从 Material 3 Compose 库动态导入到 Stream 的多功能Chat Compose SDK中,从而为您的用户提供更加精美和个性化的感觉。

为了向您展示 API 的强大功能,您还将学习如何使用 Material Theme Builder,以便您可以创建自己的 Material Design 3 主题。

什么是 Material You

今年早些时候,Google 宣布了 Material You,这是 Material Design 的一个新方向,专注于个性化和灵活性。

Material You 的一个主要元素是它的动态颜色系统,它是一种颜色提取算法,使您能够根据用户的壁纸构建配色方案。在 Android 12 上,系统 UI 和单个应用程序都可以使用基于动态颜色系统的配色方案,以提供个性化和富有表现力的体验。
Android12 Material You
10 月下旬,新的指南、组件和 API 终于发布,使开发人员能够开始使用 Material Design 3 进行构建。

Compose Material 3 库

如果您使用 Jetpack Compose 构建应用程序,则可以使用恰当命名的Compose Material 3 库访问 Material 3 的 API 和组件。

该库包含更新的组件、排版、颜色、海拔 API 等。在这篇文章中,我们将只关注新的ColorScheme类和动态颜色。

但是,您可以查看Compose 页面中的 Material Theming或来自 Android Dev Summit 的随附视频,以了解有关新 Material API 中包含的内容以及如何使用它的更多详细信息。

您现在可以开始编码了!由于动态颜色仅由 Android 12 及以上系统提供,因此您需要检查设备的 SDK 版本。

您可以使用dynamicLightColorSchemedynamicDarkColorScheme方法来获取ColorScheme实例。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val lightColors: ColorScheme = dynamicLightColorScheme(context)
    val darkColors: ColorScheme = dynamicDarkColorScheme(context)
}

此对象包括M3 文档的用户生成的颜色页面中描述的所有颜色:

@Stable
class ColorScheme(
    primary: Color,
    onPrimary: Color,
    primaryContainer: Color,
    onPrimaryContainer: Color,
    inversePrimary: Color,
    secondary: Color,
    onSecondary: Color,
    secondaryContainer: Color,
    onSecondaryContainer: Color,
    ...,

如果你在你的应用中使用androidx.compose.material3.MaterialTheme,你可以直接传入一个ColorScheme,其中的颜色将应用于所有material3组件:

MaterialTheme(colorScheme = lightColors) {
    Button(...) {
        Text(...)    
    }
}

请务必从androidx.compose.material3中导入Button

但是,您也可以直接在 Jetpack Compose 代码中使用这些值ColorScheme,这是您将在下一节将它们应用到 Stream Chat SDK时执行的操作。

https://getstream.io/chat/sdk/

使用Material You配置你的主题色

在Stream 的 Compose Chat SDK中,主题是通过使用ChatTheme 组件完成的。它接受StreamColor参数,所有聊天 UI 组件在其实现中都使用这些颜色。

默认情况下,我们会提供一组浅色和深色,这些颜色会根据深色模式的系统设置自动应用。

@Composable
public fun ChatTheme(
    isInDarkMode: Boolean = isSystemInDarkTheme(),
    colors: StreamColors = if (isInDarkMode) StreamColors.defaultDarkColors() 
                           else StreamColors.defaultColors(),
    ...
    content: @Composable () -> Unit,
) {
    CompositionLocalProvider(
        LocalColors provides colors,
        ...
    ) {
        content()
    }
}

Material 3 库公开了一个ColorScheme对象。要将这些颜色应用到聊天组件,我们需要以某种方式将该对象中的值桥接到一个StreamColor.
示例代码如下:

private fun adapt(scheme: ColorScheme) = StreamColors(
    textHighEmphasis = scheme.onPrimaryContainer,
    textLowEmphasis = scheme.onSecondaryContainer,
    disabled = scheme.inversePrimary,
    borders = scheme.outline,
    inputBackground = scheme.surfaceVariant,
    appBackground = scheme.background,
    barsBackground = scheme.secondaryContainer,
    linkBackground = scheme.primaryContainer,
    overlay = scheme.surface.copy(alpha = 0.5f),
    overlayDark = scheme.inverseSurface.copy(alpha = 0.5f),
    primaryAccent = scheme.primary,
    errorAccent = scheme.error,
    infoAccent = scheme.secondary,
    highlight = scheme.inversePrimary,
    ownMessagesBackground = scheme.secondaryContainer,
    otherMessagesBackground = scheme.tertiaryContainer,
    deletedMessagesBackground = scheme.onError,
    threadSeparatorGradientStart = scheme.background,
    threadSeparatorGradientEnd = scheme.surfaceVariant,
)

要考虑夜间模式,以及设备上动态颜色的可用性,您还需要执行以下步骤:

@Composable
fun createStreamColors(): StreamColors {
    val isInDarkMode = isSystemInDarkTheme()
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        // Use dynamic colors if available
        val scheme = when {
            isInDarkMode -> dynamicDarkColorScheme(LocalContext.current)
            else -> dynamicLightColorScheme(LocalContext.current)
        }
        return adapt(scheme)
    } else {
        // Fall back to the default colors otherwise
        when {
            isInDarkMode -> StreamColors.defaultDarkColors()
            else -> StreamColors.defaultColors()
        }
    }
}

注意:上面的函数是一个@Composable函数,允许它动态访问isSystemInDarkTheme(),以及LocalContext.

作为最后一步,您需要将此处创建的颜色传递给ChatTheme包装聊天组件的颜色以应用自定义:

setContent {
    ChatTheme(colors = createStreamColors()) {
        MessagesScreen(
            channelId = channelId,
            onBackPressed = this::finish
        )
    }
}

如果您现在在 Android 12 设备上运行您的应用程序,您将看到基于系统从您当前壁纸中提取的颜色的各种配色方案!

您还可以在明暗模式之间切换,颜色会自动更新:
dark mode & dynamic color

示例代码地址https://github.com/zsmb13/MaterialYouChatDemo

使用 Material Theme Builder 构建主题

Material Design 团队推出了Material Theme Builder,它可以帮助您可视化 Material You 的动态颜色并创建自定义的 Material Design 3 主题。
Web 上的 Material Theme Builder允许您在 Web 客户端上构建动态配色方案。
Material Theme Builder

Material Theme Builder 的显着功能之一是您可以将自定义主题导出为原生代码,例如 Android Views (XML) 和 Jetpack Compose(包括主题、颜色和类型)。如下所示,网站上生成了基于自定义主题的 Jetpack Compose 代码。

val md_theme_light_primary = Color(0xFF6750A4)
val md_theme_light_onPrimary = Color(0xFFFFFFFF)
val md_theme_light_primaryContainer = Color(0xFFEADDFF)
val md_theme_light_onPrimaryContainer = Color(0xFF21005D)
...

val md_theme_dark_primary = Color(0xFFD0BCFF)
val md_theme_dark_onPrimary = Color(0xFF381E72)
val md_theme_dark_primaryContainer = Color(0xFF4F378B)
val md_theme_dark_onPrimaryContainer = Color(0xFFEADDFF)
...

private val LightThemeColors = lightColorScheme(

    primary = md_theme_light_primary,
    onPrimary = md_theme_light_onPrimary,
    primaryContainer = md_theme_light_primaryContainer,
    onPrimaryContainer = md_theme_light_onPrimaryContainer,
    secondary = md_theme_light_secondary,
  ...,

private val DarkThemeColors = darkColorScheme(

    primary = md_theme_dark_primary,
    onPrimary = md_theme_dark_onPrimary,
    primaryContainer = md_theme_dark_primaryContainer,
    onPrimaryContainer = md_theme_dark_onPrimaryContainer,
    secondary = md_theme_dark_secondary,
  ...,

生成主题的最终结果将如下所示:
chat theme effect

结论

在本教程中,您看到了从 Material 3 Compose 库中提取颜色并在 Stream Chat SDK for Compose 中使用它们是多么容易。请随意继续迭代适配代码以获得更好的结果!

参考链接

https://m3.material.io/
https://getstream.io/chat/compose/tutorial/
https://getstream.io/chat/docs/sdk/android/compose/overview/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark大数据处理讲课笔记4.7 Spark SQL内置函数

文章目录 零、本讲学习目标一、Spark SQL内置函数(一)内置函数概述1、10类内置函数2、两种使用方式 (二)内置函数演示1、通过编程方式使用内置函数upper()2、通过SQL语句的方式使用内置函数upper()3、演示其它内置函数的使用 二、…

MySQL的安装和卸载-Linux版

MySQL8.0.26-Linux版安装 1. 准备一台Linux服务器 云服务器或者虚拟机都可以,Linux的版本为 CentOS7; 2. 下载Linux版MySQL安装包 https://download.csdn.net/download/weixin_44373940/87784825 3. 创建目录,并解压到对应目录中 mkdir mysql 解压到mysql目录中 tar -xvf…

【Arduino疑难杂症】:报错:上传失败:上传错误:exit status Oxffffffff

项目场景: 制作arduino宠物监控系统项目的过程中,摄像头方面使用到了ESP32Cam,制作过程中遇到了如下问题。 问题描述 [ERRORJ: (annot configure port, something wert wrong. 0riginal message: WindowsError(31,"xclxacxb…

Spring笔记-教程-快速回忆

title: Spring笔记 date: 2023-05-12 00:12:55 categories: 后端Java tags:JavaSpring Spring官网https://spring.io 框架图: 为什么要使用Spring 原先代码中存在的问题如下: 业务层: public class BookServiceImpl implements BookServi…

了解Swarm 集群管理

Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。 支持的工具包括但不限…

SpringCache缓存常见问题

SpringCache 解决缓存常见问题 1 缓存穿透2 缓存雪崩3 缓存击穿 1 缓存穿透 缓存穿透是指缓存和数据库中都没有数据,而用户不断发起请求则这些请求会穿过缓存直接访问数据库,如发起为id为“-1”的数据或id为特别大不存在的数据。假如有恶意攻击&#xf…

TCP 和 UDP 协议详解

文章目录 1 概述2 TCP 协议2.1 报文格式2.2 三次握手,建立连接2.3 四次挥手,断开连接2.4 窗口机制 3 UDP 协议3.1 传输头格式 4 扩展4.1 常用端口号4.2 TCP 与 UDP 区别 1 概述 #mermaid-svg-aC8G8xwQRSdze7eM {font-family:"trebuchet ms",ve…

Mysql MHA高可用集群及故障切换

文章目录 一、MHA概述1.MHA的特点2. MHA的工作原理3.故障切换时MHA会做什么 二、实验搭建MySQLMHA1.配置主从分离2.安装MHA软件 总结 一、MHA概述 MHA(MasterHigh Availability)是一套优秀的mysql高可用环境下故障切换和主从复制的软件。 MHA解决了mysq…

铁路铁鞋UWB定位系统

在铁路运输过程中,当列车到达车站时,需要用专用铁鞋将列车固定在前轮和后轮上,以防止列车打滑和前进。所以,实时掌握铁鞋的位置信息十分重要,如果工人忘记撤回铁鞋子,则可能导致车辆停车和跳轨等事故频发。…

淘宝关键词搜索分析商品价格走势(商品列表接口,销量接口,价格接口,分类ID精准商品数据接口)接口代码对接

淘宝 OpenAPI(Open application programming interface)是一套 REST 方式的开放应用程序编程接口。淘宝网根据自己提供的电子商务基础服务,抽象并做成一系列的 API 接口。通过这些接口,可以让外部用户能够通过程序的方式访问淘宝网…

Vue 实现轮播图功能

Vue 是一款流行的前端框架,它提供了一系列的工具和组件,使得开发者可以更加便捷地创建交互式的 Web 应用程序。轮播图是 Web 应用程序中常见的一种交互式组件,可以用来展示图片、新闻、广告等内容。在 Vue 中,我们可以使用第三方组…

RVMedia VCL 8.0 for Delphi Crack

RVMedia VCL 8.0 for Delphi Crack FGX Native Network Frame是制造跨平台和现代移动设备的强大工具。FG开发团队的主要目标是简化移动应用程序的开发,使大多数人都能以各种技能开发应用程序。此外,这种形式的网络最重要的功能可以在100%的用户界面中设计…

分库分表的 21 条法则,hold 住!

大家好,我是小富~ (一)好好的系统,为什么要分库分表? 本文是《分库分表ShardingSphere5.x原理与实战》系列的第二篇文章,距离上一篇文章已经过去好久了,惭愧惭愧~ 还是…

GIS应用技巧之Landsat、Sport等遥感影像去除黑边的多种方法

一、前言 当我们利用GIS对遥感影像处理过程中,有时候需要将几张小的影像图镶嵌为一张大的,但是却被黑边所阻挡,这时候就需要找到一种方法来将黑边去掉了。由于遥感影像一般都太大了,不好获取也不好处理,这里我们选用的…

【C#】继承和序列化

前言 在之前的一篇文章中: 【C#】复杂Json的反序列 任意Json获取_code bean的博客-CSDN博客其中result这个key对应的内容是可能发生变化的,所以这里可以用到泛型。如何将一个复杂类型的JSON进行反序列化。那就是如何把json拆解成一个个子类的过程。htt…

NLP 中语言表示 (向量化) 的基本原理和历史演变综述

目录 1 前言2 语言表示2.1 离散表示2.1.1 独热编码2.1.2 词袋模型2.1.3 TF-IDF 模型2.1.4 N-gram 模型2.1.5 基于聚类的表示 2.2 连续表示2.2.1 分布式表示2.2.2 Word Embedding2.2.2.1 Word2Vec2.2.2.2 GloVe2.2.2.3 FastText 2.2.3 基础神经网络模型2.2.3.1 神经词袋模型2.2.…

Excel 设置只能输入指定的字符

目录 1. 创建你要用的表格 2. 确定你要限定输入的行/ 列 3. 创建另一个sheet,用来保存限制输入的配置信息 4. 选中【是否外包】列,并选择数据验证 5. 设置数据限制 6. 确认结果 7. 不想设置配置sheet怎么办? 在工作中,你们…

基于Java+SpringBoot+vue+node.js的图书购物商城系统详细设计和实现

基于JavaSpringBootvuenode.js的图书购物商城系统详细设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

70.建立一个轮播图组件第一部分

本次我们的目标是实现如图所示的 初始代码如下&#xff1a; ● 现在我们把图片、文本、按钮等元素添加进去 <div class"carousel"><img src"maria.jpg" alt"Maria de Almeida" /><blockquote class"testimonial">&…

一、Go基础知识入门

1、go语言介绍 2、go开发环境搭建 2.1、go的安装 go下载地址&#xff1a;All releases - The Go Programming Language&#xff0c;windows选择下载go1.20.2.windows-amd64.msi文件。 双击go1.20.2.windows-amd64.msi&#xff0c;点击"Next"&#xff0c;然后勾选同…