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

在 HarmonyOS6 中实现 Material Design 3 导航栏

文章目录一、什么是 Material Design 3二、Elevation 层级系统2.1 层级概念2.2 项目中的枚举定义2.3 Elevation 转换为 shadow 参数三、色彩系统3.1 色彩角色定义3.2 浅色与深色两套配色3.3 应用到标签栏四、主题切换4.1 切换逻辑4.2 Elevation 动态调节五、完整标签栏容器总结一、什么是 Material Design 3Material Design 3简称 M3是 Google 的设计系统最新版本。HarmonyOS 有自己的设计语言 HDS但很多开发者仍然选择 M3 风格来获得跨平台视觉一致性。M3 的两个核心机制Elevation层级通过阴影深度表达元素的空间层次阴影越深元素在视觉上悬浮越高Color Roles色彩角色一套完整的色彩命名规范每个颜色都有明确用途浅色/深色主题切换只需换一套色值不用改代码逻辑。二、Elevation 层级系统2.1 层级概念Elevation 用 dp 值表示元素的悬浮高度数值越大阴影越明显0dp 无阴影 贴在背景上 1dp 轻微阴影 轻微抬起 2dp 卡片阴影 卡片级别 4dp 导航阴影 导航栏级别推荐 8dp 弹窗阴影 对话框级别 16dp 模态阴影 全屏模态级别2.2 项目中的枚举定义exportenumMaterialElevation{NONE0,// 0dp - 无阴影RAISED1,// 1dp - 轻微抬起CARD2,// 2dp - 卡片NAVIGATION4,// 4dp - 导航栏底部标签栏推荐值DIALOG8,// 8dp - 对话框MODAL16,// 16dp - 模态窗口}2.3 Elevation 转换为 shadow 参数HarmonyOS 使用shadow属性实现阴影。在MaterialTabItem组件中Elevation 数值按以下公式映射到shadow参数Componentstruct MaterialTabItem{PropisActive:boolean;Proptab:TabItem;PropcolorScheme:MaterialColorScheme;Propelevation:number;// 接收父组件传入的 Elevation 值build(){Column(){// ...图标和文字...}.shadow({// 1dp 约等于 3px 模糊半径radius:this.elevation*3,// Elevation 越高透明度越低阴影越深上限 0.25color:rgba(0, 0, 0,${Math.min(0.05this.elevation*0.02,0.25)}),offsetX:0,offsetY:this.elevation*1.5// 垂直偏移与 Elevation 成正比})}}代码说明radius: elevation * 3让阴影随层级线性扩大层级越高阴影越柔和Math.min(0.05 elevation * 0.02, 0.25)控制阴影透明度设置上限0.25防止阴影过重offsetY: elevation * 1.5让阴影随层级向下偏移模拟光线从上方照射的效果。三、色彩系统3.1 色彩角色定义// entry/src/main/ets/types/TabBarTypes.etsexportinterfaceMaterialColorScheme{primary:ResourceColor;// 主色选中状态背景primaryVariant:ResourceColor;// 主色变体secondary:ResourceColor;// 次要色secondaryVariant:ResourceColor;background:ResourceColor;// 页面背景色surface:ResourceColor;// 卡片/标签栏背景色error:ResourceColor;// 错误色success:ResourceColor;warning:ResourceColor;onPrimary:ResourceColor;// 主色上的文字/图标颜色onSecondary:ResourceColor;onBackground:ResourceColor;// 背景上的文字颜色onSurface:ResourceColor;// 表面色上的文字颜色}代码说明以on开头的颜色表示放在该背景上的前景色。比如onPrimary是放在primary色背景上的文字颜色onSurface是放在surface色背景上的文字颜色。这种命名约定让颜色用途一目了然。3.2 浅色与深色两套配色exportconstMaterialLightColorScheme:MaterialColorScheme{primary:#6200EE,// 深紫色作为主色primaryVariant:#3700B3,secondary:#03DAC6,secondaryVariant:#018786,background:#FAFAFA,surface:#FFFFFF,error:#B00020,success:#4CAF50,warning:#FF9800,onPrimary:#FFFFFF,// 深紫背景上用白色文字onSecondary:#000000,onBackground:#000000,onSurface:#000000,};exportconstMaterialDarkColorScheme:MaterialColorScheme{primary:#BB86FC,// 浅紫色在深色背景上可读性好primaryVariant:#3700B3,secondary:#03DAC6,secondaryVariant:#03DAC6,background:#121212,// 深色背景surface:#1E1E1E,error:#CF6679,success:#81C784,warning:#FFB74D,onPrimary:#000000,// 浅紫背景上用黑色文字onSecondary:#000000,onBackground:#FFFFFF,onSurface:#FFFFFF,};代码说明深色模式下primary从深紫#6200EE换成浅紫#BB86FC原因是深色模式背景很深深紫在其上会显得不清晰onPrimary也相应从白色换为黑色保证对比度。3.3 应用到标签栏// MaterialTabItem 组件中的颜色使用build(){Column(){// 图标颜色选中时用 onPrimary未选中时用 onSurfaceSymbolGlyph(this.isActive?this.tab.activeIcon:this.tab.icon).fontSize(24).fontColor(this.isActive?[this.colorScheme.onPrimary]// 选中主色背景上的文字色:[this.colorScheme.onSurface]// 未选中表面色上的文字色)// 图标缩放动画选中时放大 10%.scale({x:this.isActive?1.1:1,y:this.isActive?1.1:1,}).animation({duration:200,curve:Curve.EaseOut})// 标签文字Text(this.tab.title).fontSize(12).fontColor(this.isActive?this.colorScheme.onPrimary:this.colorScheme.onSurface).fontWeight(this.isActive?FontWeight.Medium:FontWeight.Normal).margin({top:4})// 选中指示条宽度从 0 动画展开到 32Row().width(this.isActive?32:0).height(3).backgroundColor(this.colorScheme.onPrimary).borderRadius(1.5).margin({top:4}).animation({duration:200,curve:Curve.FastOutSlowIn})}.width(64).height(56).backgroundColor(this.isActive?this.colorScheme.primary:Color.Transparent).borderRadius(16)// ...shadow 属性见上文}代码说明选中状态下整个Column背景变为primary色图标和文字颜色切换为onPrimary形成色彩组合一致的选中效果指示条宽度从0到32配合.animation()ArkUI 会自动插值生成展开动画Curve.FastOutSlowIn是 M3 推荐的动画曲线起步快、收尾慢符合物理直觉。四、主题切换4.1 切换逻辑EntryComponentstruct MaterialTabsDemo{StateisDarkMode:booleanfalse;StatecolorScheme:MaterialColorSchemeMaterialLightColorScheme;// 点击主题切换按钮时调用privatetoggleTheme(){// 用 animateTo 包裹状态更新让颜色变化有过渡动画animateTo({duration:300,curve:Curve.EaseInOut},(){this.isDarkMode!this.isDarkMode;this.colorSchemethis.isDarkMode?MaterialDarkColorScheme:MaterialLightColorScheme;});}}代码说明整个颜色方案是一个对象引用切换主题只需把colorScheme指向另一个预设对象所有依赖它的子组件会自动重新渲染。用animateTo包裹赋值操作让颜色变化有平滑过渡。4.2 Elevation 动态调节本项目提供了一个 Elevation 选择器可以实时预览不同阴影深度的效果// Elevation 选择器 UIForEach([{label:0,value:MaterialElevation.NONE},{label:1,value:MaterialElevation.RAISED},{label:2,value:MaterialElevation.CARD},{label:4,value:MaterialElevation.NAVIGATION},{label:8,value:MaterialElevation.DIALOG},],(item:ElevationItem){// ElevationItem 是文件顶部定义的 interfaceText(item.label).fontSize(13).fontWeight(this.elevationitem.value?FontWeight.Medium:FontWeight.Normal).fontColor(this.elevationitem.value?this.colorScheme.primary:this.colorScheme.onSurface).padding({left:8,right:8,top:4,bottom:4}).borderRadius(12).backgroundColor(this.elevationitem.value?this.colorScheme.primary:Color.Transparent).onClick((){animateTo({duration:200},(){this.elevationitem.value;});})})代码说明这里用到了本地定义的interface ElevationItem而不是Recordstring, number原因是 ArkTS 规范禁止在回调函数类型声明处直接使用对象字面量类型必须先声明为具名接口每个 Elevation 选项在点击后通过animateTo使阴影变化有动画效果。五、完整标签栏容器// 底部 Material 标签栏容器Row(){ForEach(this.tabs,(tab:TabItem,index:number){MaterialTabItem({isActive:this.currentIndexindex,tab:tab,colorScheme:this.colorScheme,elevation:this.elevation}).onClick((){this.switchTab(index);})})}.width(100%).height(64).padding({bottom:8}).backgroundColor(this.colorScheme.surface)// 标签栏背景用 surface 色.justifyContent(FlexAlign.SpaceEvenly).shadow({radius:12,// 深色模式下阴影更深浅色模式下更轻color:this.isDarkMode?rgba(0, 0, 0, 0.4):rgba(0, 0, 0, 0.08),offsetX:0,offsetY:-4// 向上偏移阴影出现在标签栏顶部边缘}).expandSafeArea([SafeAreaType.SYSTEM],[SafeAreaEdge.BOTTOM])代码说明offsetY: -4让阴影出现在标签栏上方产生内容从下方滑入的层次感深色模式下阴影透明度从0.08提高到0.4因为深色背景上浅色阴影几乎不可见。总结Material Design 3 的精髓在于系统性颜色不是随手选的而是有角色分工阴影不是装饰性的而是有层级含义。在 HarmonyOS 里把这套规范落地核心工作就两件事——把 Elevation 映射成shadow参数把色彩角色映射成一个可以整体切换的配色对象。把这两个部分搭建好之后浅色/深色主题切换、阴影层级调整都只是换一个变量的事整个代码结构会变得非常清晰好维护。

相关文章:

在 HarmonyOS6 中实现 Material Design 3 导航栏

文章目录一、什么是 Material Design 3?二、Elevation 层级系统2.1 层级概念2.2 项目中的枚举定义2.3 Elevation 转换为 shadow 参数三、色彩系统3.1 色彩角色定义3.2 浅色与深色两套配色3.3 应用到标签栏四、主题切换4.1 切换逻辑4.2 Elevation 动态调节五、完整标…...

关键指标自动提取(使用千问)

办公表格中通常包含海量数据,但核心决策仅需聚焦少数关键指标,如毛利率、达成率、增长率。千问可基于业务场景,自动识别并计算核心指标,避免数据冗余导致的决策低效。1.常用关键指标类型业务运营指标:销售额、成交量、…...

如何用3步实现效率突破:开源智能工具重构网盘资源获取体验

如何用3步实现效率突破:开源智能工具重构网盘资源获取体验 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字化信息爆炸的时代,获取网络资源已成为日常工作和学习的必备技能。然而,面对…...

数据关联性与趋势发现(使用千问)

数据关联性与趋势是数据洞察的核心,但人工分析需手动计算、绘制图表,且易受主观因素影响。千问可通过“数据建模模式识别”,自动挖掘数据间的隐藏关联,识别趋势类型与变化节点。实操框架与步骤如下:(1&…...

SAP ABAP接口开发避坑:JSON数据里的回车换行符怎么处理才不报错?

SAP ABAP接口开发实战:JSON数据中隐形字符的精准处理方案 当ABAP开发者构建与外部系统的数据交互接口时,JSON格式已成为现代系统集成的通用语言。然而,那些隐藏在数据流中的控制字符——比如回车(CR)、换行(LF)、制表符(TAB)——往往成为接口…...

使用FCM进行编码解码Python实现代码

文章目录代码整体结构第 1 部分:生成二维合成数据固定随机种子means中心位置covs形状sizes点数生成数据裁剪到[0,1]第 2 部分:初始化隶属度矩阵为什么要按列归一化?这一步的意义第 3 部分:更新聚类中心第 4 部分:计算距离&#x…...

RPC项目

KrpcProvider的Run()整体理解服务端(RPC Provider)将自身提供的「服务 方法」注册到 ZooKeeper;客户端(RPC Consumer)调用服务前,先去 ZooKeeper 查对应「服务方法」绑定的 IP:Port;客户端拿到…...

FreeCAD 六角扳手建模教程

1. 新建实体 打开 FreeCAD,进入 Part Design 工作台。点击 “创建新零件” 或点击 “新建实体” 按钮。2. 新建草图 在实体激活状态下,点击 “创建草图”。 在弹出的对话框中选择一个基准平面(如 XY 平面),然后点击 OK…...

技术文档写作风格 - 图形

1. 图形类型 1.1 架构图子类型适用场景核心元素系统架构图展示系统整体结构模块、层次、交互关系部署架构图展示物理或逻辑部署服务器、网络、存储、地域数据架构图展示数据流转与存储数据源、处理节点、存储、流向✅ 正确示例:系统架构图应清晰展示接入层、业务层、…...

用STM32和RC522做个智能门禁:从硬件接线到代码调试的保姆级教程

用STM32和RC522打造智能门禁系统:从硬件搭建到软件调试全流程 1. 项目概述与核心组件 在物联网技术快速发展的今天,智能门禁系统已经成为现代安防领域的重要组成部分。基于STM32微控制器和RC522射频识别模块的解决方案,以其高性价比和可靠性能…...

real-anime-z应用场景:动漫社团微信公众号推文配图自动化生成流程

real-anime-z应用场景:动漫社团微信公众号推文配图自动化生成流程 1. 引言:动漫社团的配图痛点 运营动漫社团微信公众号的小伙伴们,是否经常遇到这样的困扰: 每周需要制作大量推文配图,但社团美编人手有限原创插画成…...

五子棋游戏开发详解:基于鸿蒙Electron框架和HTML5 Canvas

欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/ 开源atomgit仓库地址: https://atomgit.com/feng8403000/wuziqi 演示效果 项目背景 五子棋是一种古老而经典的策略棋类游戏,深受人们喜爱。在现代数字化时代,将传统游戏搬…...

基于鸿蒙Electron框架的文字战斗系统开发详解

欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/ atomgit开源仓库地址: https://atomgit.com/feng8403000/TextPK 示例效果 项目背景 在游戏开发中,战斗系统是一个核心组件,它直接影响游戏的可玩性和趣味性。传统的战斗系…...

鸿蒙 Electron 跨平台应用开发:文字游戏中的大魔王参战影响的战局走向

欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/ atomgit开源仓库地址: https://atomgit.com/feng8403000/TextAddHero 示例效果 具体效果可以观看开源仓库的GIF,CSDN只能5M,atomgit可以正常显示大的GIF 项目背景 在游…...

智能体可观察性:日志追踪与任务回溯

智能体可观察性:日志追踪与任务回溯 标题选项 从“黑箱”到“白窗”:LLM智能体生产化的核心——日志追踪与任务回溯实战指南告别智能体的“失控”时刻:手把手教你构建全链路可观察性系统DevOps AIOps:智能体日志追踪与任务回溯…...

基于鸿蒙Electron框架的碰撞效果测试与战斗系统——实战模拟

欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/ atomgit开源仓库地址: https://atomgit.com/feng8403000/BattleSimulator 示例效果 项目背景 在游戏开发中,碰撞检测和战斗系统是两个核心组件。碰撞检测负责检测物体之间的交互&…...

别再只懂线性了!用Van der Pol方程和庞加莱图,带你直观理解‘自激振动’与‘混沌’

非线性动力学的艺术:从自激振动到混沌的视觉探索 想象一下,当你轻轻推动一个秋千,它会逐渐停下来——这是线性系统的典型行为。但如果秋千不仅不停下,反而越荡越高,最终稳定在一个固定幅度上,这就是非线性…...

Producer 视频下载 API 集成指南

在数字音乐时代,视频和音频的结合为用户提供了丰富的体验。Ace Data Cloud 提供了 Producer API,允许我们下载与歌曲相关的视频。本文将为您详细讲解如何集成此 API。 简介 Producer API 是 Ace Data Cloud 的一部分,专注于音频相关的内容管…...

别再死记硬背PDR/PPDR了!用这个‘攻防时间赛跑’比喻,5分钟搞懂网络安全核心模型

用“攻防赛跑”故事轻松掌握PDR/PPDR安全模型 想象一下,你正在参加一场特殊的田径比赛——不过这场比赛的主角不是运动员,而是安全工程师和黑客。赛道上的每个环节都对应着网络安全的关键时刻:防护措施是起跑线上的障碍物,检测系统…...

AI Agent的抗干扰能力:复杂环境下的决策稳定性设计

AI Agent的抗干扰能力:复杂环境下的决策稳定性设计 副标题:从理论到实践,构建鲁棒性强的智能体系统 第一部分:引言与基础 1. 摘要/引言 问题陈述:在现实世界的复杂环境中部署AI Agent时,我们常常面临一个令人头疼的挑战:环境干扰。这些干扰可能来自传感器噪声、不完美…...

告别黑窗口:用QT+STKX为你的航天仿真软件做个现代化GUI界面(实战分享)

告别黑窗口:用QTSTKX为你的航天仿真软件做个现代化GUI界面(实战分享) 航天仿真领域长期被命令行工具主导,黑窗口里闪烁的光标和密密麻麻的参数让非专业用户望而生畏。STK作为行业标杆工具,其强大的计算引擎往往被埋没在…...

使用爱毕业(aibiye),数学建模论文的复现和排版优化不再是难题

AI工具在数学建模论文复现与排版中能大幅提升效率。通过评测10款热门AI论文助手发现,部分工具可自动生成LaTeX代码、优化公式排版,甚至能基于草图快速复现复杂模型。智能改写功能可避免查重问题,而文献管理模块能自动整理参考文献格式。针对时…...

**TEE安全环境下的可信执行流程实现与代码解析**在现代计算体系中,**可信执行环境(Trusted Execution Envi

TEE安全环境下的可信执行流程实现与代码解析 在现代计算体系中,可信执行环境(Trusted Execution Environment, TEE) 已成为保护敏感数据和关键逻辑的核心技术之一。尤其是在移动支付、身份认证、隐私计算等场景下,如何在非受信操作…...

通过爱毕业(aibiye),用户可以智能优化数学建模论文的复现与排版

AI工具在数学建模论文复现与排版中能大幅提升效率。通过评测10款热门AI论文助手发现,部分工具可自动生成LaTeX代码、优化公式排版,甚至能基于草图快速复现复杂模型。智能改写功能可避免查重问题,而文献管理模块能自动整理参考文献格式。针对时…...

**RPA自动化实战:用Python实现企业流程智能化改造**在当今数字化转型浪潮中,**

RPA自动化实战:用Python实现企业流程智能化改造 在当今数字化转型浪潮中,RPA(Robotic Process Automation) 已成为提升运营效率、降低人力成本的关键技术。不同于传统脚本工具,RPA强调“模拟人工操作”,可无…...

ROS Action从入门到精通:一个自定义Timer.action的完整开发、编译与调试避坑指南

ROS Action深度实战:从Timer.action开发到高级调试技巧全解析 在机器人开发中,任务执行往往需要长时间运行且状态可监控。想象一下让机器人移动到指定位置的任务——如果使用传统的服务调用,开发者无法获知移动进度,也无法中途取消…...

7个技巧彻底释放你的硬件潜能:原神帧率解锁工具深度解析

7个技巧彻底释放你的硬件潜能:原神帧率解锁工具深度解析 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 当你的显卡和显示器都支持144Hz甚至更高刷新率,而游戏却被…...

RS-485 以太网 CAN总线 应用场景差异

结论RS‑485:低成本、远距离、低速、半双工、简单工控,小设备点对点 / 小组网CAN 总线:多主、抗干扰、高可靠、实时性强,汽车、工业现场总线首选以太网:高速、大带宽、通用互联,大数据、远程、IT/OT 融合、…...

3个核心痛点解决方案:为什么Dev-CPP仍是C++初学者的最佳选择

3个核心痛点解决方案:为什么Dev-CPP仍是C初学者的最佳选择 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 在当今C开发工具百花齐放的时代,面对Visual Studio的庞大体积、VS Code的…...

串口电平标准及设计原理

串口通信的本质是传输“0”和“1”的电信号,但不同的标准对这两个逻辑状态的定义(电压范围、表示方式)完全不同。最核心的三个标准是:TTL、RS-232 和 RS-485。一、三大核心标准详解1. TTL(晶体管-晶体管逻辑&#xff0…...