MD 阅读 · 竖屏留白修复(真机验收)
修复鸿蒙版竖屏顶部双倍留白,Mate 70 Pro 真机逐像素验收通过
- 日期:2026-09-18
- 设备:HUAWEI Mate 70 Pro 优享版
PLR-AL50/ HarmonyOS*****(SP10C00E105R16P3)/ 屏 1316×2832 - 被测包:
com.bzm.mdreader(lite 1.0.4 / 1000004,product=device+ debug 签名)
1. 现象
竖屏时状态栏与标题栏之间多出一条空白;横屏正常。
2. 根因
Index.ets 的 refreshAvoidArea() 把 max(TYPE_SYSTEM.topRect, TYPE_CUTOUT.topRect) 整体当作顶部内边距。
但默认(非沉浸式)布局下窗口内容区本身已经避让了状态栏,于是状态栏高度被补了两次 → 竖屏顶部出现双倍留白。
横屏时系统状态栏隐藏(topRect = 0),故看不出问题。
3. 修法
// 非沉浸态:只补「挖孔伸出系统栏的溢出高度」(竖屏通常在状态栏带内,为 0)
this.insetTop = px2vp(Math.max(0, cutTop - sysTop));
this.insetBottom = 0; // 底部同理,系统已避让导航条
// 左右仍取 max(sys, cut):横屏挖孔在屏幕侧边中部,系统不避让,不补会被遮挡(华为上架检测项)
沉浸态(应用内全屏)系统不再避让任何系统栏,仍按 max(sys, cut) 自行补齐 top/bottom。
4. 实测数据(截图逐行像素测量)
| 指标 | 修复前(旧逻辑) | 修复后(新逻辑) |
|---|---|---|
| 状态栏文字 | y 55 ~ 103 | y 55 ~ 103 |
| 标题栏文字顶(绝对 y) | 338 px | 202 px |
| 状态栏底 → 标题栏顶 | 235 px | 99 px |
| 标题栏文字 上 / 下 留白 | 208 / 73 px(严重不对称) | 72 / 73 px(居中) |
顶部多出的 136 px(≈48 vp,正好一个状态栏高度) 完全消失,与根因判断一致。
5. 横屏复核
用 product=device + 临时把 module.json5 的 orientation 改为 landscape 强制横屏构建(只在临时副本改,未动源码):
- 截图 2832×1316,标题栏紧贴顶部,系统栏隐藏 = 预期行为
- 挖孔侧留白生效,正文与标题栏均未被挖孔遮挡
- 底部内容未被导航条遮挡
6. 复现步骤(hdc)
# 1. debug 包(release 证书包无法直装真机,报 9568448 verify app signature failed)
# 在工程副本里编译:hvigorw assembleHap -p product=device -p buildMode=debug
# 2. 若机器上是市场版(appDistributionType=app_gallery)需先卸载
hdc uninstall com.bzm.mdreader
hdc install entry-default-signed.hap # 先 cd 到 hap 所在目录再传文件名
hdc shell "aa start -b com.bzm.mdreader -a EntryAbility"
hdc shell "snapshot_display -f /data/local/tmp/p.jpeg"
hdc file recv /data/local/tmp/p.jpeg p.jpeg # 同样先 cd 到本地目标目录
7. 截图索引
| 文件 | 说明 |
|---|---|
验收_竖屏留白修复_前后对比_20260918.png | 左=修复前 / 右=修复后,红线为标题栏文字顶基准 |
验收_竖屏_修复后_20260918.jpeg | 修复后竖屏实况(1316×2832) |
验收_横屏_挖孔避让_20260918.jpeg | 强制横屏复核(2832×1316) |
8. 注意
- 真机验证必须用 debug 签名包;发布证书包只能经应用市场分发安装。
- 验收后设备上装的是 debug 版(含修复逻辑)。原市场版 1.0.3 已被卸载,恢复途径:等 1.0.4 过审后从应用市场更新,或在应用市场重新下载。
- 鸿蒙无
wm命令,也无法通过param/uinput旋屏;横竖屏验证靠真机握持姿态或强制方向构建。