HarmonyOs应用《重要日》开发第15篇 - 自定义颜色选择器的实现
本文深入解析 ImportantDays 项目中的颜色选择器系统包括 16 种预设颜色的设计考量、颜色选择器的 UI 实现、实时预览效果、颜色在各场景中的应用列表卡片、日历标记、日期文字以及颜色与倒数/正数模式的联动设计。一、颜色系统概述ImportantDays 为每个重要日提供 16 种预设颜色颜色贯穿应用的各个角落颜色选择器添加/编辑弹窗 ↓ selectedColor ├── 列表卡片色条ImportantDayPage ├── 日历月视图圆点MonthWeekCalendar ├── 日历月视图日期文字MonthWeekCalendar ├── 日历年视图标记点BaseCalendar ├── 日历年视图日期文字BaseCalendar ├── 倒数/正数按钮背景色 └── 预览方块背景色二、预设颜色定义exportconstPRESET_COLORS:string[][#FF6B6B,// 红色#4ECDC4,// 青色#45B7D1,// 蓝色#FFA07A,// 浅鲑鱼色#98D8C8,// 薄荷绿#F7DC6F,// 黄色#BB8FCE,// 紫色#85C1E2,// 天蓝#F8B739,// 橙色#52BE80,// 绿色#EC7063,// 珊瑚红#5DADE2,// 浅蓝#48C9B0,// 翡翠#F4D03F,// 金色#AF7AC5,// 兰花紫#85929E// 灰色];颜色分类分类颜色十六进制暖色系红色#FF6B6B浅鲑鱼色#FFA07A橙色#F8B739黄色#F7DC6F金色#F4D03F珊瑚红#EC7063冷色系青色#4ECDC4蓝色#45B7D1天蓝#85C1E2浅蓝#5DADE2翡翠#48C9B0薄荷绿#98D8C8绿色#52BE80紫色系紫色#BB8FCE兰花紫#AF7AC5中性色灰色#85929E设计考量16 色刚好4×4 网格完美排列不多不少柔和色调所有颜色都偏柔和避免高饱和度刺眼区分度高相邻颜色差异明显易于辨认情感覆盖暖色表达热情/期待冷色表达平静/理性紫色表达神秘/特殊三、默认颜色exportconstDEFAULT_COLOR#FF6B6B;默认颜色为红色#FF6B6B也是应用的主题色。选择红色作为默认值的原因红色是最引人注目的颜色适合大多数重要日场景生日、纪念日等与应用整体设计风格一致四、颜色选择器 UI 实现预览区域Row(){Stack({alignContent:Alignment.Center}){Column().width(40).height(40).backgroundColor(this.selectedColor).borderRadius(8)Text(this.isCountdown?倒:正).fontSize(14).fontWeight(FontWeight.Bold).fontColor(#FFFFFF)}.width(40).height(40)Text(this.selectedColor).fontSize(12).fontColor(#999999).margin({left:8})}预览效果┌──────┐ #FF6B6B │ 倒 │ └──────┘40×40vp 的圆角方块背景色为选中颜色中央显示倒或正字白色粗体右侧显示十六进制颜色值颜色网格Flex({wrap:FlexWrap.Wrap}){ForEach(PRESET_COLORS,(color:string,index:number){Stack({alignContent:Alignment.Center}){Circle({width:32,height:32}).fill(color)if(this.selectedColorcolor){Text(✓).fontSize(16).fontColor(#FFFFFF).fontWeight(FontWeight.Bold)}}.width(36).height(36).margin({right:8,bottom:8}).onClick((){this.selectedColorcolor;})})}网格布局使用Flex({ wrap: FlexWrap.Wrap })实现自动换行每个色块 32×32vp 的圆形外层 36×36vp留出点击区域间距右 8vp下 8vp选中标记if(this.selectedColorcolor){Text(✓).fontSize(16).fontColor(#FFFFFF).fontWeight(FontWeight.Bold)}选中的颜色圆点中央显示白色 ✓ 标记清晰指示当前选择。交互行为点击颜色圆点 →this.selectedColor color→ 预览区域实时更新 → 倒数/正数按钮背景色更新。五、颜色在列表卡片中的应用卡片色条// ImportantDayPage 中的卡片Stack({alignContent:Alignment.Center}){Column().width(56).height(70).backgroundColor(day.color)// 重要日颜色作为色条.borderRadius({topLeft:8,bottomLeft:8})Column(){Text(this.getDaysNumber(day)).fontSize(22).fontWeight(FontWeight.Bold).fontColor(#FFFFFF)Text(day.isCountdown?倒数:正数).fontSize(10).fontColor(#FFFFFFCC)}}视觉效果┌─────┬──────────────────────────┐ │ │ 妈妈生日 │ │ 30 │ 2026年08月15日 │ │ 倒数 │ 还有 29 天 │ └─────┴──────────────────────────┘左侧色条使用重要日颜色天数数字和倒数文字显示在色条上方白色。六、颜色在日历月视图中的应用颜色圆点if(this.hasImportantDay(dateModel)){Row(){ForEach(this.getImportantDays(dateModel).slice(0,3),(day:ImportantDay){Circle({width:5,height:5}).fill(day.color)// 每个重要日的颜色.margin({right:2})})}.height(6).margin({top:2})}日期文字颜色privategetDayTextColor(dateModel:DateModel):string{if(this.vm.isDateSelect(dateModel.dayjsObj))return#FFFFFF;if(!dateModel.isCurrentMonth)return#CCCCCC;if(this.vm.isToday(dateModel.dayjsObj))returnthis.selectedColor;if(this.hasImportantDay(dateModel)){returnthis.getFirstDayColor(dateModel);// 重要日颜色}return#333333;}标题预览颜色Text(this.getFirstDayShortText(dateModel)).fontSize(8).fontColor(this.getFirstDayColor(dateModel))// 重要日颜色日历中的视觉效果┌────────┐ │ 15 │ ← 日期数字使用重要日颜色 │ ● ● │ ← 圆点使用各自重要日的颜色 │ 妈妈生日│ ← 标题预览使用第一个重要日的颜色 └────────┘七、颜色在日历年视图中的应用标记圆点if(this.hasImportantDay(dateModel)){Circle({width:4,height:4}).fill(this.getFirstDayColor(dateModel)).position({x:50%,y:2})}日期文字颜色privategetDayColor(dateModel:DateModel):string{if(!dateModel.isCurrentMonth)return#CCCCCC;if(this.vm.isToday(dateModel.dayjsObj))return#FF6B6B;if(this.hasImportantDay(dateModel)){returnthis.getFirstDayColor(dateModel);}return#333333;}年视图中的视觉效果┌─────┐ │ •15 │ ← 小圆点 日期数字都使用重要日颜色 └─────┘八、颜色与倒数/正数的联动按钮背景色Button(倒数 (还有X天)).fontColor(this.isCountdown?#FFFFFF:#666666).backgroundColor(this.isCountdown?this.selectedColor:#F5F5F5).onClick((){this.isCountdowntrue;})Button(正数 (已过X天)).fontColor(!this.isCountdown?#FFFFFF:#666666).backgroundColor(!this.isCountdown?this.selectedColor:#F5F5F5).onClick((){this.isCountdownfalse;})联动效果当用户选择不同颜色时选中状态的按钮背景色立即更新选择红色 #FF6B6B: ┌──────────────┐ ┌──────────────┐ │ 倒数(还有X天) │ │ 正数(已过X天) │ │ 白字红底 │ │ 灰字灰底 │ └──────────────┘ └──────────────┘ 切换为蓝色 #45B7D1: ┌──────────────┐ ┌──────────────┐ │ 倒数(还有X天) │ │ 正数(已过X天) │ │ 白字蓝底 │ │ 灰字灰底 │ └──────────────┘ └──────────────┘九、颜色在日历页卡片中的应用// CalendarPage 中的当日重要日卡片Row(){Column().width(4).height(40).backgroundColor(day.color)// 颜色条.borderRadius(2).margin({right:8})Column(){Text(day.title)Text(${DateUtil.getFullDateStr(day.targetDate)}·${day.getDisplayText()})}Text(day.isCountdown?倒数:正数).fontColor(day.isCountdown?#FF6B6B:#4ECDC4).backgroundColor(day.isCountdown?#FFF0F0:#E8FAF8)}倒数/正数标签颜色模式文字颜色背景颜色倒数#FF6B6B红#FFF0F0浅红正数#4ECDC4青#E8FAF8浅青十、颜色一致性的保证存储格式统一// 存储为十六进制字符串Tracecolor:string;// 构造函数默认值color:string#FF6B6B使用方式统一// 所有场景都直接使用字符串.backgroundColor(day.color).fill(day.color).fontColor(day.color)ArkUI 的颜色 API 统一接受十六进制字符串无需额外转换。十一、颜色选择器的交互体验实时预览链路用户点击颜色圆点 ↓ this.selectedColor color ↓ Local 变化 ↓ 预览方块背景色更新 ↓ 倒数/正数按钮背景色更新 ↓ 颜色值文本更新 ↓ 选中标记 ✓ 移动到新颜色所有更新都是实时的用户可以立即看到颜色效果无需点击保存才预览。十二、扩展性设计支持自定义颜色当前只支持预设颜色未来可以扩展自定义颜色选择器// 概念性扩展ColorPicker().onSelect((color:string){this.selectedColorcolor;})颜色分类可以为颜色添加分类标签interfaceColorOption{color:string;category:warm|cool|neutral;name:string;}颜色记忆可以记录用户最常用的颜色在颜色选择器中优先显示。十三、总结ImportantDays 的颜色系统设计16 色精心选择覆盖暖/冷/紫/中性四大色系全局一致性同一颜色贯穿卡片、日历、预览等所有场景实时预览颜色选择即时反馈提升用户体验联动设计颜色与倒数/正数模式联动增强视觉关联多级标记日历中通过圆点文字颜色双重标记重要日颜色不仅是视觉装饰更是信息传递的重要手段——用户一眼就能通过颜色识别不同的重要日。

相关新闻

OpenCore Legacy Patcher技术深度探索:如何让老Mac重获新生的完整指南

OpenCore Legacy Patcher技术深度探索:如何让老Mac重获新生的完整指南

OpenCore Legacy Patcher技术深度探索:如何让老Mac重获新生的完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 在苹果生态系统中&#xff…

2026/7/28 18:32:48 阅读更多 →
从 curl 到工程封装:iOS 证书与描述文件检测

从 curl 到工程封装:iOS 证书与描述文件检测

适用场景 在 iOS 持续集成与证书管理流程中,开发者经常需要手动检查 .p12 证书和 .mobileprovision 描述文件是否匹配、是否即将过期、以及授权权限是否满足需求。以下场景迫切需要这种自动化检测能力: CI/CD 流水线:打包前验证证书与描述文…

2026/7/28 14:47:40 阅读更多 →
Express静态服务器搭建与优化实战指南

Express静态服务器搭建与优化实战指南

1. 项目概述:Express静态服务器的核心价值十年前我刚接触Node.js时,手动处理HTTP请求头写到怀疑人生,直到发现了Express这个神器。它就像给Node.js装上了自动挡变速箱,特别是对于静态资源托管这种基础需求,原本需要几十…

2026/7/27 4:44:50 阅读更多 →

最新新闻

STM32定时器PWM驱动电子琴:从GPIO输入到音频输出的嵌入式综合实践

STM32定时器PWM驱动电子琴:从GPIO输入到音频输出的嵌入式综合实践

1. 项目缘起:从按键到音符的跨越 很多朋友刚开始玩STM32,都是从点灯开始的,紧接着就是按键控制。当你熟练掌握了GPIO的输入输出,看着LED随着按键的按下而明灭,成就感是有的,但总觉得少了点意思——这和我们…

2026/7/30 4:00:34 阅读更多 →
OpenClaw智能助手:从零基础到企业级应用的AI工具指南

OpenClaw智能助手:从零基础到企业级应用的AI工具指南

1. OpenClaw项目概述:从技术极客到大众工具的进化OpenClaw(小龙虾)这个项目最初在开发者社区引发17万人围观时,还只是一个需要复杂命令行操作的技术Demo。经过三个月的迭代,开发团队终于发布了"傻瓜版"解决方…

2026/7/30 4:00:34 阅读更多 →
终极Windows Syslog服务器:可视化日志监控完整指南

终极Windows Syslog服务器:可视化日志监控完整指南

终极Windows Syslog服务器:可视化日志监控完整指南 【免费下载链接】visualsyslog Syslog Server for Windows with a graphical user interface 项目地址: https://gitcode.com/gh_mirrors/vi/visualsyslog 在今天的网络环境中,Windows Syslog服…

2026/7/30 4:00:34 阅读更多 →
西门子S7-1200与SEW变频器Profinet通信实战

西门子S7-1200与SEW变频器Profinet通信实战

1. 项目概述:工业自动化中的Profinet通信控制在工业自动化领域,PLC与变频器的高效通信是实现精准运动控制的基础。这次我们要探讨的是西门子S7-1200 PLC与SEW MC07B系列变频器通过Profinet协议实现的通信控制方案。这种组合在包装机械、输送线、物料处理…

2026/7/30 4:00:34 阅读更多 →
JavaScript中Math.min与Math.max的深度解析与实战应用

JavaScript中Math.min与Math.max的深度解析与实战应用

1. 从两个看似简单的函数说起如果你写过几行JavaScript代码,那么Math.min()和Math.max()这两个函数对你来说肯定不陌生。它们看起来太简单了,简单到很多开发者,包括一些有几年经验的,都觉得自己已经完全掌握了——不就是在一堆数字…

2026/7/30 3:59:34 阅读更多 →
Python图像处理:傅里叶变换与频率域滤波实战指南

Python图像处理:傅里叶变换与频率域滤波实战指南

1. 项目概述:从像素到频率的视角转换搞图像处理,如果你还停留在“这个像素是啥颜色,那个像素怎么改”的层面,那可能还没摸到真正的门道。我干了这么多年,发现很多朋友在处理图像去噪、边缘增强或者模糊效果时&#xff…

2026/7/30 3:59:34 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻