#鸿蒙通关秘籍#如何实现HarmonyOS媒体全屏切换功能?

HarmonyOS
6天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
星辰巅SKU

在HarmonyOS中实现媒体全屏与窗口模式之间的切换功能,主要通过@ohos.multimedia.media组件和@ohos.window接口实现。以下是详细步骤:

  1. 初始化AVPlayer:

    • 使用getContext(this)从上下文获取资源,并通过资源管理器获取文件描述符。
    • 创建AVPlayer实例并设置fdSrc为获取的文件描述符。
    async Init(): Promise<void> {
      await this.release();
      const context = getContext(this);
      context.resourceManager.getRawFd(this.fileName).then(async (value: resourceManager.RawFileDescriptor) => {
        this.avPlayer = await media.createAVPlayer();
        this.isCreate = true;
        this.setSourceInfo();
        this.setStateChangeCallback();
        this.avPlayer.fdSrc = {
          fd: value.fd,
          offset: value.offset,
          length: value.length
        };
      });
    }
    
  2. 设置SurfaceID以将AVPlayer绑定到XComponent:

    • 在AVPlayer初始化后的initialized状态,将surfaceId与XComponent绑定。
    setSurfaceID(): void {
      logger.info('play video: surfaceID is:' + this.surfaceID);
      this.avPlayer.surfaceId = this.surfaceID;
    }
    
  3. 实现窗口动画效果:

    • 使用animateTo方法设置窗口的全屏动画效果,同时改变方向和全屏状态。
    animateTo({
      duration: ANIMATE_DURATION,
      onFinish: () => {
        this.isLandscape = !this.isLandscape;
      }
    }, () => {
      this.isFullScreen = !this.isFullScreen;
    });
    
  4. 控制窗口显示与方向:

    • 使用window.getLastWindow获取当前应用窗口实例,并设置窗口的系统栏显示、显示方向和沉浸式布局等属性。
    changeOrientation() {
      let context = getContext(this);
      window.getLastWindow(context).then((lastWindow) => {
        if (this.isLandscape) {
          lastWindow.setWindowLayoutFullScreen(true, () => {
            lastWindow.setWindowSystemBarEnable([]);
            lastWindow.setPreferredOrientation(window.Orientation.AUTO_ROTATION_LANDSCAPE);
          });
        } else {
          lastWindow.setPreferredOrientation(window.Orientation.UNSPECIFIED, () => {
            lastWindow.setWindowSystemBarEnable(WINDOW_SYSTEM_BAR, () => {
              lastWindow.setWindowLayoutFullScreen(false, () => {
                setTimeout(() => {
                  animateTo({
                    duration: ANIMATE_DURATION,
                    onFinish: () => {
                      this.fileName = '';
                    }
                  }, () => {
                    this.isFullScreen = !this.isFullScreen;
                  });
                }, TIMEOUT_DURATION);
              });
            });
          });
        }
      });
    }
    
分享
微博
QQ
微信
回复
6天前
相关问题
如何实现媒体会话交互功能
657浏览 • 1回复 待解决
禁用窗口的全屏显示功能如何实现
370浏览 • 1回复 待解决