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

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

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


相关资源:

相关推荐
系统集成-鹰翔10 分钟前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
软件技术NINI1 小时前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
Tsuki_tl2 小时前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
后台模板学习2 小时前
Go Web开发中任务调度框架的源码解析与高可用实现方案
开发语言·后端·golang
系统集成-鹰翔2 小时前
ERP对接升级提示数据库迁移失败:SQLite逐版本事务到底回滚到哪一步
javascript·数据库·经验分享·后端
IT_陈寒2 小时前
深入理解SpringBoot:核心原理与最佳实践
前端·人工智能·后端
学长毕设2 小时前
基于SpringBoot的校园礼服租赁系统的设计与实现
java·spring boot·后端
Best_Liu~2 小时前
SpringBoot全局日期格式化
java·spring boot·后端
小蒜学长2 小时前
基于Django+Vue喵汪联盟宠物领养系统的设计与实现(代码+数据库+LW)
后端·python·django·宠物领养系统·流程规范化
Dwzun2 小时前
基于SpringBoot3+Vue3的油莎豆种植管理系统
java·前端·vue.js·spring boot·后端·python·计算机网络