MD 阅读 鸿蒙版 · graph.html 同步后真机回归
把 Android 版的确定性高度算法与全屏方案同步回鸿蒙后,用真机补做回归:9 类图形内联高度全部贴合(7.5 状态图完整、7.8 时间线无留白),全屏居中、双击缩放、拖动平移、返回键均正常,无崩溃。
- 日期:2026-09-24
- 设备:HUAWEI Mate 70 Pro 优享版
PLR-AL50(UDID5BH0225B04002176) - 环境:HarmonyOS
*****(SP10C00E105R16P3)/ 屏 1316×2832 - 包:
product=device+buildMode=debug,versionCode 1001004/versionName 1.1.4 - 范围:图形内联高度、全屏查看(居中 / 关闭 / 返回键 / 双击缩放 / 拖动平移)
一、背景:为什么这一轮必须真机验
上一轮把 Android 版 graph.html 的通用改进同步回鸿蒙版,并放宽了内联高度接纳下限:
| 改动 | 内容 |
|---|---|
| 高度算法 | 改为确定性计算 h = min(自然宽, 可用宽) × vbH/vbW + padding(与时机无关,等价浏览器 max-width:100% + height:auto) |
| 新增 | fitViewBoxToContent() / contentBox(viewBox 归一) |
| CSS | html,body{height:100%;overflow:hidden} 限定到 body.fullscreen(该规则曾导致普通流内容整块不绘制 → 图形白屏) |
| 全屏 | 全屏容器改用 position:fixed + 四边归零 |
| 接纳下限 | MermaidView 80 → 24、SvgView 60 → 24(原下限会把手测算的"真实高度 79"拒掉 → 保持初始 260 → 底部大块留白) |
同步当时鸿蒙机未接入,只做了三层静态验证:编译通过、HAP 解包核对资源、本地无头浏览器验证算法自洽(9/9 贴合)。静态验证证明不了真机观感与手势,故本轮补做。
二、装机确认
检查项:hdc install -r entry-default-signed.hap 报 install bundle successfully。
🔴 按铁律,install successfully 不等于设备上的包被替换,必须另找判据:
| 字段 | 值 | 判定 |
|---|---|---|
installTime | *****74(未变) | ⚠️ 覆盖安装时不刷新,不可作判据 |
updateTime | *******84** | ✅ 与装机时刻仅差 8 秒 → 确认包已替换 |
versionName | 1.1.4 / versionCode 1001004 | ✅ 与源码一致 |
经验:
installTime在覆盖安装场景下可能停在旧值,只看它会误判成"没换包"。本机可用updateTime作为可靠判据。
三、图形内联高度:9 类图形逐一覆盖
沿示例文档从上到下滚动,逐个图形核对「容器高度是否容纳全部内容」与「底部是否留白」。
| # | 图形 | 类型 | 结果 |
|---|---|---|---|
| 7.1 | 流程图(纵向) | Mermaid | ✅ 贴合 |
| 7.2 | 流程图(横向) | Mermaid | ✅ 贴合,无多余留白 |
| 7.3 | 时序图 | Mermaid | ✅ 贴合(长图完整) |
| 7.4 | 类图 | Mermaid | ✅ 贴合 |
| 7.5 | 状态图 | Mermaid | ✅ 完整显示(见下) |
| 7.6 | 甘特图 | Mermaid | ✅ 贴合 |
| 7.7 | 饼图 | Mermaid | ✅ 贴合 |
| 7.8 | 时间线 | Mermaid | ✅ 无大块留白(见下) |
| 8.2 | 环形进度 | SVG | ✅ 贴合 |
7.5 状态图 —— 原先"高度过低、显示不完整"
起始黑点 → 未打开 → 打开文档 → 预览 → 三个分支(源码 / 图形全屏 / 关闭 ⊙)全部在容器内可见,无裁切;图形内容底边到「7.6 甘特图」标题的间距,与其余章节间距同量级。
7.8 时间线 —— 原先"高度过高、底部大块留白"
4 个里程碑两排标签 + 底部下拉箭头全部可见;内容底边到「八、SVG 图形」标题的间距正常(此前表现为容器内多出约 181px 空白)。
两处修复的机理相同:旧版下限(80)恰好把真实高度 79 拒掉,导致容器退回初始值 260。下限放宽到 24 后,真实高度被接纳,"过低"与"过高"是同一个根因的两个表现。
四、全屏查看
| 检查项 | 结果 | 证据 |
|---|---|---|
| 进入全屏 | ✅ | 蓝栏「渲染图」+「关闭」+ 底部提示「双指缩放 · 双击放大到细节清晰 · 拖动平移」 |
| 图形居中 | ✅ | 上下留白对称(7.5 与 7.8 两张均如此) |
| 关闭按钮 | ✅ | 回到阅读页,滚动位置保持 |
| 返回键 | ✅ | 被全屏层接住,未穿透退出应用 |
| 双击放大 | ✅ | 图形包围盒 1196×1116 → 1314×1899(放大到可读,文字清晰) |
| 拖动平移 | ✅ | 内容跟手移动 |
| 双击复位 | ✅ | 包围盒精确回到 1196×1116,与进入全屏时完全一致 |
| 崩溃 | ✅ 无 | hilog 无 FaultLogger / CRASH;主进程 + render 进程均存活 |
五、结论
鸿蒙侧 graph.html 同步 + 下限放宽,真机回归全部通过,可以保留。
上一轮 Android 侧报告的两个症状(7.5 显示不全、7.8 底部留白)在鸿蒙真机上均已消除;全屏层的居中与手势链路(放大 / 平移 / 复位 / 关闭 / 返回键)完好。
真机日志中仅见系统级无害警告(AI_INNER_SERVICE 连接回调、chromium 渲染进程回收提示、AVSession StopCasting ret:401),均与本应用逻辑无关,不影响功能。
六、本轮沉淀的可复用技巧
1. uitest uiInput 完整手势集(本机实测)
click / doubleClick / longClick <x> <y>
swipe / drag <x1> <y1> <x2> <y2> [velocity]
fling / dircFling <direction> [velocity] [stepLength]
keyEvent <Back|Home|Power|keyID>
inputText <x> <y> <text> / text <text>
注意:
dblclick(无驼峰)报Invalid parameters,正确写法是doubleClick。
2. 🔴 页面内"双击"手势无法用 doubleClick 注入
graph.html 的双击判定写在 touchend 里,要求两次 tap 间隔 < 300ms;uitest uiInput doubleClick 的注入间隔超出该阈值,不触发。
✅ 解法:在一条 hdc shell 内连发两次 click —— 设备侧执行、间隔远小于 300ms:
hdc shell "uitest uiInput click 658 1550; uitest uiInput click 658 1550"
实测一次即触发 zoomToReadable(放大),再次即触发 fitToScreen(复位)。
3. ⚠️ 每次 hdc shell 往返约 8~12 秒 → 必须合并
12 次独立滑动调用耗时 2 分 10 秒;合并成 uitest …; sleep 1; uitest … 一条命令后,3 次滑动 + 截图 约 20 秒。真机批量操作务必合并。
4. 高度类判断用像素包围盒,不靠肉眼
对两张截图统计深色像素包围盒(PIL,px[x,y] < 120),可直接给出 w×h。本研究用它把"双击后好像变大了一点"从猜测变成结论(1196×1116 → 1314×1899),并证明复位是精确回到原值。
附:关键截图
| 文件 | 内容 |
|---|---|
hm-graph-regress/g8.jpeg | 7.5 状态图完整 + 7.6 甘特图(无裁切、无留白) |
hm-graph-regress/g4.jpeg | 7.8 时间线(无底部留白) |
hm-graph-regress/gfs1.jpeg | 时间线全屏,图形居中 |
hm-graph-regress/fs_d3.jpeg | 双击放大到可读 |
hm-graph-regress/fs_p1.jpeg | 拖动平移后 |