|
|
9d0d8bbfb0
|
Merge pull request #5 from xunrua/main
预测性返回
|
2026-05-20 00:14:14 +08:00 |
|
meyou
|
6ef51a4879
|
refactor: 迁移至官方 PredictiveBackHandler,移除 navigationevent-compose 依赖
使用 androidx.activity.compose.PredictiveBackHandler (Flow<BackEventCompat> 模式)
替换 JetBrains NavigationBackHandler,提升设备兼容性。
|
2026-05-19 23:47:29 +08:00 |
|
meyou
|
6542362f6f
|
fix: 预测性返回兼容性、跟手感与防重入
- 添加 BackHandler 降级,确保 OPPO/ColorOS 等设备基本返回可用
- handleBack 加 isHandlingBack 防重入,避免双 handler 触发
- 完成动画改用 spring 替代 tween,根据手势释放位置自然调速
- dismiss/reveal 变换使用二次缓动(progress²),小幅滑动更柔和跟手
|
2026-05-19 23:35:43 +08:00 |
|
meyou
|
4219527428
|
fix: 修复预测性返回手势失效和结束闪屏
- 移除 enabled 条件中的 backProgress == 0f,该条件在手势开始时
会立即禁用 handler 导致系统直接执行返回
- 将 handleBack 结尾的 snapTo(0f) 改为 animateTo(0f, tween(100))
避免进度瞬间跳变引起的闪屏
|
2026-05-19 23:20:42 +08:00 |
|
meyou
|
911b8f2293
|
fix: 返回动画结束时 alpha 完全归零,消除闪屏
|
2026-05-19 22:34:02 +08:00 |
|
meyou
|
bde143a25b
|
feat: 迁移 NavigationBackHandler + 替换应用图标
- 将 PredictiveBackHandler 迁移到 NavigationBackHandler (navigationevent-compose 1.0.1)
- 添加 org.jetbrains.androidx.navigationevent:navigationevent-compose 依赖
- 提取 applyDismissTransform/applyRevealTransform/applyEnterTransform 辅助函数
- 替换所有密度的启动图标和关于页图标
- 移除旧的自适应图标 XML 配置
|
2026-05-19 22:24:26 +08:00 |
|
meyou
|
bde922080a
|
feat: 预测性返回动画 — Box 分层布局替换 AnimatedContent
- 用 Box 三层堆叠替代 AnimatedContent,底层页面始终可见
- 返回手势跟手驱动顶层页面滑移+缩放+圆角+阴影,底层同步放大显现
- Animatable 驱动手势提交/取消的平滑过渡动画
- 前向导航从右侧滑入,底层页面同步缩小
|
2026-05-19 21:12:02 +08:00 |
|
promise
|
7fc333eef4
|
Merge branch 'DefectingCat:main' into main
|
2026-05-19 20:03:44 +08:00 |
|
|
|
e5ce11128a
|
style: 代码清理 — 移除未使用的 import 和变量
- Platform.android.kt: 移除未使用的 kotlinx.coroutines.launch import
和未使用的 scope 变量
- CalendarMonthView.kt: 移除未使用的 density 变量
- App.kt: 格式化缩进
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 18:29:41 +08:00 |
|
|
|
c651a74b9f
|
refactor: 提取 CalendarPagerArea 与 BottomCardArea 独立 Composable
将 CalendarMonthView 中翻页区域与底部卡片逻辑提取为独立
Composable,减少主函数复杂度,移除不再使用的尺寸测量状态。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 18:24:51 +08:00 |
|
promise
|
a9c4fe493b
|
Merge branch 'DefectingCat:main' into main
|
2026-05-19 18:14:50 +08:00 |
|
|
|
fc3c8ec882
|
feat: Android 13+ 预测性返回手势(Predictive Back)
- BackHandler 升级为 PredictiveBackHandler expect/actual
- Android 13+ 启用系统级预测返回,跟手阶段同步位移/缩放页面
- Android 低版本回退至普通 BackHandler
- iOS 保持空实现(无系统返回手势)
- 页面返回动画统一 250ms 时长,提升流畅感
- AndroidManifest 启用 enableOnBackInvokedCallback
|
2026-05-19 17:58:49 +08:00 |
|
|
|
58ab7eab4e
|
feat: 页面切换添加滑入滑出动效
使用 AnimatedContent 为 Main/About/Licenses 导航添加方向感知的
slide + fade 转场动画,向前导航从右滑入,返回从左滑入。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 17:45:24 +08:00 |
|
|
|
0b1d89f06d
|
feat: 新增 BackHandler expect/actual 拦截系统返回手势
Android 通过 androidx.activity.compose.BackHandler 接管返回键,
在关于页与许可页返回上一级;iOS 无系统返回键,actual 为空实现。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 17:34:43 +08:00 |
|
|
|
43579b2866
|
feat: 关于页面与开源许可声明
- 新增 AboutScreen:应用图标、名称、版本、开源许可入口
- 新增 LicensesScreen 与 Licenses 数据源,展示第三方依赖许可证
- App 内页面导航(Main/About/Licenses)
- 双平台 getAppIconUri() 及 app_icon.png 资源
- 菜单"关于"项接入 AboutScreen 跳转
- iOS Info.plist 补充 CFBundleShortVersionString / CFBundleVersion
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 17:31:26 +08:00 |
|
|
|
e93d575f02
|
feat: 菜单新增"关于"项与分隔线
为后续接入设置页预留入口。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 16:39:49 +08:00 |
|
|
|
08eada4991
|
docs: 同步 README 与 CLAUDE.md 至最新依赖与构建命令
补充 sketch GIF、tyme4kt、R8 full mode 等依赖说明,
新增 installDebug/allTests/generateDummyFramework 构建命令,
并记录 ComposeTrace 性能追踪机制。README 重写为特性+技术栈结构。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 16:39:38 +08:00 |
|
|
|
f7c3df4b19
|
fix: 替换 String.format 为 padStart 以兼容 KMP commonMain
String.format 是 JVM 专属 API,在 commonMain 中不可用,
导致 GIF_FILES 类型推断失败及连锁编译错误。
padStart 是 Kotlin stdlib 跨平台 API,行为一致。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 16:18:55 +08:00 |
|
|
|
b5debbe74d
|
refactor: 用 associateWith 简化星期标签 map 构造
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 16:17:40 +08:00 |
|
|
|
0d76b44c4e
|
style: 菜单遮罩改为全透明并移除淡入淡出动画
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 16:17:30 +08:00 |
|
|
|
1395e9666f
|
feat: GIF 切换添加入场缩放弹性动画
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 16:17:09 +08:00 |
|
|
|
ce64526125
|
build: 移除 Compose runtime 的 ProGuard keep 规则
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 15:53:50 +08:00 |
|
|
|
19ae5b6b52
|
fix: 年视图 MiniMonth 添加标题与星期行间距
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 15:50:46 +08:00 |
|
|
|
fb52d30509
|
fix: 标题文本显式指定 onBackground 颜色,适配深色主题
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 15:46:30 +08:00 |
|
|
|
26e977401f
|
fix: 给日历根容器和日期标签添加背景色,修复主题切换透底
- CalendarMonthView 根 Box 添加 background(MaterialTheme.colorScheme.background)
- DayCell 班次标签和农历标签添加同色背景
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 15:41:45 +08:00 |
|
|
|
c1e8653941
|
feat: 引入 152 张 GIF 素材,按选中日期随机展示
- 移除单张 puppy_1.gif,替换为 001.gif~152.gif 的 GIF 素材池
- 新增 getGifUri expect/actual 函数,Android 通过 assets 加载、iOS 通过 compose 资源加载
- AnimatedGif 接收 seed 参数,随选中日期变化重新随机选取
- BottomCard 在底部信息下方展示 140dp 高度的随机 GIF
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 14:49:50 +08:00 |
|
promise
|
c262572eee
|
Merge branch 'DefectingCat:main' into main
|
2026-05-19 14:25:52 +08:00 |
|
|
|
63da397fc9
|
style: 移除班次标签背景圆,清理未使用导入
DayCell 中右上角班次("班"/"休")标签去除 surface 背景圆,
文字直接浮在单元格上,视觉更轻量。同步清理
CalendarViewModel、AnimatedGif、BottomCard 的未使用导入,
并格式化 YearGridView 与 CalendarUtilsExtraTest。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 14:17:53 +08:00 |
|
|
|
fae6e3eb72
|
feat: 支持系统深色主题切换
新增 values/values-night 主题资源 Theme.YaYa,AndroidManifest 切换为该主题;
Compose 端根据 isSystemInDarkTheme 切换 light/dark ColorScheme。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 13:52:41 +08:00 |
|
|
|
e6898df400
|
style: 浮动按钮改为圆形形状
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 13:43:18 +08:00 |
|
|
|
22464d9ca6
|
build: 优化 APK 打包与 AAB 分包配置
排除冗余的 META-INF 许可证与 Kotlin 元数据资源,挑选首次出现的 INDEX.LIST,避免合并冲突;启用按语言、密度、ABI 拆分的 App Bundle。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 13:41:51 +08:00 |
|
|
|
feb7db718e
|
feat: 引入 sketch4 显示 GIF 动画,新增 AnimatedGif 组件
- 添加 sketch4 依赖(compose / animated-gif / compose-resources)
- 升级 tyme4kt 1.4.4 → 1.4.5
- 新增 puppy_1.gif 资源与 AnimatedGif 通用组件
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-19 13:36:14 +08:00 |
|
|
|
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 |
|