目录

画中画开发概述

场景介绍

应用在视频播放、视频会议、视频通话等场景下,可以使用画中画能力将视频内容以小窗(画中画)模式呈现。切换为小窗(画中画)模式后,用户可以进行其他界面操作,提升使用体验。

画中画的常见使用场景有以下几种:

系统提供以下三种画中画功能的开发方式:

约束与限制

接口说明

以下是画中画功能的常用ArkTS接口,更多接口及使用参考@ohos.PiPWindow (画中画窗口)。

接口名 描述
isPiPEnabled(): boolean 判断当前系统是否开启画中画功能。
create(config: PiPConfiguration): Promise<PiPController> 创建画中画控制器。
create(config: PiPConfiguration, contentNode: typeNode.XComponent): Promise<PiPController> 使用typeNode创建画中画控制器。
startPiP(): Promise<void> 启动画中画。
stopPiP(): Promise<void> 停止画中画。
setAutoStartEnabled(enable: boolean): void 设置是否需要在应用退后台时自动启动画中画,true表示需要自动启动,false表示不需要自动启动。
updateContentSize(width: number, height: number): void 当媒体源切换时,向画中画控制器更新媒体源尺寸信息。
on(type: 'stateChange', callback: (state: PiPState, reason: string) => void): void 开启画中画生命周期状态的监听。
off(type: 'stateChange'): void 关闭画中画生命周期状态的监听。
on(type: 'controlPanelActionEvent', callback: ControlPanelActionEventCallback): void 开启画中画控制面板控件动作事件的监听。推荐使用on('controlEvent')来开启画中画控制面板控件动作事件的监听。
off(type: 'controlPanelActionEvent'): void 关闭画中画控制面板控件动作事件的监听。推荐使用off('controlEvent')来关闭画中画控制面板控件动作事件的监听。
updatePiPControlStatus(controlType: PiPControlType, status: PiPControlStatus): void 更新画中画控制面板控件状态。
setPiPControlEnabled(controlType: PiPControlType, enabled: boolean): void 设置控制面板控件使能状态。
on(type: 'controlEvent', callback: CallBack<ControlEventParam>): void 开启画中画控制面板控件动作事件的监听。
off(type: 'controlEvent', callback?: CallBack<ControlEventParam>): void 关闭画中画控制面板控件动作事件的监听。

以下是画中画功能的常用NDK接口,更多接口及使用参考oh_window_pip.h。

接口名 描述
int32_t OH_PictureInPicture_CreatePipConfig(PictureInPicture_PipConfig* pipConfig) 创建画中画参数配置器。
int32_t OH_PictureInPicture_DestroyPipConfig(PictureInPicture_PipConfig* pipConfig) 销毁画中画参数配置器。
int32_t OH_PictureInPicture_CreatePip(PictureInPicture_PipConfig pipConfig, uint32_t* controllerId) 创建画中画控制器。
int32_t OH_PictureInPicture_DeletePip(uint32_t controllerId) 删除画中画控制器。
int32_t OH_PictureInPicture_StartPip(uint32_t controllerId) 启动画中画。
int32_t OH_PictureInPicture_StopPip(uint32_t controllerId) 停止画中画。
int32_t OH_PictureInPicture_UpdatePipContentSize(uint32_t controllerId, uint32_t width, uint32_t height) 当媒体源切换时,向画中画控制器更新媒体源尺寸信息。
int32_t OH_PictureInPicture_UpdatePipControlStatus(uint32_t controllerId, PictureInPicture_PipControlType controlType, PictureInPicture_PipControlStatus status) 更新画中画控制面板控件状态。
int32_t OH_PictureInPicture_SetPipControlEnabled(uint32_t controllerId, PictureInPicture_PipControlType controlType, bool enabled) 设置画中画控制面板控件使能状态。
int32_t OH_PictureInPicture_RegisterStartPipCallback(uint32_t controllerId, WebPipStartPipCallback callback) 开启画中画surface创建完成的监听。
int32_t OH_PictureInPicture_UnregisterStartPipCallback(uint32_t controllerId, WebPipStartPipCallback callback) 关闭画中画surface创建完成的监听。
int32_t OH_PictureInPicture_RegisterLifecycleListener(uint32_t controllerId, WebPipLifeCycleCallback callback) 开启画中画生命周期状态的监听。
int32_t OH_PictureInPicture_UnregisterLifecycleListener(uint32_t controllerId, WebPipLifeCycleCallback callback) 关闭画中画生命周期状态的监听。
int32_t OH_PictureInPicture_RegisterControlEventListener(uint32_t controllerId, WebPipControlEventCallback callback) 开启画中画控制面板控件动作事件的监听。
int32_t OH_PictureInPicture_UnregisterControlEventListener(uint32_t controllerId, WebPipControlEventCallback callback) 关闭画中画控制面板控件动作事件的监听。
int32_t OH_PictureInPicture_RegisterResizeListener(uint32_t controllerId, WebPipResizeCallback callback) 开启画中画窗口尺寸变化事件的监听。
int32_t OH_PictureInPicture_UnregisterResizeListener(uint32_t controllerId, WebPipResizeCallback callback) 关闭画中画窗口尺寸变化事件的监听。

交互方式

画中画窗口提供以下交互方式:

画中画控制层提供以下功能:

图1 不同场景下画中画控制层的不同呈现

配置画中画控制层可选控件

在使用create接口创建画中画时,可通过在PiPConfiguration中新增PiPControlGroup类型的数组配置当前画中画控制层控件。

在画中画内容上方展示自定义UI

在使用create接口创建画中画时,可通过在PiPConfiguration中传入customUIController来显示自定义UI。

自定义显示的UI无法响应交互事件。

图6 在画中画内容上方显示自定义UI

更新画中画控制面板控件状态

应用可以使用updatePiPControlStatus接口更新控制面板控件的功能状态,如将视频播放模板下VIDEO_PLAY_PAUSE控件的播放状态更改为暂停状态,见下图。

应用也可以使用setPiPControlEnabled接口设置控制面板控件的使能状态,如将视频播放模板下VIDEO_PREVIOUS控件从可点击状态变为不可点击状态,见下图。

图7 更新控件功能状态

图8 设置控件使能状态