fix(ohos): 适配平板全景多窗下的全屏播放#101
Merged
Merged
Conversation
修复自由多窗内点全屏后播放控件比例异常(内容只占窗口一部分、右/下露出大片白底),并连带修复同根因的一系列窗口化显示问题(fix qinshah#92)。 根因:小窗横屏全屏时应用会把 `ScaledWidgetsFlutterBinding.scaleFactor` 切到 0.75,该变化只更新 RenderView 配置(渲染画布的逻辑尺寸),而根 View 的 MediaQuery 数据(physicalSize/dpr 均来自引擎)并不改变,依赖 MediaQuery 的整棵子树——包括 _builder 里按缩放校正 MediaQuery 的逻辑——不会重建。 布局仍按旧逻辑尺寸进行,与画布脱节,内容恰好只占 scale 比例的区域。此前手机小窗不受害,是因为进小窗时窗口尺寸/dpr 恰好真实变化、引擎 metrics 更新碰巧带来了重建;平板全景多窗内窗口矩形不变,无人兜底。 - scale_app.dart / main.dart:新增 `scaleFactorNotifier`,_builder 用 `ListenableBuilder` 监听,缩放变化强制重建 MediaQuery 校正子树 - Index.ets:监听 `windowSizeChange/windowRectChange`,把窗口尺寸显式绑定到根容器,让 `XComponent surface` 跟上程序化窗口调整(如 `enableLandscapeMultiWindow`);常规场景下与 '100%' 等价 - video/view.dart:鸿蒙自由小窗内跳过"非竖屏自动进全屏"启发式——小窗的宽高比不代表设备方向,横屏小窗退出全屏时窗口尚未恢复尺寸,该启发式会立即重进全屏形成退不出去的回环。行为变化:自由窗口内打开自动播放的视频不再因窗口是横向比例而自动全屏 - 装饰栏按钮颜色适配:自由多窗顶部的全屏/最小化/关闭按钮颜色跟随应用颜色模式而非内容,浅色模式下深色按钮叠在播放页黑色顶部上视觉不可见。HarmonyChannel 新增 `setDecorButtonDark`(原生 `setDecorButtonStyle`,@SInCE 14),视频/直播页可见期间以持有者集合方式切浅色按钮,离开恢复跟随系统;持有者集合规避页跳页时生命周期回调顺序的不确定性
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
问题-Issue #92
平板全景多窗(自由窗口)下调整过窗口比例后点击全屏按钮,播放控件比例异常:内容只占窗口的一部分(约为缩放比例),右侧和下方露出大片白底;手动拖动窗口边缘可临时恢复。
原因
ScaledWidgetsFlutterBinding.scaleFactor切到 0.75,该变化只更新 RenderView 配置(渲染画布的逻辑尺寸),而根 View 的 MediaQuery 数据(physicalSize/dpr 均来自引擎)并不改变。_builder里按缩放校正 MediaQuery 的逻辑)不会重建,布局仍按旧逻辑尺寸进行,与画布脱节。手机小窗无此问题,是因为进小窗时窗口尺寸真实变化、引擎 metrics 更新碰巧带来了重建;平板全景多窗内窗口矩形不变,无兜底方案。修改
scale_app.dart/main.dart:新增scaleFactorNotifier,_builder用ListenableBuilder监听,缩放变化强制重建 MediaQuery 校正子树(根修复)Index.ets:监听windowSizeChange/windowRectChange,把窗口尺寸显式绑定到根容器,让 XComponent surface 跟上程序化窗口调整;常规场景下与 '100%' 等价video/view.dart:鸿蒙自由小窗内跳过"非竖屏自动进全屏"启发式——小窗的宽高比不代表设备方向,横屏小窗退出全屏时窗口尚未恢复尺寸,该启发式会立即重进全屏形成退不出去的回环。行为变化:自由窗口内打开自动播放的视频不再因窗口恰为横向比例而自动全屏HarmonyChannel新增setDecorButtonDark(原生setDecorButtonStyle),视频/直播页可见期间切浅色按钮,离开恢复跟随系统