Android Material Design 3 主题配色终极指南:XML 与 Compose 全解析

最小必要颜色配置

<!-- res/values/themes.xml -->
<style name="Theme.MyApp" parent="Theme.Material3.DayNight"><!-- 基础三原色 --><item name="colorPrimary">@color/purple_500</item><item name="colorSecondary">@color/teal_200</item><item name="colorTertiary">@color/orange_200</item><!-- 背景+文字 --><item name="colorSurface">@color/white</item><item name="colorOnSurface">@color/black</item>
</style>

对应效果

  • 按钮/导航栏:紫色
  • 开关/复选框:水绿色
  • 悬浮按钮:橙色容器
  • 背景:白色
  • 文字:黑色

基础控件颜色映射

控件使用的颜色属性
按钮colorPrimary + colorOnPrimary
开关colorSecondary
卡片colorSurface
文本colorOnSurface

XML 和 Compose 双版本的完整代码注释,按功能模块划分:


一、基础颜色配置

1. XML 版本 (res/values/themes.xml)
<!-- 主品牌色:用于FAB、主要按钮等 -->
<item name="colorPrimary">@color/purple_500</item><!-- 主色上的内容色:确保与主色有足够对比度 -->
<item name="colorOnPrimary">@color/white</item><!-- 次要品牌色:用于开关、单选按钮等 -->
<item name="colorSecondary">@color/teal_200</item><!-- 背景系统:页面基础背景 -->
<item name="colorSurface">@color/white</item><!-- 背景上的内容色:普通文本颜色 -->
<item name="colorOnSurface">@color/black</item><!-- 错误色:错误提示文本/边框 -->
<item name="colorError">@color/red_500</item>
2. Compose 版本 (Theme.kt)
val LightColorScheme = lightColorScheme(// 主色容器:FAB背景色primary = Color(0xFF6750A4),// 主色上的内容:FAB图标颜色onPrimary = Color(0xFFFFFFFF),// 次要色:Switch滑块颜色secondary = Color(0xFF958DA5),// 背景色:页面底色surface = Color(0xFFFFFBFE),// 背景上的内容:普通文本onSurface = Color(0xFF1C1B1F),// 错误色error = Color(0xFFB3261E)
)

二、控件颜色映射

1. 按钮 (Button)
<!-- XML版 -->
<Buttonandroid:backgroundTint="?attr/colorPrimary"android:textColor="?attr/colorOnPrimary"/>
// Compose版
Button(colors = ButtonDefaults.buttonColors(containerColor = MaterialTheme.colorScheme.primary,contentColor = MaterialTheme.colorScheme.onPrimary,// 禁用状态颜色(自动降低透明度)disabledContainerColor = MaterialTheme.colorScheme.surfaceVariant,disabledContentColor = MaterialTheme.colorScheme.onSurfaceVariant)
) { Text("按钮") }
2. 卡片 (Card)
<!-- XML版 -->
<androidx.cardview.widget.CardViewapp:cardBackgroundColor="?attr/colorSurface"app:strokeColor="?attr/colorOutline">
// Compose版
Card(colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface,contentColor = MaterialTheme.colorScheme.onSurface),border = CardDefaults.outlinedCardBorder(borderColor = MaterialTheme.colorScheme.outline)
) { /* 内容 */ }
3. 开关 (Switch)
<!-- XML版 -->
<Switchandroid:trackTint="?attr/colorSecondaryContainer"android:thumbTint="?attr/colorOnSecondary"/>
// Compose版
Switch(colors = SwitchDefaults.colors(checkedThumbColor = MaterialTheme.colorScheme.onSecondary,checkedTrackColor = MaterialTheme.colorScheme.secondary,uncheckedThumbColor = MaterialTheme.colorScheme.surfaceVariant,uncheckedTrackColor = MaterialTheme.colorScheme.onSurfaceVariant)
)

三、深色模式适配

1. XML 配置 (res/values-night/themes.xml)
<style name="Theme.MyApp" parent="Theme.Material3.DayNight"><!-- 深色背景 --><item name="colorSurface">@color/dark_surface</item><!-- 深色文字 --><item name="colorOnSurface">@color/dark_on_surface</item><!-- 深色轮廓线 --><item name="colorOutline">@color/dark_outline</item>
</style>
2. Compose 配置
val DarkColorScheme = darkColorScheme(surface = Color(0xFF1C1B1F),onSurface = Color(0xFFE6E1E5),outline = Color(0xFF938F99)
)@Composable
fun MyAppTheme(darkTheme: Boolean = isSystemInDarkTheme(),content: @Composable () -> Unit
) {val colorScheme = if (darkTheme) DarkColorScheme else LightColorSchemeMaterialTheme(colorScheme = colorScheme,content = content)
}

四、动态颜色(Android 12+)

1. XML 配置
<!-- res/values-v31/themes.xml -->
<style name="Theme.MyApp" parent="Theme.Material3.DayNight.DynamicColors"><item name="android:dynamicColorThemeOverlay">@style/ThemeOverlay.App.Dynamic</item>
</style>
2. Compose 集成
@Composable
fun DynamicColorWrapper(content: @Composable () -> Unit) {val context = LocalContext.currentval dynamicColor = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Sif (dynamicColor) {DynamicColors.rememberDynamicColors().apply {if (isDynamicColorAvailable) {LaunchedEffect(key1 = colorScheme) {// 动态颜色应用后的回调}}}}content()
}

五、完整主题构建示例

XML 全量配置
<style name="Theme.MyApp" parent="Theme.Material3.DayNight"><!-- 主色系 --><item name="colorPrimary">@color/primary_500</item><item name="colorOnPrimary">@color/white</item><item name="colorPrimaryContainer">@color/primary_100</item><!-- 文字系统 --><item name="textColorPrimary">?attr/colorOnSurface</item><item name="textColorSecondary">?attr/colorOnSurfaceVariant</item><!-- 控件状态 --><item name="colorControlNormal">?attr/colorOnSurface</item><item name="colorControlActivated">?attr/colorPrimary</item>
</style>
Compose 全量主题
private val Typography = Typography(// 标题文字样式titleLarge = TextStyle(fontFamily = FontFamily.Default,fontWeight = FontWeight.Bold,fontSize = 22.sp,color = MaterialTheme.colorScheme.onSurface),// 正文样式bodyMedium = TextStyle(fontFamily = FontFamily.Default,fontWeight = FontWeight.Normal,fontSize = 16.sp,color = MaterialTheme.colorScheme.onSurface)
)@Composable
fun MyAppTheme(content: @Composable () -> Unit) {MaterialTheme(colorScheme = if (isDarkTheme()) DarkColorScheme else LightColorScheme,typography = Typography,shapes = Shapes(),content = content)
}

关键注意事项

  1. XML 与 Compose 混用场景

    // 在Compose中使用XML定义的颜色
    val color = Color(ContextCompat.getColor(context, R.color.primary_500))
    
  2. 颜色覆盖优先级

    控件直接设置 > 样式定义 > 主题默认值
    
  3. 调试命令

    # 查看当前主题属性
    adb shell dumpsys activity top | grep "mTheme"
    

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

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

相关文章

【Git】“warning: LF will be replaced by CRLF”的解决办法

一、原因分析 不同操作系统的换行符标准不同&#xff1a; • Windows&#xff1a;使用 CRLF&#xff08;\r\n&#xff09;表示换行&#xff1b; • Linux/Mac&#xff1a;使用 LF&#xff08;\n&#xff09;表示换行 Git 检测到本地文件的换行符与仓库设置或目标平台不兼容时…

PyTorch 深度学习实战(33):联邦学习与隐私保护

在上一篇文章中,我们探讨了多模态学习与CLIP模型的应用。本文将深入介绍联邦学习(Federated Learning)这一新兴的分布式机器学习范式,它能够在保护数据隐私的前提下实现多方协作的模型训练。我们将使用PyTorch实现一个基础的联邦学习框架,并在图像分类任务上进行验证。 一…

蓝桥杯 web 展开你的扇子(css3)

普通答案&#xff1a; #box:hover #item1{transform: rotate(-60deg); } #box:hover #item2{transform: rotate(-50deg); } #box:hover #item3{transform: rotate(-40deg); } #box:hover #item4{transform: rotate(-30deg); } #box:hover #item5{transform: rotate(-20deg); }…

LLM驱动的智能体:基于GPT的对话智能体开发指南

前言 大语言模型&#xff08;LLM, Large Language Model&#xff09;正在彻底改变智能体&#xff08;Agent&#xff09;的设计和实现方式。从简单的聊天机器人到复杂的自动化助手&#xff0c;基于GPT等LLM的对话智能体已经在客服、教育、办公自动化、编程助手等领域得到了广泛…

深度解析 C# 中介者模式:设计与实战应用

中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将多个对象之间的交互集中到一个中介者对象中&#xff0c;从而减少对象之间的直接交互&#xff0c;降低耦合度。在实现复杂系统时&#xff0c;中介者模式有助于提高系统的可维…

每日算法-250408

记录今天解决的两道 LeetCode 算法题&#xff0c;主要涉及二分查找的应用。 1283. 使结果不超过阈值的最小除数 题目描述 思路 核心思路是 二分查找。 解题过程 为什么可以使用二分&#xff1f; 关键在于单调性。对于一个固定的数组 nums&#xff0c;当除数 divisor 增大时&…

MySQL的子查询

一、前言 MySQL 子查询是指嵌套在其他 SQL 语句&#xff08;如 SELECT、WHERE、FROM 等&#xff09;内部的查询。用于辅助主查询完成复杂的数据筛选或计算。 二、子查询分类 标量子查询 描述&#xff1a;返回 单行单列&#xff08;一个值&#xff09;&#xff0c;常用于比较运…

Linux 基础入门操作 前言 VIM的基本操作 2

1 VIM的背景介绍 Vi 的诞生与1976年&#xff0c;Vim 的前身是 Vi&#xff08;Visual Editor&#xff09;&#xff0c;由 Bill Joy 在 BSD Unix 系统上开发&#xff0c;作为 ed&#xff08;行编辑器&#xff09;的改进版本&#xff0c;提供全屏编辑功能&#xff0c;成为 Unix/L…

Java:Set操作

目录 Set 转 List Set 转 List Set<String>set new HashSet<String>(); set.add("c"); set.add("d"); set.add("a"); set.add("a");//方法一&#xff1a; List<String>list new ArrayList<String>(set);//…

算力驱动未来:从边缘计算到高阶AI的算力革命

算力驱动未来&#xff1a;从边缘计算到高阶AI的算力革命 摘要 本文深入探讨了不同算力水平&#xff08;20TOPS至160TOPS&#xff09;在人工智能领域的多样化应用场景。从边缘计算的实时目标检测到自动驾驶的多传感器融合&#xff0c;从自然语言处理的大模型应用到AI for Scie…

虚拟机上安装openEuler和openGauss数据库

1.虚拟机版本选择VM 16 PRO 2.openEuler版本选择openEuler-22.03-LTS-SP4-x86_64 下载地址&#xff1a;https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP4/ISO/x86_64/openEuler-22.03-LTS-SP4-x86_64-dvd.iso 3.虚拟机安装openEuler过程&#xff1a; 4.安装ope…

0_Pytorch中的张量操作

[引言]张量的概念 1.基本概念 张量是一个通用的多维数组&#xff0c;可以表示标量&#xff08;0 维&#xff09;、向量&#xff08;1 维&#xff09;、矩阵&#xff08;2 维&#xff09;以及更高维度的数据。张量是 PyTorch 中的核心数据结构&#xff0c;用于表示和操作数据。…

LS-LINUX-002 简易创建SSH

LS-LINUX-002 简易创建SSH 1. CentOS 8 创建和配置SSH服务 1.1 安装SSH服务 CentOS 8 默认已经安装了OpenSSH服务。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo dnf install -y openssh-server1.2 启动SSH服务 安装完成后&#xff0c;需要启动SSH服务…

计算机专业求职面试的常见题目分类整理

以下是计算机专业求职面试的常见题目分类整理&#xff0c;每个大类精选20道高频问题&#xff0c;结合参考内容进行解析与扩展&#xff0c;帮助系统化备考&#xff1a; 一、数据结构与算法 解释时间复杂度和空间复杂度 时间复杂度衡量算法执行时间随输入规模的增长趋势&#xf…

脚本启动 Java 程序

如果你想在后台启动一个 Java 程序&#xff0c;并在终端窗口中显示一个自定义的名字&#xff0c;可以通过编写一个简单的脚本来实现。以下是一个基于 Linux/macOS 的解决方案&#xff0c;使用 Bash 脚本启动 Java 程序&#xff0c;并在终端窗口中显示自定义标题。 示例脚本 创建…

CentOS禁用nouveau驱动

1、验证 nouveau 是否在运行 lsmod | grep nouveau如果命令返回结果&#xff0c;说明 nouveau 驱动正在运行。 2、编辑黑名单文件 通过编辑黑名单配置文件来禁用 nouveau 驱动&#xff0c;这样在系统启动时不会加载它。 vi /etc/modprobe.d/blacklist-nouveau.conf修改以下…

Linux: network: tcpdump: packets dropped by kernel

文章目录 最近遇到一个问题原因libpcap/tcpdump 接口linux/libpcap 接口内核的处理原因可能有以下几种:解决方法:man pcap_stats最近遇到一个问题 tcpdump命令显示有dropped的包,而且是被内核drop的。 [root@-one-01 ~]# tcpdump -i any udp and port 8080 -v -w /root/udp…

WEB安全--提权思路

一、情形 在我们成功上传webshell到服务器中并拿到权限时&#xff0c;发现我们的权限很低无法执行特定的命令&#xff0c;这时为了能做更多的操作&#xff0c;我们就需要提升权限。 二、方式 2.1、Windows提权 1、普通用户执行systeminfo命令获取服务器的基本信息&#xff0…

001 vue

https://cn.vuejs.org/ 文章目录 v-bindv-modelv-on修饰符条件渲染/控制&#xff1a;v-if v-show列表渲染 M&#xff1a;即Model&#xff0c;模型&#xff0c;包括数据和一些基本操作 V&#xff1a;即View&#xff0c;视图&#xff0c;页面渲染结果 VM&#xff1a;即View-Mode…

Tomcat 负载均衡

目录 二、Tomcat Web Server 2.1 Tomcat 部署 2.1.1 Tomcat 介绍 2.1.2 Tomcat 安装 2.2 Tomcat 服务管理 2.2.1 Tomcat 启停 2.2.2 目录说明 2.2.3编辑主页 2.3 Tomcat管理控制台 2.3.1开启远程管理 2.3.2 配置远程管理密码 三、负载均衡 3.1 重新编译Nginx 3.1.1 确…