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

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

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


相关资源:

相关推荐
代码什么用1 小时前
Spring基础使用
java·后端·spring
明月_清风2 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
蜗牛互联网2 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
用户69371750013844 小时前
2026,程序员的时代拐点到了
android·前端·后端
惜鸟5 小时前
从源码看 pi 的上下文管理:原始数据永久保留,模型视角按需裁剪
后端
量化分析码农5 小时前
【Python量化策略评估体系 #05】极端行情扛得住吗?2008/2015/2020 三场景压力测试
后端
十年Java程序媛5 小时前
Java 接口和抽象类对比|Java8 新特性,抛弃老旧八股,正确选型
java·spring boot·后端
IT_陈寒5 小时前
SpringBoot自动配置差点让我加班到凌晨
前端·人工智能·后端
用户8356290780515 小时前
使用 Python 对 Excel 工作表进行排序
后端·python
程序员cxuan5 小时前
腾讯又来一王炸,开源版 WorkBuddy 太夯了!
人工智能·后端·程序员