CalendarYearPage 年视图:12 个月微型日历网格

前言

"海风日记"的年视图页面展示了全年的日历概览,使用 Grid 3 列布局展示 12 个月微型日历,每个微型日历包含月份标题、星期行和日期网格。

本文将从 CalendarYearPage.ets 源码出发,深入讲解年视图的实现。


一、年视图布局

1.1 整体结构

typescript 复制代码
Scroll() {
  Grid() {
    ForEach(this.createIndexArray(12), (monthIndex: number) => {
      GridItem() {
        this.miniCalendar(monthIndex)  // 12 个微型日历
      }
    })
  }
  .columnsTemplate('1fr 1fr 1fr')  // 3 列
  .columnsGap(10).rowsGap(10)
}

1.2 微型日历构建器

typescript 复制代码
@Builder
miniCalendar(monthIndex: number) {
  Column({ space: 4 }) {
    // 月份标题
    Text(this.months[monthIndex])
      .fontSize(13).fontColor(COLOR_TEXT_MAIN).fontWeight(FontWeight.Bold)

    // 星期行
    Row() {
      ForEach(['日','一','二','三','四','五','六'], (d: string) => {
        Text(d).fontSize(8).fontColor(COLOR_TEXT_HINT)
      })
    }

    // 日期网格
    Grid() {
      // 空白偏移
      ForEach(this.createIndexArray(new Date(monthIndex).getDay()), (i) => {
        GridItem() { Column().width('100%').height(18) }
      })
      // 日期
      ForEach(this.createDayArray(new Date(monthIndex + 1, 0).getDate()), (day) => {
        GridItem() {
          Stack() {
            if (isToday) { Circle().width(18).height(18).fill(COLOR_PRIMARY) }
            Text(day.toString()).fontSize(9)
          }
        }
      })
    }
    .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr 1fr')
  }
  .padding(10).backgroundColor(COLOR_CARD_BG)
  .borderRadius(CARD_RADIUS)
  .shadow({ radius: 8, color: 'rgba(160,120,60,0.08)', offsetY: 2 })
}

二、微型日历的尺寸

元素 尺寸 说明
月份标题 13vp 加粗
星期文字 8vp 极小字号
日期数字 9vp 小字号
行高 18vp 紧凑
今日圆点 18vp 橙色

三、年份导航

typescript 复制代码
Row({ space: 4 }) {
  Button() {
    SymbolGlyph($r('sys.symbol.chevron_left')).fontSize(16).fontColor([COLOR_AMBER])
  }
  .onClick(() => { this.curYear -= 1 })

  Button() {
    SymbolGlyph($r('sys.symbol.chevron_right')).fontSize(16).fontColor([COLOR_AMBER])
  }
  .onClick(() => { this.curYear += 1 })
}

四、常见问题

4.1 微型日历显示不全

问题:微型日历中的日期数字显示不全。

原因:Grid 单元格太小,无法容纳所有日期。

解决方案:减小字号(9vp)和行高(18vp)。


总结

本文通过"海风日记"的年视图,深入讲解了微型日历网格的实现:

  1. 3 列 Grid:12 个月按 3×4 排列
  2. 微型日历 Builder:月份标题 + 星期行 + 日期网格
  3. 紧凑布局:小字号、短线高
  4. 年份导航:左右箭头切换年份

下一篇文章将深入讲解 年统计与最长连续天数,敬请期待。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

相关推荐
烂蜻蜓2 小时前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055979 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿10 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_216962909611 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理13 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒13 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构14 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构14 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构14 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常15 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端