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/10/9 11:06:01 阅读更多 →
从 curl 到工程封装:iOS 证书与描述文件检测

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

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

2026/10/10 3:38:04 阅读更多 →
Express静态服务器搭建与优化实战指南

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

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

2026/10/10 3:38:04 阅读更多 →

最新新闻

SQLite+FTS5+BM25实现本地AI上下文检索增强(RAG)

SQLite+FTS5+BM25实现本地AI上下文检索增强(RAG)

1. 项目概述:从“context-mode”这个词开始,我们到底在谈什么?“context-mode”这个词乍一看像某个新出的编程模式、IDE插件开关,或是某款AI工具里的隐藏功能标签——但翻遍主流开发文档、VS Code官方设置、JetBrains全家桶配置项…

2026/10/14 9:07:49 阅读更多 →
Qt5 + python-docx 零依赖生成Word文档实战指南

Qt5 + python-docx 零依赖生成Word文档实战指南

简介:本资源是一套面向Qt与Python混合编程初学者及中级开发者的实战项目,聚焦于不依赖Microsoft Office环境下的Word文档读写能力构建。通过Qt5 GUI界面调用python-docx库,实现文档创建、段落编辑、表格插入、图片嵌入及样式控制等核心功能&a…

2026/10/14 9:07:49 阅读更多 →
限流降级实战指南:从算法选型到系统稳定性治理的完整路径

限流降级实战指南:从算法选型到系统稳定性治理的完整路径

1. 从一次线上事故说起:限流降级到底在防什么做后端的人,几乎都经历过那种半夜三点被报警电话叫醒的时刻。上个月我就刚处理过一次:某个核心接口的RT从正常的50ms一路飙到3000ms,紧接着依赖它的上游服务开始超时堆积,然…

2026/10/14 9:07:49 阅读更多 →
一套ERP从需求调研到正式上线的交付流程拆解

一套ERP从需求调研到正式上线的交付流程拆解

杭州管家婆软件(纵横软件杭州杭纵)——本地 28 年企业数字化服务伙伴产品矩阵:管家婆云辉煌系列|财贸系列|分销系列|辉煌小工单(与管家婆同厂出品)|生态圈产品&#xff5…

2026/10/14 9:07:49 阅读更多 →
跨境商业咨询服务的评估体系与技术创新应用

跨境商业咨询服务的评估体系与技术创新应用

1. 行业背景与榜单价值跨境商业咨询服务行业正在经历结构性变革。过去三年间,全球电商渗透率从14%跃升至22%,品牌出海服务市场规模年均复合增长率达到27.3%。这个背景下,专业咨询机构的价值链已经从单纯的战略规划,延伸到本地化运…

2026/10/14 9:07:49 阅读更多 →
SpringBoot体育馆预约系统设计与性能优化实践

SpringBoot体育馆预约系统设计与性能优化实践

1. 项目背景与核心价值体育馆场地预约系统是体育场馆数字化管理的核心工具。过去三年我参与过7个同类系统的开发实施,发现传统电话预约和纸质登记方式存在三大痛点:预约冲突频发(平均每周3-5起)、场地利用率不足(高峰时…

2026/10/14 9:06:48 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →