前言

OpenHarmony对于多屏的支持目前还不完善,包括多屏同显和多屏异显,当前master和之前版本的代码中已有基础支持,但还存在不少问题。因此我们针对这些问题做了修复和适配,下文将做一下简单介绍。

多屏同显

问题一

  • 问题描述:多屏同显时副屏画面偏左或偏上,未居中显示,不美观;
  • 根因分析:副屏渲染时以屏幕左上角为原点;
  • 修改方案:根据副屏宽高及图层自身宽高等属性,计算图层偏移,使其居中显示。
  • 相关仓库:graphic_graphic_2d

问题二

  • 问题描述:副屏画面比较模糊;
  • 根因分析:当副屏中显示的宽高与主屏不一致时,会做图形缩放操作,drawImage默认使用Nearest算法;
  • 修改方案:drawImage时使用Linear算法。
  • 相关仓库:graphic_graphic_2d

问题三

  • 问题描述:当硬件做合成操作时,副屏旋转后画面有残影(RK3568)
  • 根因分析:屏幕旋转前后,副屏显示区域变化(比如原来时全屏显示,旋转后画面缩放非全屏显示),原来的部分区域未被覆盖或清除
  • 修改方案:每次合成前执行清屏操作。
  • 相关仓库:device_soc_rockchip

多屏异显

问题一

  • 问题描述:多屏异显时副屏中窗口隐藏再显示后位置不正确
  • 根因分析:窗口显示(Show)时,会更加所属屏幕(Display)的偏移,修改窗口坐标。隐藏后再显示,会重复执行该操作,因此副屏中窗口的坐标会被重复修改,偏移越来越大
  • 修改方案:增加判断,当窗口已在屏幕中显示过时不在修改坐标
  • 相关仓库:window_window_manager

问题二

  • 问题描述:多屏异显时屏幕旋转后窗口显示异常
  • 根因分析:未考虑屏幕旋转时的宽高变化
  • 修改方案:根据旋转获取实际的宽高
  • 相关仓库:window_window_manager

问题三

  • 问题描述:多屏异显时窗口跨屏显示异常的问题
  • 根因分析:渲染服务中主要包括准备、遮挡计算、执行三个阶段,每个阶段中依次处理每个屏幕(DisplayRenderNode)。异显时,如果一个窗口(SurfaceRenderNode)跨屏显示,在准备阶段,处理第二个屏幕时会覆盖掉处理第一个屏幕时的计算结果,因此在后续阶段中处理第一个屏幕时会使用错误的数据,导致显示异常。
  • 修改方案:在准备阶段,针对各个屏幕分别存储窗口的计算结果,在后续阶段再分别读取相应的数据。
  • 相关仓库:graphic_graphic_2d

问题四

  • 问题描述:多屏异显时鼠标无法跨屏移动和显示
  • 根因分析:混淆了ScreenId和DisplayId,且鼠标跨屏时,未将其移动到新的屏幕
  • 修改方案:使用DisplayManager的AddSurfaceNodeToDisplay/RemoveSurfaceNodeFromDisplay接口代替原来SurfaceNode的AttachToDisplay/DetachToDisplay接口,且当displayId变化时,将鼠标移出原屏幕,移入新屏幕。
  • 相关仓库:multimodalinput_input

代码

对于以上问题,已向社区master分支提交了PR,在这些问题上,4.0 Release和master的代码区别不大,以下是PR链接:

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐