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. 年份导航:左右箭头切换年份

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

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


相关资源:

相关推荐
回家路上绕了弯9 小时前
AI 编程助手为什么反复读取同一份上下文?如何减少无效重复
后端
Lost of 程序猿9 小时前
用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录
后端·c#·asp.net
名字还没想好☜10 小时前
Spring Boot 优雅停机实战:等在途请求处理完再退出,配合 K8s preStop 别丢请求
java·后端·spring
摇滚侠10 小时前
《Spring Boot 3:高级与架构设计》第 1 章 Bean 与 BeanDefinition 个人理解 2
java·spring boot·笔记·后端
IT_陈寒10 小时前
Redis主从切换竟让业务卡了3秒?这个坑我替你踩了
前端·人工智能·后端
右耳朵猫AI10 小时前
Java周刊2026W38 | Micronaut 修补三漏洞、JDK 27 提速 54%、Jetty 修复抖动测试
java·后端·spring
步行cgn10 小时前
BeanFactory 与 FactoryBean 的区别:面试深度解析
java·后端·spring
mldong11 小时前
一套审批流要写多少代码:13 个框架的接入 diff 我数了一遍,最少 422 行,最多 1798 行
后端·架构
GreenTea19 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
码事漫谈19 小时前
FDE:一个缩写,两种命运
后端