HarmonyOS鸿蒙NEXT视频悬浮窗案例

HarmonyOS鸿蒙NEXT视频悬浮窗案例

HarmonyOS Next应用开发案例(持续更新中……)

本案例完整代码,请访问:https://gitee.com/harmonyos-cases/cases/tree/master/CommonAppDevelopment/feature/pipwindow

本案例已上架 HarmonyOS NEXT 开源组件市场,如需获取或移植该案例,可安装此插件。开发者可使用插件获取鸿蒙组件,添加到业务代码中直接编译运行。

介绍

本示例主要介绍视频小窗口播放场景,利用媒体的AVPlayer实现视频播放以及相关操作,利用PiPWindow开启悬浮窗从而实现小窗口播放视频。

效果图预览

视频播放效果

使用说明

  1. 等待视频加载完成,视频会自动播放。
  2. 将应用隐藏到后台,自动拉起悬浮窗继续播放视频。
  3. 点击悬浮窗恢复图标,恢复到原始播放界面,视频继续正常播放。
  4. 原始播放界面视频暂停不会拉起悬浮窗。
  5. 悬浮窗视频暂停后,再点击恢复图标,原始播放界面视频继续播放。
  6. 悬浮窗点击关闭之后,原始播放界面视频暂停。
  7. 点击原视频界面小窗口图标,可开启悬浮窗。
  8. 手指在原视频左侧滑动可改变视频页面的亮度(需真机验证)。
  9. 手指在原视频右侧滑动可改变视频的声音(需真机验证,注:本案例使用的视频暂无声音,开发者可更换视频资源验证该功能)。

下载安装

模块oh-package.json5文件中引入依赖

"dependencies": {
  "[@ohos](/user/ohos)/compressfile": "har包地址"
}

ets文件import自定义视图实视频悬浮窗组件

import { PipWindowComponent } from '[@ohos](/user/ohos)/pipwindow';

快速使用

本节主要介绍了如何快速上手使用视频悬浮窗组件,包括调节视频亮度声音控制器组件以及常见自定义参数的初始化。

构建组件

在代码合适的位置使用PipWindowComponent组件并传入对应的参数,后续将介绍对应参数的初始化。

/**
 * 画中画控制开启、播放组件
 * player:初始化视频播放控制器
 * url:传入在线视频资源
 */
PipWindowComponent({
  player: this.player,
  url: this.url
})

各参数初始化,player可直接写PipManager.getInstance().player,url必须为在线mp4视频。

@State player: AVPlayer = PipManager.getInstance().player; // 初始化视频播放控制器
@State url: string = ""; // 传入在线视频资源

属性(接口)说明

PipWindowComponent组件属性

属性 类型 释义 默认值
player AVPlayer 初始化视频播放控制器 -
url string 传入在线视频资源 -

实现思路

本例涉及的关键特性和实现方案如下:

  1. 使用媒体的AVPlayer实现视频播放,源码参考 AVPlayer.ets

  2. 使用PiPWindow开启悬浮窗从而实现小窗口播放视频,源码参考 PipManager.ets

  3. 通过绑定同一个XComponent控制器使得视频页面和悬浮窗页面视频保持统一播放进度,源码参考 XComponentView.ets

  4. 使用@Watch监听AVPlayer的发生变化时,会触发onPlayingChange的回调方法。组件中需要手动控制视频的播放与暂停,因为视频的播放状态是需要根据视频加载进度和手动控制来改变的,所以可以使用@Watch进行监听,源码参考 PipWindowComponent.ets

  5. 悬浮窗的从小窗口恢复到原始播放界面以及关闭悬浮窗,需要通过相关生命周期来进行控制视频的播放状态,源码参考 PipManager.ets

  6. 因为当悬浮窗的从小窗口恢复到原始播放界面以及关闭悬浮窗时对视频播放状态进行操作,悬浮窗的播放图标并不会实时更新,所以手动进行更新,源码参考 PipManager.ets

  7. 使用onAreaChange来获取原视频页面的播放区域宽高,源码参考 PipWindowComponent.ets

  8. 使用PanGesture来确定手指滑动的方向以及移动的距离从而改变实时改变视频的亮度和声音,源码参考 PipWindowComponent.ets

工程结构&模块类型

pipwindow                                   // har类型
|---components
|   |---ControlPanel.ets                    // 组件层-视频亮度、音量控制器
|   |---PipWindowView.ets                   // 组件层-应用主页面
|   |---PipWindowComponent.ets              // 组件层-视频悬浮穿页面
|   |---VideoInfoComponent.ets              // 组件层-视频详情介绍页面
|   |---XComponentView.ets                  // 组件层-视频播放组件
|---model 
|   |---AVPlayer.ets                        // 模型层-媒体相关操作基本实现
|   |---PipManager.ets                      // 模型层-画中画相关操作基本实现
|---util
|   |---Logger.ets                          // 日志
|   |---TimeTools.ets                       // 时间轴组件页面

模块依赖

[@ohos/routermodule(动态路由)](https://gitee.com/harmonyos-cases/cases/tree/master/CommonAppDevelopment/common/routermodule)

参考资料


更多关于HarmonyOS鸿蒙NEXT视频悬浮窗案例的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

赞,

基本信息

  • 姓名:张三
  • 年龄:28
  • 职业:软件工程师

代码示例

def hello_world():
    print("Hello, world!")

更多关于HarmonyOS鸿蒙NEXT视频悬浮窗案例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS鸿蒙NEXT的视频悬浮窗案例展示了如何在鸿蒙系统中实现视频播放的悬浮窗功能。该功能允许用户在观看视频时,将视频窗口浮动在其他应用之上,便于多任务操作。

实现该功能的关键技术包括:

  1. WindowManager:通过WindowManager服务,管理悬浮窗的创建、显示和销毁。可以使用addViewremoveView方法来控制悬浮窗的显示和隐藏。

  2. SurfaceView:用于视频播放的视图组件,SurfaceView可以在独立的线程中绘制视频内容,避免阻塞主线程。

  3. WindowManager.LayoutParams:用于设置悬浮窗的布局参数,包括位置、大小、透明度等。

  4. 手势识别:通过手势识别技术,实现悬浮窗的拖动、缩放等交互操作。

  5. 权限管理:在鸿蒙系统中,悬浮窗功能需要申请SYSTEM_ALERT_WINDOW权限,确保应用可以在其他应用之上显示悬浮窗。

代码示例:

import window from '@ohos.window';

// 创建悬浮窗
let windowManager = window.getWindowManager();
let layoutParams = {
    type: window.WindowType.TYPE_SYSTEM_ALERT,
    width: 300,
    height: 200,
    x: 100,
    y: 100,
    flags: window.WindowFlags.FLAG_NOT_FOCUSABLE
};
let floatingWindow = windowManager.createWindow(context, layoutParams);

// 显示悬浮窗
floatingWindow.show();

// 销毁悬浮窗
floatingWindow.destroy();

通过以上技术,可以实现鸿蒙系统中的视频悬浮窗功能,提升用户体验。

在HarmonyOS鸿蒙NEXT中,视频悬浮窗功能可以通过WindowManagerAbilitySlice实现。首先,在config.json中声明SYSTEM_ALERT_WINDOW权限。然后,使用WindowManager创建一个悬浮窗口,并设置其布局和尺寸。通过VideoView组件加载视频,并将其添加到悬浮窗口中。最后,通过WindowManageraddView方法将悬浮窗口显示在屏幕上。用户可以通过触摸事件移动或关闭悬浮窗。此功能适用于多任务场景,提升用户体验。

回到顶部