49487a00e8
fix: ComposeTrace host test 降级(Trace API 未 stub 时静默忽略)
...
androidHostTest 中 android.os.Trace 未提供 stub,调用会抛 RuntimeException。
包装在 try-catch 中,使 host test 能正常执行涉及 trace 的代码路径。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 11:47:16 +08:00
d3befaabec
test: 新增 ShiftPattern、CalendarUtils、CalendarViewModel 单元测试
...
- ShiftPatternTest: 锚点前后、跨周期循环、负天数取模、空 cycle、
单元素 cycle、多样化周期、data class 属性
- CalendarUtilsExtraTest: calculateWeeksCountForPage(跨月/跨年)、
relativeDayDescription(今天/昨天/明天/N天前后/跨年月)、
formatLunarDate(农历前缀/正月初一/多日期验证)
- CalendarViewModelStateTest: 初始状态、selectDate(含 currentMonth/Year 联动)、
increment/decrementYear、selectMonthFromYearView、shiftKindAt、
showLegalHoliday、onDrag/onExpandDrag progress 更新与 clamp、
getMonthDays 与 selectedDate/today 交互
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 11:47:08 +08:00
0d58be45bc
feat: 底部卡片展示选中日期的相对天数、公历与农历信息
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 11:11:53 +08:00
39bb2301d3
refactor: 降低折叠触发阈值从 25% 到 8%
...
COLLAPSE_THRESHOLD 从 0.25f 下调至 0.08f,
使月视图→周视图的折叠更易触发,下拉展开同理。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 10:56:57 +08:00
57f61987df
refactor: 折叠态切换年视图保持折叠形态,移除多余的展开过渡
...
原先折叠态切年视图会先展开回月视图再切换,多了一段冗余动画;
现在折叠态直接以折叠形态参与缩放转场,从年视图返回时仍保留周视图状态。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 10:48:44 +08:00
ba742f1597
build: 启用 R8 压缩与资源优化,添加 ProGuard 规则
...
- androidApp: 启用 isMinifyEnabled 和 isShrinkResources
- androidApp: ABI 过滤(arm64-v8a, armeabi-v7a),关闭 buildConfig
- gradle.properties: 启用并行构建、守护进程、R8 fullMode
- 新建 proguard-rules.pro 保留 KMP/Compose/kotlinx.datetime 规则
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 07:42:29 +08:00
e0b7700306
docs: 添加 Perfetto 性能排查文档;refactor: 缓存 animatable value
...
- DEVELOPMENT.md 新增 Perfetto / Systrace trace 分析指南
- CalendarViewModel.onDrag/onExpandDrag 中缓存 _collapseAnimatable.value
到局部变量,避免在 coroutineScope.launch 闭包中重复读取
- .gitignore 添加 .claude/ 目录
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 00:44:26 +08:00
meyou
24708ed1a1
Merge remote-tracking branch 'refs/remotes/origin/main'
2026-05-18 23:36:29 +08:00
3a0a4f885a
Merge pull request #4 from xunrua/main
...
MiniMonth 纯 Canvas 绘制:消除 96 个 Text 组件的测量开销
2026-05-18 23:30:22 +08:00
meyou
987b965956
MiniMonth 纯 Canvas 绘制:消除 96 个 Text 组件的测量开销
...
trace 显示 TextStringSimpleNode::measure 累计 100+ms,是 measure 阶段
主要开销。MiniMonth 中 12 个标题 Text + 84 个星期标签 Text = 96 个
Text 组件。
修复:
1. YearGridView 中预计算 titleLayouts + weekdayLayouts
2. MiniMonth 改为单个 Canvas 统一绘制标题 + 星期行 + 日期
3. 消除所有 Text 组件,TextStringSimpleNode::measure 归零
2026-05-18 23:29:05 +08:00
promise
3c4bf5b35d
Merge branch 'DefectingCat:main' into main
2026-05-18 23:26:01 +08:00
meyou
c7d1e62aa2
MiniMonth 纯 Canvas 绘制:消除 96 个 Text 组件的测量开销
...
trace 显示 TextStringSimpleNode::measure 累计 100+ms,是 measure 阶段
主要开销。MiniMonth 中 12 个标题 Text + 84 个星期标签 Text = 96 个
Text 组件。
修复:
1. YearGridView 中预计算 titleLayouts + weekdayLayouts
2. MiniMonth 改为单个 Canvas 统一绘制标题 + 星期行 + 日期
3. 消除所有 Text 组件,TextStringSimpleNode::measure 归零
2026-05-18 23:24:11 +08:00
e849943df2
Merge pull request #3 from xunrua/main
...
修复月→年视图切换卡顿:共存渲染 + SolarDay 静态缓存
2026-05-18 23:21:11 +08:00
meyou
25940c8a24
Merge remote-tracking branch 'origin/main'
2026-05-18 23:18:03 +08:00
promise
b85567c84e
Merge branch 'DefectingCat:main' into main
2026-05-18 23:16:59 +08:00
meyou
ed1935c9fb
DayCell SolarDay 静态缓存:避免 Pager 切换时重复创建对象触发 GC
...
每个 DayCell 创建时调用两次 SolarDay.fromYmd() 计算节日/农历信息。
Pager 缓存页的大量 DayCell 同时重建时产生大量临时对象,加剧 GC 压力。
修复:在 DayCell.kt 中增加进程级静态缓存 dayCellInfoCache,按日期缓存
computeDayCellInfo() 的结果。首次计算后永久复用,消除重复对象创建。
2026-05-18 23:12:43 +08:00
meyou
c8ee7f7b44
DayCell SolarDay 静态缓存:避免 Pager 切换时重复创建对象触发 GC
...
每个 DayCell 创建时调用两次 SolarDay.fromYmd() 计算节日/农历信息。
Pager 缓存页的大量 DayCell 同时重建时产生大量临时对象,加剧 GC 压力
(trace 中 Background concurrent mark compact GC 346ms+253ms)。
修复:在 DayCell.kt 中增加进程级静态缓存 dayCellInfoCache,按日期缓存
computeDayCellInfo() 的结果。首次计算后永久复用,消除重复对象创建。
2026-05-18 23:08:20 +08:00
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
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
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
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
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
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
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
917ba2125f
周视图翻页改为 cross-fade 动画,消除切换空白间隙
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 15:33:32 +08:00
741e3de7ff
移除调试日志
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 15:27:57 +08:00
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
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
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
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
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
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
72b591ab49
整理 import 排序和缩进格式
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 14:16:44 +08:00
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
302e6556dd
MonthHeader 年月与周号垂直居中对齐
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:36:23 +08:00
62924eff3e
FAB 固定在屏幕左下角,不再跟随 BottomCard 高度
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 13:29:25 +08:00
02730e54e8
实现缩放动画菜单和 Scrim 关闭
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:54:27 +08:00
5a7d1f1781
更新 KDoc: FAB 菜单切换视图描述
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:53:54 +08:00
a7bf59e42e
添加 FAB 浮动按钮和菜单状态
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:52:48 +08:00
37af18ad8d
实现缩放动画菜单和 Scrim 关闭
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:49:45 +08:00
ff3bd6629d
实现缩放动画菜单和 Scrim 关闭
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:46:43 +08:00
2b0bb7e1d8
移除 MonthHeader 点击切换年视图功能
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 11:41:33 +08:00
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
bad536617d
年视图网格: 改用 spacedBy 统一行列间距,月份顶部对齐
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-18 10:49:38 +08:00
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
17146e2bc0
格式化: import 排序、长行换行、空行规范
...
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 10:10:59 +08:00
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