鸿蒙新特性:CalendarPicker 日历组件详解——构建一个日程管理应用
日历是时间管理类应用中最高频的交互界面之一。HarmonyOS NEXT ArkUI 提供了 CalendarPicker 组件以月视图网格的方式展示完整日历支持年份月份滑动切换、日期选中高亮和自定义日期范围。配合事件数据可以轻松构建日程管理、酒店预订、排班管理等场景。本文将深入讲解 CalendarPicker 的核心 API并通过一个完整的日程管理实战案例展示月历视图与事件数据的联动显示。关键词HarmonyOS、ArkUI、CalendarPicker、日历、日程管理、月视图一、CalendarPicker 组件概览CalendarPicker 是 ArkUI 日历时间组件家族中的第三个成员与前两篇文章介绍的 DatePicker 和 TimePicker 不同CalendarPicker 侧重于以月为单位的时间空间可视化。组件交互模式主要用途DatePicker三列滚轮年月日精确日期选择TimePicker两列滚轮时分精确时间选择CalendarPicker月视图网格日期浏览与可视化CalendarPicker 的特点在于一览性——用户不需要滑动滚轮直接在一个月视图网格中看到所有日期及其分布。这对于需要看到某月有哪些日期被占用的场景如日程、排班、预订非常关键。二、CalendarPicker 核心 API2.1 构造函数CalendarPicker({start:Date,// 可选的最早日期end:Date,// 可选的最晚日期selected:Date// 当前选中日期})三个参数与 DatePicker 的构造函数完全一致但组件的视觉呈现完全不同——DatePicker 是滚轮CalendarPicker 是网格。2.2 onChange 回调当用户点击日历网格中的某个日期时onChange被触发返回选中的 Date 对象CalendarPicker({...}).onChange((value:Date){// value 是选中的 Date 对象this.selTimestampvalue.getTime();this.updateEvents(value);})注意onChange的参数类型是Date不是数字时间戳。这与某些其他 ArkUI 组件的回调不同使用时要留意类型匹配。2.3 关键属性属性类型说明.onChange()CallbackDate选中日期变化回调.edgeAlign()CalendarEdgeAlign日期对齐方式.fadeEffect()boolean非当前月日期是否淡化2.4 CalendarEdgeAlign 对齐模式CalendarPicker 支持两种日期对齐模式CalendarEdgeAlign.START日期从左边开始排列CalendarEdgeAlign.END日期从右边开始排列大多数场景使用默认的 START 对齐即可。三、实战日程管理我们实现一个日程管理页面包含CalendarPicker 日历视图按月浏览点击选择日期选中日期信息展示显示选中日期、星期几、当年第几天当日日程列表根据选中日期展示对应的日程事件今天按钮一键跳转回当前日期3.1 事件数据结构事件数据以日期为键MM-DD 格式存储日程的时间、标题和标识颜色interfaceEventItem{date:string;// MM-DDtitle:string;time:string;// 10:00 - 11:30 或 全天color:string;// 左侧色条颜色}privateevents:EventItem[][{date:07-01,title:团队周会 — 产品迭代评审,time:10:00 - 11:30,color:#1677FF},{date:07-03,title:技术分享ArkUI 自定义组件,time:14:00 - 15:00,color:#52C41A},{date:07-07,title:版本 2.5.0 发布上线,time:09:00 - 12:00,color:#FF5722},// ... 更多事件];这个数据结构设计的关键在于date字段使用MM-DD而非完整日期——这样同月同日的事件在不同年份也能匹配同时保持了数据的简洁性。3.2 日期选中处理当用户在日历上点击某个日期时更新选中状态并查询该日期的日程updateSelection(date:Date):void{this.selTimestampdate.getTime();constydate.getFullYear().toString();constm(date.getMonth()1).toString().padStart(2,0);constddate.getDate().toString().padStart(2,0);this.selDateStry.concat(-,m,-,d);constweekdays[周日,周一,周二,周三,周四,周五,周六];this.selWeekdayweekdays[date.getDay()];// 查询当日事件constkeym.concat(-,d);this.selEvents[];for(leti0;ithis.events.length;i){if(this.events[i].datekey){this.selEvents.push(this.events[i]);}}}这里用到的几个关键 JavaScript Date APIdate.getMonth() 1转换为 1-based 月份date.getDay()获取星期几0周日6周六date.getFullYear()获取 4 位年份3.3 当年第几天计算辅助信息展示——计算选中日期是当年的第几天dayOfYear(date:Date):number{conststartnewDate(date.getFullYear(),0,1);returnMath.floor((date.getTime()-start.getTime())/(1000*60*60*24))1;}原理用目标日期的时间戳减去当年 1 月 1 日的时间戳得到毫秒差再换算为天数。加 1 是因为 1 月 1 日是第 1 天而非第 0 天。3.4 CalendarPicker 集成将 CalendarPicker 嵌入页面中指定日期范围和选中日期CalendarPicker({start:newDate(2025,0,1),end:newDate(2027,11,31),selected:newDate(this.selTimestamp)}).onChange((value:Date){this.onCalendarChange(value);})日期范围设置为 2025-2027实际项目中可以根据需求调整。selected通过selTimestamp状态驱动实现今天按钮跳转后的视觉同步。3.5 日程列表渲染根据选中日期动态渲染日程列表每个事件使用左侧色条标识类型if(this.selEvents.length0){Row(){Text(暂无日程安排).fontSize(14).fontColor(#CCCCDD)}.width(100%).height(48).justifyContent(FlexAlign.Center).backgroundColor(#FAFAFC).borderRadius(10)}else{ForEach(this.selEvents,(evt:EventItem){Row(){Row().width(4).height(36).borderRadius(2).backgroundColor(evt.color).margin({right:12})Column(){Text(evt.title).fontSize(14).fontColor(#1a1a2e).fontWeight(FontWeight.Medium).maxLines(1).textOverflow({overflow:TextOverflow.Ellipsis})Text(evt.time).fontSize(11).fontColor(#9999AA)}.alignItems(HorizontalAlign.Start).layoutWeight(1)}.width(100%).padding({top:10,bottom:10,left:12,right:12}).backgroundColor(#FFFFFF).borderRadius(10).margin({bottom:6})},(evt:EventItem,idx:number)idx.toString())}空状态与有数据状态的分支渲染是一个重要的 UX 细节。当选中日期没有日程时不应留白而要明确告知用户暂无日程安排。这种设计让用户确信不是 bug而是这天真的没有安排。3.6 今天按钮一个简单的今天按钮点击后选中日期跳转回当前日期Button(今天).fontSize(13).fontColor(#1677FF).fontWeight(FontWeight.Medium).padding({top:6,bottom:6,left:14,right:14}).borderRadius(14).backgroundColor(#EEF3FF).onClick((){this.goToday();})goToday()调用updateSelection(new Date())同时更新selTimestamp状态CalendarPicker 自动同步选中日期。四、交互流程进入页面CalendarPicker 显示当前月份今天的日期高亮选中日期显示今日信息日程列表展示今日事件浏览月份左右滑动切换月份日历网格更新选择日期点击日历中的某个日期例如 7 月 7 日选中高亮切换下方信息卡片更新为 7 月 7 日的信息日程列表刷新为当日的 1 个事件查看空日期点击没有事件的日期例如 7 月 2 日日程列表显示暂无日程安排返回今天浏览到其他月份后点击今天按钮日历跳回当前月并选中今天五、设计要点总结5.1 数据驱动的日程查询事件数据以MM-DD格式存储查询时直接用字符串拼接匹配。这种设计简单直接适合事件数量在百条以下的场景。对于更大规模的数据数千条可以考虑使用Mapstring, EventItem[]结构优化查询效率。5.2 色条标识日程列表的每个事件使用左侧 4px 宽的色条标识类型——蓝色会议、绿色分享培训、橙红发布重要节点、紫色设计评审、粉色团建活动。色条在视觉上比文字标签更轻量用户扫一眼就能区分事件类型。5.3 空状态处理空状态不是一个边缘情况——对于日程管理来说大多数日期的确是空的。因此空状态的 UI 设计同样重要。使用浅灰底色 居中文字既不被忽略也不抢占视线。六、总结CalendarPicker 是鸿蒙日历时间组件体系中的可视化担当。它不追求精确到分钟的精度那是 TimePicker 的职责也不追求快速输入那是 DatePicker 的特长而是提供一个一览无余的月视图——这正是日程管理、排班预订等场景最需要的。本文通过日程管理这个实战案例覆盖了CalendarPicker 的月视图网格交互onChange回调的类型Date而非number事件数据驱动的高亮与查询空状态与有数据状态的分支渲染今天按钮的状态同步至此鸿蒙日历时间组件三部曲DatePicker、TimePicker、CalendarPicker全部完成。三个组件各司其职组合起来可以构建从日期选择到时间设定再到日历可视化的完整时间交互方案。本文是鸿蒙新特性系列博客的第 19 篇完整代码可在 DevEco Studio 6.1.1 (API 24) 环境中编译运行。Demo 包含 4 个交互点——日历月视图浏览、日期选中与信息展示、日程列表动态渲染、今日按钮跳转——覆盖了日程管理的基础场景。建议读者在此基础上扩展日程添加弹窗表单写入新事件和月份标记在日历网格中显示有事件的日期点作为进阶练习。

相关新闻

技术产品化的鸿沟:从代码能跑到用户愿买的五个维度差距

技术产品化的鸿沟:从代码能跑到用户愿买的五个维度差距

技术产品化的鸿沟:从代码能跑到用户愿买的五个维度差距 一、起点:工程师视角的认知偏差 技术团队常陷入一个推理陷阱:核心算法已跑通 → 产品已成型 → 可以推向市场。但工程验证与产品商业化之间存在一道被低估的鸿沟。 以某团队开发的实时视…

2026/7/6 6:14:50 阅读更多 →
思源宋体完整指南:免费开源字体如何提升你的中文设计品质

思源宋体完整指南:免费开源字体如何提升你的中文设计品质

思源宋体完整指南:免费开源字体如何提升你的中文设计品质 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为寻找高质量的中文字体而烦恼吗?思源宋体这款由A…

2026/7/6 6:12:49 阅读更多 →
华为云 ECS 上部署 Prometheus + Grafana 监控体系

华为云 ECS 上部署 Prometheus + Grafana 监控体系

ECS 规格: **ECS-Monitor** | 2vCPU / 4GiB(s6.medium.2) | Ubuntu 22.04 | 40GiB SSD | 1 | 跑 Prometheus Grafana Alertmanager | | **ECS-Target** | 2vCPU / 2GiB(s6.small.2) | Ubuntu 22.04 | 40GiB SSD | …

2026/7/6 6:10:48 阅读更多 →

最新新闻

多通道信号采集系统设计与PIC24 MCU应用

多通道信号采集系统设计与PIC24 MCU应用

1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与实时处理一直是关键需求。传统方案面临两大痛点:一是通道数量受限,难以扩展;二是高采样率下数据处理压力大。TPAFE0808(8通道模拟前端&…

2026/7/6 7:03:04 阅读更多 →
STM32L073RZ与MIC1557定时器低功耗设计实践

STM32L073RZ与MIC1557定时器低功耗设计实践

1. 定时系统设计背景与核心需求在嵌入式系统开发中,精确的时间控制往往是项目成败的关键因素之一。无论是工业自动化中的设备同步、消费电子中的节能管理,还是物联网设备的数据采集周期,都需要依赖稳定可靠的定时机制。传统解决方案通常直接使…

2026/7/6 7:03:04 阅读更多 →
STM32F042C6与KMX63实现低成本手势控制HMI方案

STM32F042C6与KMX63实现低成本手势控制HMI方案

1. 项目背景与核心目标KMX63与STM32F042C6的组合在嵌入式人机界面开发领域正逐渐成为性价比极高的解决方案。作为一名长期从事工业控制设备开发的工程师,我发现这套组合特别适合需要快速响应且成本敏感的场景。KMX63作为一款六轴运动传感器(三轴加速度计…

2026/7/6 7:01:04 阅读更多 →
番茄小说下载器终极指南:从零开始打造个人数字图书馆的完整解决方案

番茄小说下载器终极指南:从零开始打造个人数字图书馆的完整解决方案

番茄小说下载器终极指南:从零开始打造个人数字图书馆的完整解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 还在为无法离线阅读番茄小说而烦恼吗&#xff…

2026/7/6 6:57:03 阅读更多 →
PCF8591与PIC18F46K80的信号转换系统设计与优化

PCF8591与PIC18F46K80的信号转换系统设计与优化

1. PCF8591与PIC18F46K80的信号转换系统概述在嵌入式系统开发中,模拟信号与数字信号的相互转换是常见需求。PCF8591作为一款集成了ADC和DAC功能的芯片,配合PIC18F46K80这款高性能8位单片机,可以构建一个灵活的信号处理系统。这个组合特别适合…

2026/7/6 6:57:02 阅读更多 →
参数检验 vs 非参数检验:5种常见场景下的选择决策树与Python/SPSS实现

参数检验 vs 非参数检验:5种常见场景下的选择决策树与Python/SPSS实现

参数检验 vs 非参数检验:5种常见场景下的选择决策树与Python/SPSS实现 数据分析的核心任务之一是通过样本数据推断总体特征。在这个过程中,统计检验方法的选择直接影响结论的可靠性。参数检验和非参数检验作为两大主流方法,各自适用于不同的数…

2026/7/6 6:53:01 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻