JianFeeeee
e29f38b151
跨端: 页面转场 + 主题切换交叉淡出(用户:「加页面转场,因为是桌面应用了」+「深浅色切换也加动画」)
## ① 页面间转场(`pageTransition`)
用户要的是"因为它是桌面应用了"—— 桌面端的页面切换有转场是基本预期。
官方文档(`ts-page-transition-animation`)给了两条关键信息:
· 「当路由(**router**)进行切换时,可以通过在 `pageTransition` 函数中自定义
页面入场和页面退场的转场动效」;
· 「为了实现更好的转场效果,**推荐使用 Navigation 组件和模态转场**」。
⇒ 所以**两套机制各归各位**,不混用:
· 走 `router` 的独立页(管理页 / 邮件详情独立页 / 写信独立页)→ `pageTransition`;
· 应用内 `Navigation` 跳转(邮件详情 / 写信,都走 `pushPath`)→ 已有
`geometryTransition`(上一轮加的共享元素转场)。
数值照 WebUI `rise-in` 的关键帧(`index.css:1298-1307`)逐字对齐:
from { opacity: 0; transform: translateY(4px) }
to { opacity: 1; transform: none }
⇒ 淡入 + 上浮 `Theme.riseInOffset`(4vp),时长 `Theme.durRise`(200)。
★ 退场**只淡出、不做位移**:两端都位移会看起来互相推挤。
## ② 主题切换的交叉淡出
这是**平台机制差异**,不是"懒得做":
· WebUI 切主题是**免费**的 —— CSS transition 挂在 `background-color` 上,
主题换的是 CSS **变量**,于是每个元素各自补间(`index.css:1169` 给
button/a/input/textarea/select 都挂了);
· ArkUI 的主题走 `app.setColorMode()`,而界面颜色是**系统资源**
(`$r('sys.color.*')`)。`animateTo` 只能补间**数值属性** ——
"把一个资源换成另一个资源"没有中间值 ⇒ 实测整屏同时跳变(闪一下)。
⇒ 自己造一个"旧屏淡出":
① 切主题**之前**用 `getComponentSnapshot().get(id)` 抓当前界面;
② 立刻切主题(底层已是新主题);
③ 把位图盖在最上层、`opacity` 1 → 0 补间 ⇒ "旧界面淡出、新界面透出"。
新增:
· `Motion.captureForThemeFade(ui, rootId)` —— 抓图,失败返回 `undefined`;
· `Theme.durThemeFade = 260`(整屏变化比单组件入场慢一点才不刺眼);
· `MainPage` 根 Stack 加 `.id(THEME_FADE_ROOT_ID)`(**常量**,两处拼错不报错、
只表现为"动画静默不发生")+ `themeFadeImage`/`themeFadeOpacity` 两个状态
+ 最上层那层 `Image`;
· `toggleTheme` 拆成"带动画"与 `applyThemeNow`(**不含动画**)两条路,
共用同一份状态变更 —— 抓图失败 / 系统关掉动画时直接切主题
(**功能优先于观感**:不能因为动画失败而切不了主题)。
★ 两个必须做的收尾(都不是可选):
· 动画结束后**清空 `themeFadeImage`** —— 留着是一张**整屏大小**的 PixelMap
常驻内存,而且它盖在最上层会**吃掉所有触摸事件**(界面看着正常但点不动);
· 那层加 `hitTestBehavior(HitTestMode.None)` —— 动画期间用户可能正好在点按钮。
★ 默认跟随系统:**本来就已经是**(`Appearance.theme` 初值 `'system'`,
`AppearanceStore` 与 `Models` 两处都是),本轮未改,只是确认了。
## 验证状态(如实)
✓ 编译通过;设备上装包后进程存活、无新 jscrash
✗ **动画本体没有在设备上看到**:
· 页面转场与主题淡出都是 200-260ms,而 `snapshot_display` 往返 1.5-3s
⇒ 探针比被测对象慢一个数量级(同 `harmony-morph-unverified-middleframes`);
· 主题淡出还额外需要"已登录 + 找到主题开关",而我在清 preferences 之后
登录流程没能用 `uitest uiInput` 走通(`inputText` 追加而非替换,
把地址栏填成了 `https://exm/api/v1https://mail.jianfgit.`)。
⇒ 这两条的**结构与接线**有判据/编译保障,但"动起来好不好看"只能由真机确认。
我不声称已验 —— 与既有的 morph 那条同一个诚实口径。
2026-09-21 17:36:40 +08:00
..
2026-09-14 15:41:52 +08:00
2026-09-15 12:09:37 +08:00
2026-09-19 23:38:35 +08:00
2026-09-15 07:46:54 +08:00
2026-09-21 14:32:38 +08:00
2026-09-14 16:21:27 +08:00
2026-09-15 11:17:23 +08:00
2026-09-21 15:50:00 +08:00
2026-09-19 15:03:40 +08:00
2026-09-17 22:32:25 +08:00
2026-09-14 17:33:05 +08:00
2026-09-15 12:55:25 +08:00
2026-09-20 05:22:42 +08:00
2026-09-20 05:45:42 +08:00
2026-09-20 10:51:28 +08:00
2026-09-21 16:45:23 +08:00
2026-09-21 13:29:24 +08:00
2026-09-19 19:29:49 +08:00
2026-09-21 13:29:24 +08:00
2026-09-21 02:19:30 +08:00
2026-09-21 17:36:40 +08:00
2026-09-20 08:16:10 +08:00
2026-09-21 17:06:19 +08:00
2026-09-20 22:35:35 +08:00
2026-09-20 07:37:16 +08:00
2026-09-18 08:39:21 +08:00
2026-09-19 16:18:10 +08:00
2026-09-20 21:14:20 +08:00
2026-09-21 13:29:24 +08:00
2026-09-15 12:06:15 +08:00
2026-09-16 08:29:24 +08:00
2026-09-17 19:38:15 +08:00
2026-09-17 18:43:00 +08:00
2026-09-14 16:21:27 +08:00
2026-09-21 13:29:24 +08:00
2026-09-18 10:34:00 +08:00
2026-09-14 15:11:47 +08:00
2026-09-15 08:45:54 +08:00
2026-09-15 07:46:54 +08:00
2026-09-14 17:33:05 +08:00
2026-09-21 15:50:00 +08:00
2026-09-18 01:08:04 +08:00