290 Commits

Author SHA1 Message Date
meyou
fab0a5eba8
避免月/年视图切换时整棵树销毁:共存 + Modifier.alpha 控制
Perfetto trace 显示 Compose:onForgotten 耗时 600ms,根因是
if(!isYearView)/if(isYearView) 条件渲染导致整棵子树在切换时被销毁重建。

修复:
1. 月视图和年视图始终共存于组合树中
2. 通过 Modifier.alpha() 控制可见性和触摸事件分发
3. graphicsLayer 仅保留 scale 动画,alpha 移出到 Modifier 层
4. 简化 toggleYearView():移除 withFrameNanos/animJob.join() 的复杂协程逻辑

两个视图通过 yearViewProgress 驱动的交叉淡入淡出同步切换,
消除 onForgotten 的组件销毁开销。
2026-05-18 23:05:07 +08:00
b364c259ff
Merge pull request #2 from xunrua/main
优化月→年视图切换卡顿:Pager 缓存降为 0 + 移除延迟预组合
2026-05-18 23:04:31 +08:00
meyou
9fd877485f
修复月→年视图切换卡顿:Pager 缓存降为 0 + 移除延迟预组合
Perfetto trace 分析发现严重卡顿根因:
- MonthView→YearView 切换耗时 2435ms
- Choreographer#doFrame 单帧超时 4288ms
- compose📟cache_window:keepAroundItems 阻塞 554ms×2
- Compose:onForgotten 组件销毁 600ms

修复:
1. CalendarPager/WeekPager/年视图 Pager 的 beyondViewportPageCount 从 1→0
   月视图缓存页从 3 页(126 DayCell)降至 1 页(42 DayCell)
2. 移除 yearPagerBeyondViewport 延迟预组合机制(不再需要)
2026-05-18 22:49:59 +08:00
meyou
a478ecb1bd
修复月视图首帧行堆叠:rowHeightPx 未就绪时 alpha=0
draw 阶段已读到更新后的 rowHeightPx,但 layout 仍用旧值时会出现行堆叠。
增加 layoutReady 守卫,首帧 rowHeightPx==0 时直接隐藏月视图。
2026-05-18 22:06:58 +08:00
xfy
780a5e70dd 修复折叠态切换年视图:先展开再切换 + AnimatedContent 尺寸瞬切
折叠态下 toggleYearView 不再直接 return,而是先动画展开回月视图再进入年视图;
MonthHeader 的 AnimatedContent 添加 SizeTransform(snap()) 避免内容切换时尺寸动画;
清理未使用的 import。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 18:20:22 +08:00
xfy
40c34f0606 修复点击"今天"按钮标题栏抖动:alpha 渐变替代条件渲染
点击"今天"后 showToday 变为 false,按钮从布局移除导致 Row 高度
跳变 3px(85→82),引起标题栏抖动。改为始终保留按钮在布局中,
用 graphicsLayer alpha + animateFloatAsState 做淡入淡出动画,
clickable(enabled) 控制可点击性,Row 高度不再变化。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 18:06:12 +08:00
xfy
3a3e6014d8 修复年视图缩放动画丢失:progress 提前到重组阶段读取
graphicsLayer { } lambda 在 draw 阶段执行,内部直接读取 viewModel.yearViewProgress
不会被 Compose 标记为可观察状态,导致 Animatable 每帧 value 变化不触发重绘,
动画只在 isYearView 翻转时重组一次然后卡到动画完成。

修复:在 if (isYearView) / if (!isYearView) 块内先读取 progress 为局部变量,
graphicsLayer lambda 通过捕获使用,让 Animatable 变化能驱动重组进而触发重绘。
2026-05-18 17:37:40 +08:00
xfy
a4bd56a8a9 优化月→年视图切换性能(第二轮):延迟预组合 + 缓存提升
- 年视图 beyondViewportPageCount 动画完成后再恢复为 1,消除切换后 283ms onMeasure 阻塞
- MiniMonth 主题色提取到 YearGridView 级别 remember 缓存(72 次 → 1 次读取)
- TextMeasurer 从每 MiniMonth 独立实例改为 YearGridView 共享(12 个 → 1 个)
- 预测量 1-31 × 3 颜色的 TextLayoutResult(93 个缓存),消除 360+ 次 measure() 调用
- 12 个月的 generateMiniMonthDays 在 YearGridView 级别预计算并缓存
2026-05-18 17:05:43 +08:00
xfy
914e882fe1 优化月→年视图切换性能:Canvas 扁平化 + 首帧组合 + 动画交错
- MiniMonth 日期网格改 Canvas 绘制,单页 Composable 从 ~600 降到 ~120
- 年视图 beyondViewportPageCount 首帧 0、首帧后恢复 1,避免一次组合 36 个 MiniMonth
- toggleYearView 先启动动画再翻转 isYearView,月视图缩小与年视图组合交错
- 添加 ComposeTrace 跨平台 trace 工具用于性能分析

MonthView→YearView 总耗时 1732ms → 1033ms (↓40%),首帧 onMeasure 902ms → 129ms (↓86%)
2026-05-18 16:50:13 +08:00
xfy
996d8c104f 修复点击"今天"按钮无动画:scrollToPage 改为 animateScrollToPage
LaunchedEffect(selectedDate) 用无动画的 scrollToPage 抢先跳转,
导致 onToday 里的 animateScrollToPage 被取消。统一由
LaunchedEffect 处理滚动,onToday 只需 selectDate。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 15:43:09 +08:00
xfy
917ba2125f 周视图翻页改为 cross-fade 动画,消除切换空白间隙
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 15:33:32 +08:00
xfy
741e3de7ff 移除调试日志
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 15:27:57 +08:00
xfy
b2284c3986 回退 gridHeightPx/calendarAreaHeightPx/cardHeightPx 的 derivedStateOf
derivedStateOf 导致快照时序问题:cardHeightPx 计算时 gridHeightPx
尚未更新(仍为 0),calendarAreaHeightPx 极小,cardHeightPx 占 96% 屏幕,
BottomCard 遮挡整个日历。改回直接计算确保同一帧内值一致。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 15:23:34 +08:00
xfy
0962d13216 gridHeightPx/calendarAreaHeightPx/cardHeightPx 包裹 derivedStateOf
将依赖 collapseProgress 的中间计算移入 derivedStateOf,
确保只在被读取时才计算,避免不必要的中间对象创建。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 15:06:04 +08:00
xfy
d5b7d2cd8a 预计算固定 dp→px 转换,避免每帧重复 density 计算
cardGapExpandedPx/cardGapCollapsedPx/rowPaddingPx/horizontalPaddingPx
移入 remember,每帧只做一次浮点插值而非完整 density 转换。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 15:04:31 +08:00
xfy
3b3988251a 年视图切换动画计算移入 graphicsLayer lambda 避免重组
monthScale/yearScale/targetAlpha 从 composable body 移入 graphicsLayer lambda,
state 读取只触发 draw-phase redraw 而非重组。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 14:58:16 +08:00
xfy
1ddba1881b 修复 weeks/anchorIndex remember 缓存失效
weeks = days.chunked(7) 每帧创建新列表导致 remember key 变化、缓存失效。
将 weeks 包裹在 remember(days) 中,anchorIndex 缓存才能正确生效。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 14:54:12 +08:00
xfy
5d6b2071e2 行偏移从 offset(Dp) 改为 graphicsLayer(translationY) 避免每帧 layout pass
offset 触发 layout-phase 重测量,trace 中 measure 最高 1266ms。
graphicsLayer 只触发 draw-phase redraw,跳过 layout。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 14:53:11 +08:00
xfy
72b591ab49 整理 import 排序和缩进格式
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 14:16:44 +08:00
xfy
7250d08fb7 年视图标题固定 + 交叉淡入淡出 + 移除 fadeIn/fadeOut
年视图标题行从 HorizontalPager 内移到外部,左右滑动时标题不随 pager 滚动。
年份切换时标题文字用垂直滑动动画(与 MonthHeader 一致,移除 fadeIn/fadeOut)。
月/年视图左右滑动改为交叉淡入淡出,修复原实现中间全白的问题。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 14:14:46 +08:00
xfy
302e6556dd MonthHeader 年月与周号垂直居中对齐
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:36:23 +08:00
xfy
62924eff3e FAB 固定在屏幕左下角,不再跟随 BottomCard 高度
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:29:25 +08:00
xfy
02730e54e8 实现缩放动画菜单和 Scrim 关闭
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:54:27 +08:00
xfy
5a7d1f1781 更新 KDoc: FAB 菜单切换视图描述
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:53:54 +08:00
xfy
a7bf59e42e 添加 FAB 浮动按钮和菜单状态
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:52:48 +08:00
xfy
37af18ad8d 实现缩放动画菜单和 Scrim 关闭
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:49:45 +08:00
xfy
ff3bd6629d 实现缩放动画菜单和 Scrim 关闭
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:46:43 +08:00
xfy
2b0bb7e1d8 移除 MonthHeader 点击切换年视图功能
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:41:33 +08:00
xfy
b877596e72 更新 CLAUDE.md: 修正版本号、补充新增组件和依赖
- compileSdk/targetSdk 36→37, Compose 1.10.3→1.11.0
- 新增 tyme4kt 农历库依赖
- 补充 YearGridView、ShiftPattern、CalendarUtils 说明

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:35:21 +08:00
xfy
bad536617d 年视图网格: 改用 spacedBy 统一行列间距,月份顶部对齐
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 10:49:38 +08:00
xfy
d9326668a4 年视图布局优化: 月份填满视图、加大字号、添加间距
- 4行用 weight(1f) 等分网格区域高度,月份均匀撑高填满视图
- 纵向 Arrangement 从 SpaceEvenly 改为 Top,去掉首行前/末行后大间隙
- 横向 Arrangement 从 SpaceEvenly 改为 SpaceBetween
- 第1行上方加 8dp padding,第4行下方加 8dp padding
- 月份之间横向加 8dp 间距(col0 end=4dp + col2 start=4dp)
- 月份标题字号 9→10sp,星期行 6→8sp,日期数字 6→8sp
- 日期行高 9→12sp,日期行之间加 padding(vertical=2.dp)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 10:42:56 +08:00
xfy
17146e2bc0 格式化: import 排序、长行换行、空行规范
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 10:10:59 +08:00
xfy
3bf05b5077 移除阿里云镜像源,改用默认 Maven Central/Google 仓库
阿里云镜像缺少 tyme4kt 的 iOS klib,导致 iOS 目标无法解析依赖。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 09:16:03 +08:00
647823b66c
Merge pull request #1 from xunrua/main
重构日历折叠动画并修复折叠态下的多个交互问题
2026-05-17 09:02:52 +08:00
meyou
c95f118daf DayCell 关闭默认 ripple,消除选中后残留的灰色状态层
clickable 默认 indication 会在 release 后慢慢淡出灰色波纹,
选中态视觉已由 reveal 圆形动画承担,关闭默认 indication 即可
让点击反馈立即结束,不留灰色残影。
2026-05-16 19:40:47 +08:00
meyou
275fc55c79 选中态动画从 250ms 缩短到 150ms 让圆环填充消失更利落 2026-05-16 19:37:00 +08:00
meyou
6618c1863a 排班在右侧时沿用法定调休样式:surface 底 + 彩色文字
默认布局(showLegalHoliday=false)下,右上角排班从实心胶囊改为
surface 背景圆 + 班=primary/休=error 彩色文字,与开启法定调休
时右上角角标视觉规范一致。左上角(showLegalHoliday=true)保持
实心胶囊样式不变,用于区分两类信息。
2026-05-16 19:32:44 +08:00
meyou
043bd9824b 新增法定调休开关,默认禁用,排班接管右上角
ViewModel 增加 showLegalHoliday 状态,默认 false。
关闭时:排班从左上角移到右上角,不显示法定调休角标。
开启时:回到旧布局,左上角=排班、右上角=法定调休。
DayCell 与各 Pager 透传新参数,预留后续接入设置页。
2026-05-16 19:29:06 +08:00
meyou
ecf4cf601e 新增个人轮班 MVP:左上角胶囊显示班/休
新增 ShiftPattern 数据模型,以锚点日期 + 循环序列描述周期性轮班,与法定调休完全独立。
默认配置 2026-05-15 起 [班,班,休,休] 4 天周期,DayCell 左上角渲染胶囊角标。
2026-05-16 19:12:18 +08:00
meyou
f63b57eef1 角标加 surface 背景咬开描边圆,今日未选中时去掉描边只留 primary 文字
角标(休/班)从只是叠在描边圆之上,改为自带 surface 圆背景:
覆盖身后那段弧,产生"咬开圆环"的视觉断点。

同时 TODAY 状态(今日未被选中)去掉描边圆,文字仍保持 primary 主色,
通过文字颜色标识今天,与选中其他日期时形成更清晰的层次。
2026-05-16 18:56:02 +08:00
meyou
71a3cbc62a 选中态:今天=实心填充,非今天=描边圆,角标置顶不再被遮挡
之前所有选中态都是实心圆,描边圆只用于"今天未选中"。
现改为:今天+选中=primaryContainer 实心填充,普通日期+选中=primary 描边圆,
今天未选中维持细描边。
角标加 zIndex(1f) 提到最上,padding 收紧到 top=1/end=2 紧贴右上角方形空白,
配合描边圆改造,休/班角标在选中态下不再被圆形覆盖。
2026-05-16 18:47:57 +08:00
meyou
aa223db519 年月视图切换时立即移除源视图,仅对目标视图播放缩放动画
之前月↔年切换使用交叉淡入:两层同时合成,源视图渐隐、目标视图渐显。
现改为单向过渡:先翻转 isYearView 让源视图立刻从合成中移除,
withFrameNanos 等一帧后再启动目标视图的 scale/alpha 动画,避免抖动。
2026-05-16 17:42:21 +08:00
meyou
c28eb8d0e5 节日改为只在当天显示,休/班改为右上角角标
之前法定假期的「春节休」之类文本占据了整段假期,把假期里出现
的节气(雨水、惊蛰等)和其他节日全部挤掉。现在拆成两条线:

- 主标注:按 农历节日 → 节气当天 → 公历节日 → 农历日期 的
  优先级,仅在节日/节气当天展示节日名。
- 右上角角标:单独读取法定假期标志,调休「休」为 error 色,
  调休「班」为 primary 色;非当月时整体降低不透明度。

DayCell 外层多包一层 Box 承载 aspectRatio,原内层保留圆形裁
剪与涟漪;角标放在外层 TopEnd,避免被 CircleShape 裁掉。
2026-05-16 17:34:53 +08:00
meyou
889a54db0e 修复折叠周视图跨月日期未置灰的问题
WeekPager 之前把 isCurrentMonth 硬编码成 true,导致折叠状态下
当前周里属于上/下个月的日期没有变灰,与展开月视图的灰显约定不
一致。改为按 selectedDate 的年月判定(与 MonthHeader 显示的
月份一致),保持折叠前后的视觉一致性。
2026-05-16 17:30:51 +08:00
meyou
b730edc1eb 修复首次启动切换年视图无动画问题
通过 withFrameNanos 在动画前预留一帧,让年视图先完成首次合成与
布局,避免 HorizontalPager + YearGridView 的初次合成开销吃掉动
画时间段。与之前的「常驻合成」方案相比,本次只调时序、不动渲染
结构,因此不会再触发年视图层在隐藏时拦截触摸事件的回归。
2026-05-16 17:27:39 +08:00
meyou
c096651e0f Revert "修复首次启动切换年视图无动画的问题"
This reverts commit 216ebbf990555f8282371199b8d1cc4bb86d9b2e.
2026-05-16 17:02:45 +08:00
meyou
216ebbf990 修复首次启动切换年视图无动画的问题
始终组合年视图 HorizontalPager 层(通过 graphicsLayer.alpha=0 隐藏),
避免首次进入时 Pager 组合延迟导致动画首帧丢失。
2026-05-16 16:59:27 +08:00
meyou
142d0c235a 修复年视图布局和动画问题
- 年视图每个小月历添加星期行头部
- 日期列用 weight(1f) 对齐,去掉 CircleShape 裁剪
- 取消前一个动画 Job 防止快速点击时动画丢失
2026-05-16 16:49:10 +08:00
meyou
8dad07c0a0 年视图支持左右滑动切换年份
使用 HorizontalPager 包裹年视图,支持手势滑动切年。
‹ › 按钮改为 animateScrollToPage,与滑动行为一致。
2026-05-16 16:43:32 +08:00
meyou
502f1efc0a Fix year view showing stale year: reset to selectedDate.year on enter 2026-05-16 16:39:58 +08:00