HarmonyOS 画中画开启后,进入参数不同但组件相同的页面时,如何重新渲染页面

如题在画中画开启后,进入参数不同但组件相同的页面时,并不会调用onReady方法,也没有找到其他可以获取新参数并渲染页面的方法。

HarmonyOS
2天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

由于画中画还未完全停止的时候,页面就跳转了。此时上播放视频的子页面还未销毁,跳转页面的路由也是相同的,所以会跳转到上次页面。目前的修改方案是:

navigation页面(主页面),监听下子页面(NavDestination页面)上返回的画中画窗口开启和关闭,并保存起来,在下次点击跳转的时候,判断页面是否正在开启画中画内容,开启的话,给子页面发送消息,让它停止画中画,并在停止画中画,之后执行跳转命令(这个命令只能执行一次,执行结束必须立即销毁)。

主页面 WindowPip.ets

1、新增监听是否启用小窗播放并记录。

// 是否打开了小窗播放
@State isOpenPopWindow: boolean = false;

aboutToAppear(): void {
  //订阅指定事件,监听子组件内部的小窗变化
  getContext().eventHub.on('pipWindowChange', (isOpen: boolean)=>{
  this.isOpenPopWindow = isOpen
});
}

2、路由跳转的时候,判断是否开启小窗动画,根据是否启用,做两种处理。

.onClick(() => {
  if(this.isOpenPopWindow){
    getContext().eventHub.emit('onStateChange', true, ()=>{
      this.pageInfos?.pushPath({ name: Constants.NAV_DESTINATION_NAME,param: this.titleResource });//将info指定的NavDestination页面信息入栈。
    });//订阅指定事件。
    return
  }
  this.pageInfos?.pushPath({ name: Constants.NAV_DESTINATION_NAME,param: this.titleResource });//将info指定的NavDestination页面信息入栈。
})

子页面 VideoPlay.ets

1、监听跳转时,需要关闭小窗事件,需要保存跳转方法,在真正停止播放的地方,执行一次。

this.eventHub.on('onStateChange', (fg: boolean, callBack: () => void) => {
  if (fg && this.curState === 'STARTED') {
    this.stopPip();
    this.closePipCallBack = callBack
  }
});

2、开启小窗的时候,发送小窗开启消息给主页面。

this.eventHub.emit('pipWindowChange', true)

3、关闭小窗的时候,发送小窗关闭消息给主页面,和执行一次性的跳转方法。只有在监听小窗的state方法里面,监听到小窗关闭才能是最终的,其他地方监听,小窗未真正关闭。

case PiPWindow.PiPState.STOPPED:
this.eventHub.emit('pipWindowChange', false)
this.player?.updatePlayStatus(true);
this.player?.play();
this.curState = 'STOPPED';
this.curError = Constants.ERROR_BY_DEFAULT;
if(this.closePipCallBack){
  // 一次性方法
  this.closePipCallBack()
  this.closePipCallBack = undefined
}
break;
分享
微博
QQ
微信
回复
2天前
相关问题
HarmonyOS @ohos.PiPWindow开启画中画示例
129浏览 • 1回复 待解决
HarmonyOS 画中画
102浏览 • 1回复 待解决
HarmonyOS 画中画视频无法播放
207浏览 • 1回复 待解决
HarmonyOS 画中画无法指定窗体大小
103浏览 • 1回复 待解决
HarmonyOS 音视频画中画功能demo
188浏览 • 1回复 待解决
鸿蒙提供画中画功能要怎么实现?
1120浏览 • 1回复 待解决