HarmonyOS 鸿蒙Next视频类app进入应用悬浮框后,如何设置修改应用悬浮窗大小,完成横屏播放适配

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

HarmonyOS 鸿蒙Next视频类app进入应用悬浮框后,如何设置修改应用悬浮窗大小,完成横屏播放适配 咨询描述:视频类app进入应用悬浮框后,如何设置修改应用悬浮窗大小,完成横屏播放适配

希望在应用悬浮窗中,播放器横屏后,应用悬浮窗可以改变大小完成适配

如同上传图片的:example1到example2状态。

我们app目前全屏的方案是设置windowStage?.getMainWindow.setPreferredOrientation(Window.Orientation.AUTO_ROTATION_LANDSCAPE)实现的app横屏,调用之后修改播放器view宽高为屏幕高宽

图3是我们app在应用悬浮窗中,播放器横屏现状


更多关于HarmonyOS 鸿蒙Next视频类app进入应用悬浮框后,如何设置修改应用悬浮窗大小,完成横屏播放适配的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复
  1. 启动页:
import { window, router } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

function titleButton() {
  .backgroundColor('#00000000')
  .width('32vp')
  .height('32vp')
  .borderRadius('4vp')
}

@Entry
@Component
struct PortraitUI {
  private windowClass: window.Window | undefined = undefined;
  @State videoSrc: Resource = $rawfile('videoTest.mp4')
  @State previewUri: Resource = $r('app.media.startIcon')
  @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X

  aboutToAppear(): void {
    try {
      window.getLastWindow(getContext(this), (err: BusinessError, windowClass) => {
        const errCode: number = err.code;
        if (errCode) {
          console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err));
          return;
        }
        this.windowClass = windowClass;
        windowClass.disableLandscapeMultiWindow(); // 旋转至竖屏关闭横屏多窗
        windowClass.setWindowLayoutFullScreen(false); //设置非沉浸式布局
      });
    } catch (exception) {
      console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(exception));
    }
  }

  build() {
    RelativeContainer() {
      Stack() {
        Video({
          src: this.videoSrc,
          previewUri: this.previewUri,
          currentProgressRate: this.curRate
        })
          .objectFit(ImageFit.Contain)
          .controls(true)
          .autoPlay(false)
          .loop(true)
          .width('100%')
          .height('30%')
          .onFullscreenChange(() => {
            this.windowClass?.setPreferredOrientation(window.Orientation.LANDSCAPE, () => {
              router.pushUrl({ url: 'pages/LandScapeUI' });
            });
          })
        Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) {
          Button() {
            Image($r('app.media.ic_back'))
              .height('100%')
              .aspectRatio(1)
          }
          .titleButton()

          Button() {
            Image($r('app.media.ic_share'))
              .height('100%')
              .aspectRatio(1)
          }
          .titleButton()
        }
        .margin({
          left: '16vp',
          top: '16vp',
          right: '16vp'
        })
        .position({ y: 0 })
      }
    }
    .alignRules({
      center: { anchor: '__container__', align: VerticalAlign.Center },
      middle: { anchor: '__container__', align: HorizontalAlign.Center }
    })
  }
}
  1. 横屏页:
import { window, router } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';

function titleButton() {
  .backgroundColor('#00000000')
  .width('32vp')
  .height('32vp')
  .borderRadius('4vp')
}

@Entry
@Component
struct LandScapeUI {
  private windowClass: window.Window | undefined = undefined;
  @State videoSrc: Resource = $rawfile('videoTest.mp4')
  @State previewUri: Resource = $r('app.media.startIcon')
  @State curRate: PlaybackSpeed = PlaybackSpeed.Speed_Forward_1_00_X

  aboutToAppear(): void {
    try {
      window.getLastWindow(getContext(this), (err: BusinessError, windowClass) => {
        const errCode: number = err.code;
        if (errCode) {
          console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(err));
          return;
        }
        this.windowClass = windowClass;
        windowClass.enableLandscapeMultiWindow(); // 旋转至横屏开启横屏多窗
        windowClass.setWindowLayoutFullScreen(false);
      });
    } catch (exception) {
      console.error('Failed to obtain the top window. Cause: ' + JSON.stringify(exception));
    }
  }

  build() {
    RelativeContainer() {
      Stack() {
        Video({
          src: this.videoSrc,
          previewUri: this.previewUri,
          currentProgressRate: this.curRate
        })
          .objectFit(ImageFit.Contain)
          .controls(true)
          .autoPlay(false)
          .loop(true)
          .width('100%')
          .height('100%')

        Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) {
          Button() {
            Image($r('app.media.ic_back'))
              .height('100%')
              .aspectRatio(1)
          }
          .titleButton()
          .onClick(() => {
            this.windowClass?.setPreferredOrientation(window.Orientation.PORTRAIT, () => {
              router.pushUrl({ url: 'pages/PortraitUI' });
            });
          })

          Button() {
            Image($r('app.media.ic_share'))
              .height('100%')
              .aspectRatio(1)
          }
          .titleButton()
        }
        .margin({
          left: '16vp',
          top: '16vp',
          right: '16vp'
        })
        .position({ y: 0 })
      }
    }
    .backgroundColor('#ff0048fd')
    .height('100%')
    .width('100%')
  }
}
  1. 设置

在module.json5配置文件中abilities标签下的 “preferMultiWindowOrientation”: "landscape_auto"设置一下

更多关于HarmonyOS 鸿蒙Next视频类app进入应用悬浮框后,如何设置修改应用悬浮窗大小,完成横屏播放适配的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,针对视频类应用进入悬浮窗模式后调整悬浮窗大小及实现横屏播放适配的操作,通常依赖于应用自身的UI设计和系统提供的悬浮窗管理API。以下是如何进行这些设置的基本步骤:

  1. 调整悬浮窗大小:

    • 在应用内打开视频并启用悬浮窗模式。
    • 大多数鸿蒙应用支持通过边缘拖拽来调整悬浮窗的大小。尝试触摸悬浮窗的边缘并向内或向外拖动,以调整窗口尺寸。
    • 如果应用未提供此类交互,可能需要在应用的设置菜单中查找相关选项,但这类情况较少。
  2. 横屏播放适配:

    • 悬浮窗模式下,应用是否支持横屏播放通常取决于应用本身的适配情况。
    • 如果应用支持,旋转设备屏幕通常会自动触发横屏播放模式。
    • 若应用未自动适配,可能需要在应用内手动开启横屏模式,但这通常需要在应用设置或系统屏幕旋转设置中调整。

请注意,具体操作可能因应用版本和系统更新而异。如果上述方法无法解决问题,可能是由于应用本身未完全适配鸿蒙系统的悬浮窗功能。此时,建议直接联系应用开发者获取支持。

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

回到顶部