9 悬浮窗

9.1 概述

悬浮窗功能指的是支持播放器在一个可拖动位置、可改变大小、视图层级位于最顶层的窗口进行播放。我们在 demo 中提供了两种悬浮窗出现的交互,一种是当页面滚动到(固定在页面顶部的)播放器底部消失时,出现悬浮小窗并继续播放视频,大播放器出现时,悬浮窗消失;另一种是点击播放器皮肤上的悬浮窗按钮,导航回上个页面,视频在悬浮窗上继续播放。

9.2 快速集成

9.2.1 SDK 版本

悬浮窗功能不涉及 SDK 的改动,使用该功能无需升级到特定的 SDK 版本,不过开发该功能时使用的 SDK 版本是 2.8.0,建议不要使用版本落后太大的版本,以免产生不必要的问题,该功能的测试均基于 v2.8.0 的 SDK。

9.2.2 开源代码

悬浮窗功能代码全部都是开源的,位于 demo 项目的文件夹 PolyvOpenSourceModule/Floating 中,请把 demo 的代码更新到版本 2.8.0 以上,然后把这个文件夹下的代码拖到你的项目中。该文件夹下的文件目录如下:

├── Floating

​ ├── PLVVFloatingPlayerViewController.h/m

​ ├── Resource ​ └── FloatingWindow ​ ├── PLVVFloatingWindow.h/m ​ ├── PLVVFloatingWindowSkin.h/m ​ └── PLVVFloatingWindowViewController.h/m

文件夹 Resource 下面是悬浮窗功能所需要的资源文件,FloatingWindow 是悬浮窗的所有代码,PLVVFloatingPlayerViewController 类为悬浮窗功能示例代码,建议在我们的示例代码基础上进行集成。

同时,需将 PolyvOpenSourceModule/Skin 文件夹下的代码也更新到 2.8.0 版本以上,以支持悬浮窗功能。

9.2.3 demo 示例

在视频列表页面添加以下头文件:

PLVVFloatingPlayerViewController 类有两个初始化方法:

  • -initWithPlayer: 当前已出现悬浮窗且播放视频 vid 相同时使用。

  • -initWithVid: 当前未出现悬浮窗,或悬浮窗播放视频与即将播放视频 vid 不同。

使用这两个方法进行页面跳转的代码示例如下,详细可参考 PLVAccountVideoListController 类。

9.3 悬浮窗窗口

悬浮窗窗口 PLVVFloatingWindowUIWindow 类单例,windowLevelUIWindowLevelNormal + 1,默认 hidden 属性为 YES。悬浮窗宽高比为 16:9,窗口宽度默认为屏幕宽度的 1/2。

按住悬浮窗左上角可进行缩放,窗口宽度的缩放范围为大于 160 pt,小于屏幕宽。使用以下方法可使窗口恢复初始尺寸、初始位置。

9.4 悬浮窗窗口控制器

PLVVFloatingWindowViewController 为悬浮窗窗口的根控制器,可通过悬浮窗口 PLVVFloatingWindow 的属性 contentVctrl 获取:

控制器 PLVVFloatingWindowViewController 的只读属性 vidplayer 除了能用于获取当前悬浮窗持有的播放器(如果有的话)以及播放视频的 vid,还可用于判断当前悬浮窗是否正在播放视频,没有播放视频时这两个属性值均为 $nil$。

以下方法用于把页面上的播放器置于悬浮窗上,使用示例详见类 PLVVFloatingPlayerViewController

其中,PLVVFloatingWindowProtocol 规定了使用悬浮窗的页面需要遵循的协议。

以下方法用于移除或销毁悬浮窗口播放器:

控制器 PLVVFloatingWindowViewController 还定义了以下广播事件,在进入/退出悬浮窗模式时会发送广播到所有 observer

9.5 悬浮窗窗口皮肤

悬浮窗播放器的皮肤 PLVVFloatingWindowSkin 由悬浮窗口的根控制器 PLVVFloatingWindowViewController 持有,包含了【关闭悬浮窗】按钮、【Exchange】 按钮、【播放/暂停】按钮。悬浮窗播放器皮肤的持有者需遵循协议 PLVVFloatingWindowSkinProtocol 作为 delegate 以响应皮肤上的按钮:

此外,通过 SDK 播放器类 PLVVodPlayerViewController 的播放状态回调 playbackStateHandler,调用方法 -statusIsPlaying: 实时更新皮肤上【播放/暂停】按钮的状态:

self.windowSkin 为悬浮窗播放器皮肤的实例对象,self.playerPLVVodPlayerViewController 的实例对象。

Last updated

Was this helpful?