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

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

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


相关资源:

相关推荐
Larcher2 小时前
React Router 不只是页面跳转:从 SPA 路由到权限守卫的完整实践
javascript·后端
Larcher2 小时前
大模型为什么每次回答都不一样?一文搞懂 Temperature、Top K 与 Top P
javascript·后端
LucianaiB4 小时前
毕业老学长给我留的最后一句话是:“AI 写的,别挂我名。” 我直接 神(Seed Evolving) 来!助我!
后端
IvanCodes4 小时前
RAG 实战教程(一):RAG 工作原理与完整流程——分片、索引、召回、重排和生成
人工智能·后端·agent
CodeSheep5 小时前
稚晖君公司人事大变动,来了!
前端·后端·程序员
小满zs5 小时前
Go语言第八章(函数)
后端·go
stark张宇7 小时前
实战Go高级特性:Context超时控制、defer资源回收与Channel通信的关键避坑点
后端·go
凤山老林8 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
IT_陈寒9 小时前
Vue的响应式让我原地破防,原来问题出在这
前端·人工智能·后端
思考着亮9 小时前
1.RabbitMQ基本使用
后端