HarmonyOS 鸿蒙Next:web组件使用WebLayoutMode.FIT_CONTENT后视频全屏显示区域异常的问题

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:web组件使用WebLayoutMode.FIT_CONTENT后视频全屏显示区域异常的问题 如何解决,web组件使用WebLayoutMode.FIT_CONTENT后,视频全屏显示区域异常的问题

场景时webview在Column中,webview上下有原生的组件,避免滑动冲突,为它设置了 .layoutMode(WebLayoutMode.FIT_CONTENT),但视频全屏后显示异常,如果设置为.layoutMode(WebLayoutMode.NONE),视频全屏后显示正常但外面就会有滑动冲突问题。考虑用@State layoutMode 在全屏前后改变layoutMode的值来解决这个问题也无效。

Web({ controller: this.controller, src: this.url, renderMode: RenderMode.SYNC_RENDER })
  .layoutMode(WebLayoutMode.NONE)
  .width(CommonConstants.PERCENT_100)
  .onFullScreenEnter((event) => {
    this.fullScreen = true
    this.handler = event.handler
    let videoWidth = event.videoWidth ?? 0
    let videoHeight = event.videoHeight ?? 0
    if (videoWidth > videoHeight) {
      this.changeOrientation(true);
    }
  })
  .onFullScreenExit(() => {
    this.fullScreen = false
    if (this.handler) {
      this.handler.exitFullScreen()
      this.changeOrientation(false);
    }
  })

更多关于HarmonyOS 鸿蒙Next:web组件使用WebLayoutMode.FIT_CONTENT后视频全屏显示区域异常的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

layoutMode属性不支持动态修改

根据demo定位,引入的静态样式资源会导致在WebLayoutMode.FIT_CONTENT下出现该问题

可以在横竖屏切换时动态引入或删除资源

因为目前全量展示功能和网页视频全屏不适配,在不使用WebLayoutMode.FIT_CONTENT属性是可以获取网页高度然后动态设置,这样就可以规避视频的问题,参考代码:

import { webview } from '@kit.ArkWeb';
import { window } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';

const TEXT_ZOOM_RATION = 100

@Component
export struct ProgressWebView {
  @State progressValue: number = 0
  @State controller: WebviewController = new webview.WebviewController()
  @State url: string = ''
  @State aaa: number = 0
  @State bbb: number = 388
  @State ccc: number = 0
  private readonly TOTAL = 100
  nestedScroll?: NestedScrollOptions = {
    scrollBackward: NestedScrollMode.SELF_FIRST,
    scrollForward: NestedScrollMode.SELF_FIRST
  }
  handler: FullScreenExitHandler | null = null
  @Link fullScreen: boolean

  aboutToDisappear(): void {
    this.changeOrientation(false)
  }

  aboutToAppear(): void {
    webview.WebviewController.setWebDebuggingAccess(true)
  }

  build() {
    // Scroll(this.scroller) {
    Column() {
      Progress({ value: this.progressValue, total: this.TOTAL, type: ProgressType.Linear })
        .height('2vp')
        .style({ strokeWidth: 10, enableSmoothEffect: true })
        .visibility(this.progressValue == this.TOTAL || this.fullScreen ? Visibility.None : Visibility.Visible)
      Web({ controller: this.controller, src: this.url })
        .darkMode(WebDarkMode.Auto)
        .javaScriptAccess(true)
        .textZoomRatio(TEXT_ZOOM_RATION)
        .overviewModeAccess(true)
        .zoomAccess(true)
        .onlineImageAccess(true)
        .domStorageAccess(true)
        .fileAccess(true)
        .mediaPlayGestureAccess(true)
        .mixedMode(MixedMode.All)
        .cacheMode(CacheMode.Default)// .layoutMode(this.fullScreen ? WebLayoutMode.NONE : WebLayoutMode.FIT_CONTENT)
          // .layoutMode(WebLayoutMode.FIT_CONTENT)
        .horizontalScrollBarAccess(false)
        .verticalScrollBarAccess(false)
        .nestedScroll(this.nestedScroll)
        .onProgressChange((event) => {
          this.progressValue = event?.newProgress ?? 0
        })
        .onFullScreenEnter((event) => {
          this.aaa = 360
          this.bbb = 837
          this.fullScreen = true
          this.handler = event.handler
          let videoWidth = event.videoWidth ?? 0
          let videoHeight = event.videoHeight ?? 0
          if (videoWidth > videoHeight) {
            this.changeOrientation(true);
          }
        })
        .onPageEnd(() => {
          this.aaa = this.controller.getPageHeight()
          this.ccc = this.controller.getPageHeight()
        })
        .onFullScreenExit(() => {
          this.aaa = this.ccc
          this.bbb = 388
          this.fullScreen = false
          if (this.handler) {
            this.handler.exitFullScreen()
            this.changeOrientation(false);
          }
        })
        .height(this.aaa)
        .width(this.bbb)
    }
  }

  private changeOrientation(isLandscape: boolean) {
    let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
    window.getLastWindow(context).then((lastWindow) => {
      lastWindow.setPreferredOrientation(isLandscape ? window.Orientation.LANDSCAPE : window.Orientation.PORTRAIT)
    })
  }
}

更多关于HarmonyOS 鸿蒙Next:web组件使用WebLayoutMode.FIT_CONTENT后视频全屏显示区域异常的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙Next中web组件使用WebLayoutMode.FIT_CONTENT后视频全屏显示区域异常的问题,这通常是由于Web组件的布局模式与视频全屏播放时的渲染逻辑冲突所导致的。

在HarmonyOS中,WebLayoutMode.FIT_CONTENT模式意味着Web组件会根据内容自适应大小,但在处理视频全屏等复杂场景时,这种自适应可能会导致布局上的不一致性。视频全屏时,系统期望的是能够占据整个可用显示区域,而FIT_CONTENT模式可能会限制这种扩展。

解决此问题的一种方法是调整Web组件的布局模式。尝试使用WebLayoutMode.MATCH_PARENT或其他更适合全屏显示的布局模式,看是否能够解决视频全屏时的显示异常。同时,确保Web组件的容器(如Page或Ability窗口)也支持全屏显示,并且没有设置任何可能限制内容扩展的布局属性。

如果调整布局模式后问题依旧存在,可能需要检查Web组件内部HTML/CSS/JavaScript代码,确保视频元素在全屏时的样式和行为符合预期。特别是检查是否有CSS属性或JavaScript代码干预了视频的全屏显示。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部