HarmonyOS 鸿蒙Next:web组件使用WebLayoutMode.FIT_CONTENT后视频全屏显示区域异常的问题
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
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,