HarmonyOS 7 新特性12:平行视界深潜——easy_go 两层配置字典、版本分层与六行窗口状态验证表

1、引言

篇 5 用轻视界文集把平行视界的体验跑通跑了一遍:分栏、点选同步、分割线拖拽、单窗退化。跑完之后配置层面的问题才真正浮出来——easy_go.json 里那两层结构每层管什么?十三个选项字段哪些是 API 23 就有的、哪些是 26.0.0 才加的?两套分栏选项(router 与 navigation)为什么不能共存?以及最根本的一个问题:配置写对了,分栏就生效吗?

最后一个问题的答案是「不一定」,而「不一定」的分布是有规律的。平行视界的生效条件由配置与设备窗口状态共同决定,官方文档明说「无法仅靠静态配置预知」。所以这篇除了配置字典,还给一张验证表:六种窗口状态下 isEasySplit 的真机读数,从直板机到分栏残留态逐行实测。字典告诉你怎么配,验证表告诉你配了之后在哪些状态下会发生什么——两者合起来,下一篇同类工程就不需要再踩一遍。

环境声明:HarmonyOS 7.0.0.107 (API 26) Release,实测工程轻视界(com.qingkouwei.lightview,配置字典载体)与 EasyGoProbe(com.qingkouwei.easygoprobe,状态验证载体);DevEco Studio 26.0.0(SDK 26.0.0.105 Release),真机 Mate 60 Pro(ALN-AL80,麒麟 9000S,直板机读数)与 MatePad Edge(QXS-W00,双模态,分栏与窗口状态读数)。读数全部真机实测。

2、效果展示:验证表的两端

验证表的两端各放一张图。直板机端:Mate 60 Pro 上诊断读数 isEasySplit() = false,窗口宽 388vp、宽高比 0.46、density 3.25——几何距离 600vp 门槛差得远,分栏在这类设备上不是「被关闭」而是「够不着」。

HarmonyOS 7 新特性12:平行视界深潜——easy_go 两层配置字典、版本分层与六行窗口状态验证表-1.png

分栏端:MatePad Edge 平板形态下轻视界分栏生效,左栏列表右栏正文,1:1 分割。同一份 easy_go.json,两台设备两种结局——配置没变,变的是窗口状态,这就是本篇要画的矩阵。

HarmonyOS 7 新特性12:平行视界深潜——easy_go 两层配置字典、版本分层与六行窗口状态验证表-2.png

3、Kit 与 API:两层配置与字段字典

3.1 接入三步骤与两层结构

接入是纯配置驱动,没有运行时调起接口:profile 目录建 easy_go.json(文件名自定)、module.json5 加 easyGo 字段指向它、仅 entry 模块可配且应用级生效。配置文件两层:

第一层设备类型:common(全设备默认,必配)/ phone / tablet(可选,配置后覆盖 common 在该类型的生效)。官方在 tablet 的说明里夹了一句关键约束:自由多窗模式下暂不支持平行视界——这句的位置本身是提示:它挂在设备类型层,但实际语义在窗口状态层(验证表第六行会修正这个表述)。

第二层 displayModeOptions:wideWindowMode(长方形宽屏窗口的显示方式,≥600vp 且宽/高>1.2)/ squareWindowMode(方形宽屏窗口,≥600vp 且两向比≤1.2)/ 两套分栏选项。wideWindowMode 取值三选一:routerSplit(路由由 router 模块实现,须配 routerSplitOptions)/ navigationSplit(路由由 Navigation 组件实现,须配 navigationSplitOptions)/ original(关闭兼容运行行为)。

3.2 字段字典(十三项)

两套 options 内通用的字段,按版本分层列:

字段作用版本
homePage主页(Router 为页面路径,Navigation 为 NavDestination name 或 navBar)23
relatedPage关联页,必须有 homePage 才能配,不支持传参23
enableReducedContainerSize虚拟容器:lpx/横向断点/窗口宽按右页尺寸算23
fullScreenPages跳转即退出分栏的页数组,不得与 home/related 重复23
supportLandscapeFullscreen主动横屏时是否全屏,默认 true23
dialogSupportSplitDialog 是否分栏(右半屏),默认 true23
wideSplit / squareSplit分栏比例与拖拽(子字段 ratio、isDraggable)26.0.0
mode路由模式:0 购物 / 1 导航,默认 126.0.0
pagePairs{from,to} 跳转关系对,仅导航模式,to 可配 *26.0.0
transPages过渡页,购物模式生效,固定右显不支持右推左26.0.0
splitDividerColor分割线颜色 light/dark,#AARRGGBB26.0.0
drawableRectHookdrawableRect 页面级容器能力,默认 false26.0.0
enableInSplitScreen窗口分屏场景进入平行视界,默认 false26.0.0

版本分层的工程含义:API 23 的六个字段够跑通基础分栏(本卷开源中国篇 10 与本篇篇 5 的最小配置只用了 homePage/relatedPage/wideSplit/mode 中前三者);26.0.0 的八个增量解决的是「分栏之后怎么编排」——模式、关系对、过渡页、分割线样式、分屏嵌套。老配置在新 SDK 上继续有效(增量字段全有默认值),新配置回旧 SDK 则增量字段被忽略——分层使用的规矩是:增量字段只做增强不做依赖,核心分栏逻辑永远落在 23 字段上。

3.3 两个编译期互斥约束

约束一:routerSplitOptions 与 navigationSplitOptions 不能同时存在,且混用 Router 与 Navigation 会导致部分行为异常——分栏的路由实现只能选一边。约束二(schema 的 if/then 分支实证):wideSplit.isDraggable=true 时 ratio 必须不出现;开启拖拽后比例由系统三档吸附接管(1:2/1:1/2:1,篇 5 与开源中国篇 10 均实测)。官方 schema 在 SDK default/hms/toolchains/modulecheck/easy_go.json,拿不准直接对照。

还有一个结构坑:二层字段必须包在 displayModeOptions 里,直接平铺 wideWindowMode 会 schema 校验失败——构建期报错信息不指字段名,第一次撞会浪费一轮排查。

4、逻辑流

配置加载与分栏判定流:

phone/tablet 有专配

无专配

宽≥600vp 且比例达标

不达标

自由多窗管理态

非管理态

应用启动

读 entry 模块 easyGo 配置

设备类型匹配

用专配覆盖 common

用 common

窗口几何判定

窗口状态判定

isEasySplit=false 单页态

分栏挂载 homePage+relatedPage

isEasySplit=true

运行时判定接口 UIContext.isEasySplit()(API 24 起)是应用侧唯一的分栏感知口,配套两个尺寸回调:onRouterPageSizeChange() / onNavDestinationSizeChange()(可见页尺寸变化时回调,分栏拖拽与窗口缩放都会触发)。判定有个读时机坑:aboutToAppear 里读恒 false(分栏尚未挂载),须延迟到首帧后——篇 5 与开源中国篇 10 各踩一次,本篇立为规矩。

5、实战:六行验证表

#设备/窗口状态窗口几何isEasySplit来源
1Mate 60 Pro 直板机全屏388vp,宽/高 0.46,density 3.25false本篇新测
2MatePad Edge 平板形态分栏各 1418vp,1:1true篇 5/开源中国篇 10
3MatePad Edge PC 形态 FULL_SCREEN分栏各 1418vptrue开源中国篇 15
4MatePad Edge PC 形态 FLOATING1100vp,宽/高 1.50false开源中国篇 10 诊断
5MatePad Edge PC 形态 MAXIMIZE1642vp,宽/高 1.60false开源中国篇 10 诊断
6FLOATING(曾分栏后退回)1418vp/栏true(残留)开源中国篇 15

六行读出的三条规律。其一,几何是必要非充分条件:第 4/5 行几何全达标(≥600vp 且比例>1.2)仍 false,第 1 行几何不达标直接 false——几何门槛筛掉直板机,窗口状态门槛筛掉自由多窗管理态,两道筛子串联。其二,官方「自由多窗暂不支持」的准确语义是窗口处于自由多窗管理态(第 3 行 PC 形态全屏脱离管理态即 true),设备形态只是管理态的常见载体,不是依据本身。其三,状态机不对称:第 6 行进过分栏再退回浮窗,分栏残留不释放——验证表要带历史列,单看当前窗口状态解释不了这一行。

验证表的使用规矩:环境声明报整表不报单格。单格结论(「某设备不支持平行视界」)活不过一次状态切换,矩阵只随新状态增行。本篇六行里有四行引自本卷前篇诊断读数——验证表天然是跨篇累积资产,这也是深潜篇放在体验篇之后的原因:体验篇产出读数,深潜篇把读数组织成依据。

三档吸附的补充读数(篇 5):isDraggable=true 时分割线在 1:2/1:1/2:1 三档间吸附,拖拽过程中窗口宽读数不变——分栏比例改的是两页分配,不是窗口几何,验证表的几何列因此在拖拽下稳定。

六行状态之间的迁移关系画成图,残留态的不对称边就一目了然:

几何不达标(直板机)

几何达标+非管理态

进入自由多窗(FLOATING/MAXIMIZE)

脱离管理态(FULL_SCREEN)

退回浮窗(分栏不释放)

状态机无出边(实测)

窗口几何缩到门槛下

单页态

分栏态

管理态单页

残留分栏

图里最值得盯的是「残留分栏」的自环:它没有出边——实测中没有任何用户操作能让残留态退回单页态(重启应用会重建窗口,那是另一条路径)。状态机的这条死边是系统行为,应用侧的应对只有让位:读到 true 就按分栏渲染,不试图纠正。

6、避坑

6.1 配置平铺与互斥字段:schema 校验失败的两种形态

现象:首版 easy_go.json 把 wideWindowMode 直接平铺在设备类型下,构建报 schema 校验失败但不指字段;第二版加了 isDraggable 又保留 ratio,再次失败。
根因:二层字段须包在 displayModeOptions 包裹层;wideSplit 的 isDraggable 与 ratio 是 schema if/then 互斥分支。
最佳实践:SDK 自带官方 schema(modulecheck/easy_go.json),配置写完先对照再构建;拖拽与固定比例二选一,要拖拽就删 ratio。
验证:对照 schema 重写后构建通过,三档吸附行为与官方描述一致。

6.2 isEasySplit 读时机:aboutToAppear 恒 false

现象:分栏态下首页按 aboutToAppear 的读数走了单页分支,两栏内容叠罗汉。
根因:分栏挂载晚于页面创建,创建瞬间读到的永远是 false。
最佳实践:延迟到首帧后读(setTimeout 300ms 实测足够),或用 onRouterPageSizeChange 回调驱动;业务判定与实测读数都不在创建瞬间取。
验证:延迟读后分栏态分支正确,本卷三个工程(轻视界/户型台/速记台知识库)同法复用零重踩。

6.3 直板机 false 分支要显式处理而非忽略

现象:篇 5 首版只写了分栏与宽窗两个分支,直板机上列表页渲染出 260vp 列表加挤成一条的内嵌正文。
根因:验证表第 1 行的状态(几何不达标)在开发机上不出现(开发期全在平板/PC 形态调),分支漏写直到手机装机才暴露。
最佳实践:单页态分支按「窄窗单栏」设计(列表全宽、点选 push 整页),与分栏态共用列表组件只换容器——漏分支的代价从「布局挤坏」降为「体验降级」。
验证:补分支后 Mate 60 Pro 上列表全宽可读,push 导航正常。

7、总结,以及这次没测到的部分

配置字典与验证表是这篇的两件产出:字典解决「怎么配」,十三字段按 23/26 分层、两套 options 互斥、包裹层与拖拽比例互斥三个硬要求列在明面;验证表解决「配了之后会怎样」,六行状态读数把官方的单句约束展开成可增行的矩阵。两者合起来的工程价值是一句话:平行视界的配置是声明式的,行为是状态相关的,声明式配置的正确性只能靠状态矩阵验证。

这次没测到的部分,列在这里:

  • navigationSplit 路线(Navigation 分栏)未实测,本篇全走 routerSplit;navigationSplitOptions 的额外字段(navBar 首页语义)放到下篇讲
  • mode 0 购物模式与 pagePairs/transPages 未实测(需多页关系对场景),本篇 mode=1 导航模式
  • enableReducedContainerSize 虚拟容器的 lpx 换算差异未量化实测
  • 验证表第 6 行残留态的恢复条件(何时释放)未测,应用侧只让位不纠正
  • 直板机横屏态(宽屏几何可达但设备类型 phone)未测,验证表这一行还空着

字典会随版本增字段,矩阵会随状态增行——这篇的价值不在今天的十三字段与六行,在「增字段查字典、增状态查矩阵」的工作方式。

具体到操作面留三条:配置改动后先过 schema 对照再过构建(6.1 的两个互斥都是构建期才报,对照 schema 能把一轮构建省成一次阅读);验证表增行时带三列上下文(设备/窗口状态/几何读数),缺几何列的行无法区分「门槛不达标」与「管理态关闭」两种 false;引用前篇读数时标来源篇目(本篇表内四行引自开源中国卷与篇 5),矩阵的跨篇累积靠来源标注才可追溯。在这里插入图片描述

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐