• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.PiPWindow (画中画窗口)
2
3该模块提供画中画基础功能,包括判断当前系统是否开启画中画功能,以及创建画中画控制器用于启动、停止画中画等。主要用于视频播放、视频通话或视频会议场景下,以小窗(画中画)模式呈现内容。
4
5> **说明:**
6>
7> 本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8>
9> 需要在支持SystemCapability.Window.SessionManager能力的系统上使用该模块,<!--RP1-->参考[系统能力SystemCapability使用指南](../syscap.md)<!--RP1End-->。
10
11## 导入模块
12
13```ts
14import { PiPWindow } from '@kit.ArkUI';
15```
16
17## PiPWindow.isPiPEnabled
18
19isPiPEnabled(): boolean
20
21用于判断当前系统是否支持画中画功能。
22
23**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
24
25**系统能力:** SystemCapability.Window.SessionManager
26
27**返回值:**
28
29| 类型       | 说明                                  |
30|----------|-------------------------------------|
31| boolean  | 当前系统是否开启画中画功能。true表示支持,false则表示不支持。 |
32
33**示例:**
34
35```ts
36let enable: boolean = PiPWindow.isPiPEnabled();
37console.info('isPipEnabled:' + enable);
38```
39
40## PiPWindow.create
41
42create(config: PiPConfiguration): Promise&lt;PiPController&gt;
43
44创建画中画控制器,使用Promise异步回调。
45
46**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
47
48**系统能力:** SystemCapability.Window.SessionManager
49
50**参数:**
51
52| 参数名          | 类型                                       | 必填        | 说明                                                                                                                                                                                                                                     |
53|--------------|------------------------------------------|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
54| config       | [PiPConfiguration](#pipconfiguration)    | 是         | 创建画中画控制器的参数。该参数不能为空,并且构造该参数的context和componentController不能为空。构造该参数时,如果指定了templateType,需保证templateType是[PiPTemplateType](#piptemplatetype)类型;如果指定了controlGroups,需保证controlGroups与templateType匹配,详见[PiPControlGroup](#pipcontrolgroup12)。 |
55
56**返回值:**
57
58| 类型                                                         | 说明                       |
59|------------------------------------------------------------|--------------------------|
60| Promise&lt;[PiPController](#pipcontroller)&gt;  | Promise对象。返回当前创建的画中画控制器。 |
61
62**错误码:**
63
64以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
65
66| 错误码ID | 错误信息                                                                                                                                         |
67|-------|----------------------------------------------------------------------------------------------------------------------------------------------|
68| 401   | Params error. Possible causes: 1.Mandatory parameters are left unspecified. 2.Incorrect parameter types. 3.Parameter verification failed. |
69| 801   | Capability not supported.Failed to call the API due to limited device capabilities.                                                       |
70
71**示例:**
72
73```ts
74import { BusinessError } from '@kit.BasicServicesKit';
75import { BuilderNode, FrameNode, NodeController, Size, UIContext } from '@kit.ArkUI';
76
77class Params {
78  text: string = '';
79  constructor(text: string) {
80    this.text = text;
81  }
82}
83
84// 开发者可以通过@Builder装饰器实现布局构建
85@Builder
86function buildText(params: Params) {
87  Column() {
88    Text(params.text)
89      .fontSize(20)
90      .fontColor(Color.Red)
91  }
92  .width('100%') // 宽度方向充满画中画窗口
93  .height('100%') // 高度方向充满画中画窗口
94}
95
96// 开发者可通过继承NodeController实现自定义UI控制器
97class TextNodeController extends NodeController {
98  private message: string;
99  private textNode: BuilderNode<[Params]> | null = null;
100  constructor(message: string) {
101    super();
102    this.message = message;
103  }
104
105  // 通过BuilderNode加载自定义布局
106  makeNode(context: UIContext): FrameNode | null {
107    this.textNode = new BuilderNode(context);
108    this.textNode.build(wrapBuilder<[Params]>(buildText), new Params(this.message));
109    return this.textNode.getFrameNode();
110  }
111
112  // 开发者可自定义该方法实现布局更新
113  update(message: string) {
114    console.log(`update message: ${message}`);
115    if (this.textNode !== null) {
116      this.textNode.update(new Params(message));
117    }
118  }
119}
120
121let pipController: PiPWindow.PiPController | undefined = undefined;
122let mXComponentController: XComponentController = new XComponentController(); // 开发者应使用该mXComponentController初始化XComponent: XComponent( {id: 'video', type: 'surface', controller: mXComponentController} ),保证XComponent的内容可以被迁移到画中画窗口。
123let nodeController: TextNodeController = new TextNodeController('this is custom UI');
124let navId: string = "page_1"; // 假设当前页面的导航id为page_1,详见PiPConfiguration定义,具体导航名称由开发者自行定义。
125let contentWidth: number = 800; // 假设当前内容宽度800px。
126let contentHeight: number = 600; // 假设当前内容高度600px。
127let config: PiPWindow.PiPConfiguration = {
128  context: getContext(this),
129  componentController: mXComponentController,
130  navigationId: navId,
131  templateType: PiPWindow.PiPTemplateType.VIDEO_PLAY,
132  contentWidth: contentWidth,
133  contentHeight: contentHeight,
134  controlGroups: [PiPWindow.VideoPlayControlGroup.VIDEO_PREVIOUS_NEXT],
135  customUIController: nodeController, // 可选,如果需要在画中画显示内容上方展示自定义UI,可设置该参数。
136};
137
138let promise : Promise<PiPWindow.PiPController> = PiPWindow.create(config);
139promise.then((data : PiPWindow.PiPController) => {
140  pipController = data;
141  console.info(`Succeeded in creating pip controller. Data:${data}`);
142}).catch((err: BusinessError) => {
143  console.error(`Failed to create pip controller. Cause:${err.code}, message:${err.message}`);
144});
145```
146
147## PiPWindow.create<sup>12+</sup>
148
149create(config: PiPConfiguration, contentNode: typeNode.XComponent): Promise&lt;PiPController&gt;
150
151通过typeNode创建画中画控制器,使用Promise异步回调。
152
153**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
154
155**系统能力:** SystemCapability.Window.SessionManager
156
157**参数:**
158
159| 参数名          | 类型                                       | 必填        | 说明                                                                                                                                                                                                                                     |
160|--------------|------------------------------------------|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
161| config       | [PiPConfiguration](#pipconfiguration)    | 是         | 创建画中画控制器的参数。该参数不能为空,并且构造该参数的context不能为空。构造该参数时,如果指定了templateType,需保证templateType是[PiPTemplateType](#piptemplatetype)类型;如果指定了controlGroups,需保证controlGroups与templateType匹配,详见[PiPControlGroup](#pipcontrolgroup12)。 |
162| contentNode       | [typeNode.XComponent](js-apis-arkui-frameNode.md#xcomponent12)    | 是         | 用于渲染画中画窗口中的内容。该参数不能为空。|
163
164**返回值:**
165
166| 类型                                                         | 说明                       |
167|------------------------------------------------------------|--------------------------|
168| Promise&lt;[PiPController](#pipcontroller)&gt;  | Promise对象。返回当前创建的画中画控制器。 |
169
170**错误码:**
171
172以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
173
174| 错误码ID | 错误信息                                                                                                                                         |
175|-------|----------------------------------------------------------------------------------------------------------------------------------------------|
176| 401   | Params error. Possible causes: 1.Mandatory parameters are left unspecified. 2.Incorrect parameter types. 3.Parameter verification failed. |
177| 801   | Capability not supported.Failed to call the API due to limited device capabilities.                                                       |
178
179**示例:**
180
181```ts
182import { BusinessError } from '@kit.BasicServicesKit';
183import { PiPWindow, UIContext } from '@kit.ArkUI';
184import { typeNode } from '@ohos.arkui.node';
185
186let pipController: PiPWindow.PiPController | undefined = undefined;
187let xComponentController: XComponentController = new XComponentController();
188let context: UIContext | undefined = undefined; // 可传入UIContext或在布局中通过this.getUIContext()为context赋有效值
189let xComponent = typeNode.createNode(context, 'XComponent');
190xComponent.initialize({
191  id:'xcomponent',
192  type:XComponentType.SURFACE,
193  controller:xComponentController
194});
195let contentWidth: number = 800; // 假设当前内容宽度800px。
196let contentHeight: number = 600; // 假设当前内容高度600px。
197let config: PiPWindow.PiPConfiguration = {
198  context: getContext(this),
199  componentController: xComponentController,
200  templateType: PiPWindow.PiPTemplateType.VIDEO_PLAY,
201  contentWidth: contentWidth,
202  contentHeight: contentHeight
203};
204
205let promise : Promise<PiPWindow.PiPController> = PiPWindow.create(config, xComponent);
206promise.then((data : PiPWindow.PiPController) => {
207  pipController = data;
208  console.info(`Succeeded in creating pip controller. Data:${data}`);
209}).catch((err: BusinessError) => {
210  console.error(`Failed to create pip controller. Cause:${err.code}, message:${err.message}`);
211});
212```
213
214## PiPConfiguration
215
216创建画中画控制器时的参数。
217
218**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
219
220**系统能力:** SystemCapability.Window.SessionManager
221
222| 名称                  | 类型                                                                         | 必填  | 说明                                                                                                                                                                                                                                                                                                                                        |
223|---------------------|----------------------------------------------------------------------------|-----|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
224| context             | [BaseContext](../apis-ability-kit/js-apis-inner-application-baseContext.md) | 是   | 表示上下文环境。                                                                                                                                                                                                                                                                                                                                  |
225| componentController | [XComponentController](arkui-ts/ts-basic-components-xcomponent.md#xcomponentcontroller) | 是   | 表示原始[XComponent](arkui-ts/ts-basic-components-xcomponent.md)控制器。                                                                                                                                                                                                                                                                      |
226| navigationId        | string                                                                     | 否   | 当前page导航id。<br/>1、UIAbility使用[Navigation](arkui-ts/ts-basic-components-navigation.md)管理页面,需要设置Navigation控件的id属性,并将该id设置给画中画控制器,确保还原场景下能够从画中画窗口恢复到原页面。<br/>2、UIAbility使用[Router](js-apis-router.md)管理页面时,无需设置navigationId。<br/>3、UIAbility只有单页面时,无需设置navigationId,还原场景下也能够从画中画窗口恢复到原页面。 |
227| templateType        | [PiPTemplateType](#piptemplatetype)                                        | 否   | 模板类型,用以区分视频播放、视频通话或视频会议。                                                                                                                                                                                                                                                                                                                  |
228| contentWidth        | number                                                                     | 否   | 原始内容宽度,单位为px。用于确定画中画窗口比例。当[使用typeNode的方式](#pipwindowcreate12)创建PiPController时,不传值则默认为1920。当[不使用typeNode的方式](#pipwindowcreate)创建PiPController时,不传值则默认为[XComponent](arkui-ts/ts-basic-components-xcomponent.md)组件的宽度。                                                                 |
229| contentHeight       | number                                                                     | 否   | 原始内容高度,单位为px。用于确定画中画窗口比例。用于确定画中画窗口比例。当[使用typeNode的方式](#pipwindowcreate12)创建PiPController时,不传值则默认为1080。当[不使用typeNode的方式](#pipwindowcreate)创建PiPController时,不传值则默认为[XComponent](arkui-ts/ts-basic-components-xcomponent.md)组件的高度。                                                                 |
230| controlGroups<sup>12+</sup>       | Array<[PiPControlGroup](#pipcontrolgroup12)>                               | 否   | 画中画控制面板的可选控件组列表,应用可以对此进行配置以决定是否显示。如果应用没有配置,面板将显示基础控件(如视频播放控件组的播放/暂停控件);如果应用选择配置,则最多可以选择三个控件。从API version 12开始支持此参数。                                                                                                                                                                                                                                                 |
231| customUIController<sup>12+</sup>      | [NodeController](js-apis-arkui-nodeController.md)           | 否   | 用于实现在画中画界面内容上方展示自定义UI功能。从API version 12开始支持此参数。                                                                                                                                                                                                                                                                                           |
232
233## PiPWindowSize<sup>15+</sup>
234
235画中画窗口大小。
236
237**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
238
239**系统能力:** SystemCapability.Window.SessionManager
240
241| 名称   | 类型 | 可读 | 可写 | 说明       |
242| ------ | -------- | ---- | ---- | ---------- |
243| width  | number   | 是   | 否   | 窗口宽度,单位为px,该参数应为正整数,不大于屏幕宽。 |
244| height | number   | 是   | 否   | 窗口高度,单位为px,该参数应为正整数,不大于屏幕高。 |
245| scale  | number   | 是   | 否   | 窗口缩放比,显示大小相对于width和height的缩放比,该参数为浮点数,取值范围大于0.0,小于等于1.0。等于1表示与width和height一样大。 |
246
247## PiPWindowInfo<sup>15+</sup>
248
249画中画窗口信息。
250
251**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
252
253**系统能力:** SystemCapability.Window.SessionManager
254
255| 名称   | 类型 | 可读 | 可写 | 说明       |
256| ------ | -------- | ---- | ---- | ---------- |
257| windowId  | number   | 是   | 否   | 画中画窗口ID。 |
258| size  | [PiPWindowSize](#pipwindowsize15)  | 是   | 否   | 画中画窗口大小。 |
259
260## PiPTemplateType
261
262画中画媒体类型枚举。
263
264**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
265
266**系统能力:** SystemCapability.Window.SessionManager
267
268| 名称            | 值   | 说明                                   |
269|---------------|-----|--------------------------------------|
270| VIDEO_PLAY    | 0   | 表示将要切换为画中画播放的媒体类型是视频,系统依此加载视频播放模板。   |
271| VIDEO_CALL    | 1   | 表示将要切换为画中画播放的媒体类型是视频通话,系统依此加载视频通话模板。 |
272| VIDEO_MEETING | 2   | 表示将要切换为画中画播放的媒体类型是视频会议,系统依此加载视频会议模板。 |
273| VIDEO_LIVE    | 3   | 表示将要切换为画中画播放的媒体类型是直播,系统依此加载直播模板。     |
274
275## PiPState
276
277画中画生命周期状态枚举。
278
279**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
280
281**系统能力:** SystemCapability.Window.SessionManager
282
283| 名称                   | 值   | 说明                    |
284|----------------------|-----|-----------------------|
285| ABOUT_TO_START       | 1   | 表示画中画将要启动。            |
286| STARTED              | 2   | 表示画中画已经启动。            |
287| ABOUT_TO_STOP        | 3   | 表示画中画将要停止。            |
288| STOPPED              | 4   | 表示画中画已经停止。            |
289| ABOUT_TO_RESTORE     | 5   | 表示画中画将从小窗播放恢复到原始播放界面。 |
290| ERROR                | 6   | 表示画中画生命周期执行过程出现了异常。   |
291
292## PiPControlGroup<sup>12+</sup>
293
294type PiPControlGroup = VideoPlayControlGroup | VideoCallControlGroup | VideoMeetingControlGroup | VideoLiveControlGroup
295
296画中画控制面板的可选控件组列表,应用可以配置是否显示可选控件。默认情况下控制面板只显示基础控件(如视频播放控件组的播放/暂停控件)。
297
298**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
299
300**系统能力:** SystemCapability.Window.SessionManager
301
302| 类型                                              | 说明          |
303|-------------------------------------------------|-------------|
304| [VideoPlayControlGroup](#videoplaycontrolgroup12)     | 视频播放控件组。 |
305| [VideoCallControlGroup](#videocallcontrolgroup12)       | 视频通话控件组。 |
306| [VideoMeetingControlGroup](#videomeetingcontrolgroup12) | 视频会议控件组。 |
307| [VideoLiveControlGroup](#videolivecontrolgroup12)     | 视频直播控件组。 |
308
309
310## VideoPlayControlGroup<sup>12+</sup>
311
312视频播放控件组枚举。仅当[PiPTemplateType](#piptemplatetype)为VIDEO_PLAY时使用。
313
314**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
315
316**系统能力:** SystemCapability.Window.SessionManager
317
318| 名称                   | 值   | 说明                    |
319|----------------------|-----|-----------------------|
320| VIDEO_PREVIOUS_NEXT       | 101   | 视频上一个/下一个控件组。<br/>与视频快进/后退控件组为互斥控件组。如添加视频快进/后退控件组,则不可添加该控件组。           |
321| FAST_FORWARD_BACKWARD    | 102   | 视频快进/后退控件组。<br/>与视频上一个/下一个控件组为互斥控件组。如添加视频上一个/下一个控件组,则不可添加该控件组。           |
322
323## VideoCallControlGroup<sup>12+</sup>
324
325视频通话控件组枚举。仅当[PiPTemplateType](#piptemplatetype) 为VIDEO_CALL时使用。
326
327**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
328
329**系统能力:** SystemCapability.Window.SessionManager
330
331| 名称                   | 值   | 说明                    |
332|----------------------|-----|-----------------------|
333| MICROPHONE_SWITCH       | 201   | 打开/关闭麦克风控件组。            |
334| HANG_UP_BUTTON    | 202   | 挂断控件组。           |
335| CAMERA_SWITCH    | 203   | 打开/关闭摄像头控件组。            |
336| MUTE_SWITCH    | 204   | 静音控件组。            |
337
338## VideoMeetingControlGroup<sup>12+</sup>
339
340视频会议控件组枚举。仅当[PiPTemplateType](#piptemplatetype) 为VIDEO_MEETING时使用。
341
342**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
343
344**系统能力:** SystemCapability.Window.SessionManager
345
346| 名称                   | 值   | 说明                    |
347|----------------------|-----|-----------------------|
348| HANG_UP_BUTTON       | 301   | 挂断控件组。          |
349| CAMERA_SWITCH    | 302   | 打开/关闭摄像头控件组。           |
350| MUTE_SWITCH    | 303   | 静音控件组。            |
351| MICROPHONE_SWITCH       | 304   | 打开/关闭麦克风控件组。            |
352
353## VideoLiveControlGroup<sup>12+</sup>
354
355视频直播控件组枚举。仅当[PiPTemplateType](#piptemplatetype) 为VIDEO_LIVE时使用。
356
357**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
358
359**系统能力:** SystemCapability.Window.SessionManager
360
361| 名称                   | 值   | 说明                    |
362|----------------------|-----|-----------------------|
363| VIDEO_PLAY_PAUSE     | 401   |   播放/暂停直播控件组。 |
364| MUTE_SWITCH         | 402   | 静音控件组。            |
365
366## PiPActionEventType
367
368type PiPActionEventType = PiPVideoActionEvent | PiPCallActionEvent | PiPMeetingActionEvent | PiPLiveActionEvent
369
370画中画控制面板控件动作事件类型,支持以下四种。
371
372**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
373
374**系统能力:** SystemCapability.Window.SessionManager
375
376| 类型                                              | 说明          |
377|-------------------------------------------------|-------------|
378| [PiPVideoActionEvent](#pipvideoactionevent)     | 视频播放控制面板控件事件类型。 |
379| [PiPCallActionEvent](#pipcallactionevent)       | 视频通话控制面板控件事件类型。 |
380| [PiPMeetingActionEvent](#pipmeetingactionevent) | 视频会议控制面板控件事件类型。 |
381| [PiPLiveActionEvent](#pipliveactionevent)       | 直播控制面板控件事件类型。   |
382
383## PiPVideoActionEvent
384
385type PiPVideoActionEvent = 'playbackStateChanged' | 'nextVideo' | 'previousVideo' | 'fastForward' | 'fastBackward'
386
387视频播放控制事件类型。
388
389**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
390
391**系统能力:** SystemCapability.Window.SessionManager
392
393| 类型                         | 说明                                      |
394| ---------------------------- | ----------------------------------------- |
395| 'playbackStateChanged'       | 播放状态发生了变化。                      |
396| 'nextVideo'                  | 播放下一个视频。                          |
397| 'previousVideo'              | 播放上一个视频。                          |
398| 'fastForward'<sup>12+</sup>  | 视频进度快进。从API version 12 开始支持。 |
399| 'fastBackward'<sup>12+</sup> | 视频进度后退。从API version 12 开始支持。 |
400
401## PiPCallActionEvent
402
403type PiPCallActionEvent = 'hangUp' | 'micStateChanged' | 'videoStateChanged' | 'voiceStateChanged'
404
405视频通话控制事件类型。
406
407**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
408
409**系统能力:** SystemCapability.Window.SessionManager
410
411| 类型                | 说明               |
412| ------------------- | ------------------ |
413| 'hangUp'             | 挂断视频通话。     |
414| 'micStateChanged'   | 打开或关闭麦克风。 |
415| 'videoStateChanged' | 打开或关闭摄像头。 |
416| 'voiceStateChanged'<sup>12+</sup> | 静音或解除静音。   |
417
418
419## PiPMeetingActionEvent
420
421type PiPMeetingActionEvent = 'hangUp' | 'voiceStateChanged' | 'videoStateChanged' | 'micStateChanged'
422
423视频会议控制事件类型。
424
425**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
426
427**系统能力:** SystemCapability.Window.SessionManager
428
429| 类型                | 说明               |
430| ------------------- | ------------------ |
431| 'hangUp'            | 挂断视频会议。     |
432| 'voiceStateChanged' | 静音或解除静音。   |
433| 'videoStateChanged' | 打开或关闭摄像头。 |
434| 'micStateChanged'<sup>12+</sup>   | 打开或关闭麦克风。 |
435
436
437## PiPLiveActionEvent
438
439type PiPLiveActionEvent = 'playbackStateChanged' | 'voiceStateChanged'
440
441直播控制事件类型。
442
443**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
444
445**系统能力:** SystemCapability.Window.SessionManager
446
447| 类型                   | 说明             |
448| ---------------------- | ---------------- |
449| 'playbackStateChanged' | 播放或暂停直播。 |
450| 'voiceStateChanged'<sup>12+</sup> | 静音或解除静音。   |
451
452
453## PiPControlStatus<sup>12+</sup>
454
455控制面板控件状态枚举。
456
457**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
458
459**系统能力:** SystemCapability.Window.SessionManager
460
461| 名称                   | 值   | 说明                    |
462|----------------------|-----|-----------------------|
463| PLAY       | 1   | 播放。          |
464| PAUSE    | 0   | 暂停。           |
465| OPEN    | 1   | 打开。            |
466| CLOSE       | 0   | 关闭。          |
467
468## PiPControlType<sup>12+</sup>
469
470控制面板控件类型枚举。
471
472**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
473
474**系统能力:** SystemCapability.Window.SessionManager
475
476| 名称                | 值   | 说明                                   |
477|-------------------|-----|--------------------------------------|
478| VIDEO_PLAY_PAUSE  | 0   | 播放/暂停控件。   |
479| VIDEO_PREVIOUS    | 1   | 视频上一个控件。 |
480| VIDEO_NEXT        | 2   | 视频下一个控件。 |
481| FAST_FORWARD      | 3   | 视频快进控件     |
482| FAST_BACKWARD     | 4   | 视频快退控件。   |
483| HANG_UP_BUTTON           | 5   | 挂断控件。 |
484| MICROPHONE_SWITCH | 6  | 打开/关闭麦克风控件。 |
485| CAMERA_SWITCH     | 7   | 打开/关闭摄像头控件。     |
486| MUTE_SWITCH       | 8   | 打开/关闭静音控件。     |
487
488
489## ControlPanelActionEventCallback<sup>12+</sup>
490
491type ControlPanelActionEventCallback = (event: PiPActionEventType, status?: number) => void
492
493描述画中画控制面板控件动作事件回调。
494
495**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
496
497**系统能力:** SystemCapability.Window.SessionManager
498
499**参数:**
500
501| 参数名                       | 类型           | 必填    | 说明                                |
502|--------------------------|--------------|--------------|-----------------------------------|
503| event       |  [PiPActionEventType](#pipactioneventtype)       | 是 | 回调画中画控制面板控件动作事件类型。<br/>应用依据控件动作事件做相应处理,如触发'playbackStateChanged'事件时,需要开始或停止视频。 |
504| status | number | 否 | 表示可切换状态的控件当前的状态,如具备打开和关闭两种状态的麦克风控件组、摄像头控件组和静音控件组,打开为1,关闭为0。其余控件该参数返回默认值-1。 |
505
506## ControlEventParam<sup>12+</sup>
507
508画中画控制面板控件动作回调的参数。
509
510**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
511
512**系统能力:** SystemCapability.Window.SessionManager
513
514| 名称                       | 类型           | 必填    | 说明                                                                                                                                |
515|--------------------------|--------------|--------------|-----------------------------------------------------------------------------------------------------------------------------------|
516| controlType       |  [PiPControlType](#pipcontroltype12)      | 是 | 回调画中画控制面板控件动作事件类型。应用依据控件类型做相应处理,如视频模板中暂停/播放控件被点击时,需要开始或停止视频。                                                                      |
517| status | [PiPControlStatus](#pipcontrolstatus12) | 否 | 表示可切换状态的控件当前的状态,如具备打开和关闭两种状态的麦克风控件组、摄像头控件组和静音控件组,打开为PiPControlStatus.PLAY,关闭为PiPControlStatus.PAUSE。如不具备开/关和播放/暂停状态的挂断控件默认返回值为-1。 |
518
519## PiPController
520
521画中画控制器实例。用于启动、停止画中画以及更新回调注册等。
522
523下列API示例中都需先使用[PiPWindow.create()](#pipwindowcreate)方法获取到PiPController实例,再通过此实例调用对应方法。
524
525**系统能力:** SystemCapability.Window.SessionManager
526
527### startPiP
528
529startPiP(): Promise&lt;void&gt;
530
531启动画中画,使用Promise异步回调。
532
533**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
534
535**系统能力:** SystemCapability.Window.SessionManager
536
537**返回值:**
538
539| 类型                     | 说明                 |
540|------------------------|--------------------|
541| Promise&lt;void&gt;    | 无返回结果的Promise对象。   |
542
543**错误码:**
544
545以下错误码的详细介绍请参见[窗口错误码](errorcode-window.md)。
546
547| 错误码ID    | 错误信息                                                |
548|------------|--------------------------------------------------------|
549| 1300012    | The PiP window state is abnormal.                      |
550| 1300013    | Failed to create the PiP window.                       |
551| 1300014    | PiP internal error.                                    |
552| 1300015    | Repeated PiP operation.                                |
553
554**示例:**
555
556```ts
557let promise : Promise<void> = pipController.startPiP();
558promise.then(() => {
559  console.info(`Succeeded in starting pip.`);
560}).catch((err: BusinessError) => {
561  console.error(`Failed to start pip. Cause:${err.code}, message:${err.message}`);
562});
563```
564
565### stopPiP
566
567stopPiP(): Promise&lt;void&gt;
568
569停止画中画,使用Promise异步回调。
570
571**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
572
573**系统能力:** SystemCapability.Window.SessionManager
574
575**返回值:**
576
577| 类型                   | 说明                  |
578|----------------------|---------------------|
579| Promise&lt;void&gt;  | 无返回结果的Promise对象。    |
580
581**错误码:**
582
583以下错误码的详细介绍请参见[窗口错误码](errorcode-window.md)。
584
585| 错误码ID   | 错误信息                          |
586|---------|-----------------------------------|
587| 1300011 | Failed to destroy the PiP window. |
588| 1300012 | The PiP window state is abnormal. |
589| 1300015 | Repeated PiP operation.           |
590
591**示例:**
592
593```ts
594let promise : Promise<void> = pipController.stopPiP();
595promise.then(() => {
596  console.info(`Succeeded in stopping pip.`);
597}).catch((err: BusinessError) => {
598  console.error(`Failed to stop pip. Cause:${err.code}, message:${err.message}`);
599});
600```
601
602### setAutoStartEnabled
603
604setAutoStartEnabled(enable: boolean): void
605
606设置是否需要在返回桌面时自动启动画中画。
607
608**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
609
610**系统能力:** SystemCapability.Window.SessionManager
611
612**参数:**
613
614| 参数名      | 类型        | 必填    | 说明                              |
615|----------|-----------|-------|---------------------------------|
616| enable   | boolean   | 是     | 如返回桌面时需自动启动画中画,则该参数配置为true,否则为false。若设置中自动启动画中画开关为关闭状态,就算该参数配置为true,应用返回桌面时也不会自动启动画中画窗口。  |
617
618**示例:**
619
620```ts
621let enable: boolean = true;
622pipController.setAutoStartEnabled(enable);
623```
624
625### updateContentSize
626
627updateContentSize(width: number, height: number): void
628
629当媒体源切换时,向画中画控制器更新媒体源尺寸信息。
630
631**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
632
633**系统能力:** SystemCapability.Window.SessionManager
634
635**参数:**
636
637| 参数名    | 类型     | 必填  | 说明                                     |
638|--------|--------|-----|----------------------------------------|
639| width  | number | 是   | 表示媒体内容宽度,必须为大于0的数字,单位为px。用于更新画中画窗口比例。  |
640| height | number | 是   | 表示媒体内容高度,必须为大于0的数字,单位为px。用于更新画中画窗口比例。  |
641
642**错误码:**
643
644以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
645
646| 错误码ID | 错误信息                                                                                                        |
647|-------|-------------------------------------------------------------------------------------------------------------|
648| 401   | Params error. Possible causes: 1.Mandatory parameters are left unspecified. 2.Incorrect parameter types. |
649
650**示例:**
651
652```ts
653let width: number = 540; // 假设当前内容宽度变为540px。
654let height: number = 960; // 假设当前内容高度变为960px。
655pipController.updateContentSize(width, height);
656```
657
658### updatePiPControlStatus<sup>12+</sup>
659updatePiPControlStatus(controlType: PiPControlType, status: PiPControlStatus): void
660
661更新控制面板控件功能状态。
662
663**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
664
665**系统能力:** SystemCapability.Window.SessionManager
666
667**参数:**
668
669| 参数名    | 类型     | 必填  | 说明                                                                                                 |
670|--------|--------|-----|----------------------------------------------------------------------------------------------------|
671| controlType  | [PiPControlType](#pipcontroltype12)  | 是   | 表示画中画控制面板控件类型。目前仅支持VIDEO_PLAY_PAUSE、MICROPHONE_SWITCH、CAMERA_SWITCH和MUTE_SWITCH这几种控件类型,传入其他控件类型无效。 |
672| status | [PiPControlStatus](#pipcontrolstatus12)  | 是   | 表示画中画控制面板控件状态。                                                                                     |
673
674**错误码:**
675
676以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
677
678| 错误码ID | 错误信息                                                                                                        |
679|-------|-------------------------------------------------------------------------------------------------------------|
680| 401   | Params error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed |
681
682**示例:**
683
684```ts
685let controlType: PiPWindow.PiPControlType = PiPWindow.PiPControlType.VIDEO_PLAY_PAUSE; // 视频播放控制面板中播放/暂停控件。
686let status: PiPWindow.PiPControlStatus = PiPWindow.PiPControlStatus.PLAY; // 视频播放控制面板中播放/暂停控件为播放状态。
687pipController.updatePiPControlStatus(controlType, status);
688```
689
690### setPiPControlEnabled<sup>12+</sup>
691setPiPControlEnabled(controlType: PiPControlType, enabled: boolean): void
692
693更新控制面板控件使能状态。
694
695**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
696
697**系统能力:** SystemCapability.Window.SessionManager
698
699**参数:**
700
701| 参数名         | 类型     | 必填  | 说明                                     |
702|-------------|--------|-----|----------------------------------------|
703| controlType | [PiPControlType](#pipcontroltype12)  | 是   | 表示画中画控制面板控件类型。  |
704| enabled     | boolean | 是   | 表示画中画控制面板控件使能状态。true表示控件为可使用状态,false则为禁用状态。  |
705
706**错误码:**
707
708以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。
709
710| 错误码ID | 错误信息                                                                                                        |
711|-------|-------------------------------------------------------------------------------------------------------------|
712| 401   | Params error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed |
713
714**示例:**
715
716```ts
717let controlType: PiPWindow.PiPControlType = PiPWindow.PiPControlType.VIDEO_PLAY_PAUSE; // 视频播放控制面板中播放/暂停控件。
718let enabled: boolean = false; // 视频播放控制面板中播放/暂停控件为禁用状态。
719pipController.setPiPControlEnabled(controlType, enabled);
720```
721### getPiPWindowInfo<sup>15+</sup>
722getPiPWindowInfo(): Promise&lt;[PiPWindowInfo](#pipwindowinfo15)&gt;
723
724获取画中画窗口信息。
725
726**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
727
728**系统能力:** SystemCapability.Window.SessionManager
729
730**返回值:**
731
732| 类型                   | 说明                  |
733|----------------------|---------------------|
734| Promise&lt;[PiPWindowInfo](#pipwindowinfo15)&gt;  | Promise对象,返回当前画中画窗口信息。 |
735
736**错误码:**
737
738以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[窗口错误码](errorcode-window.md)。
739
740| 错误码ID | 错误信息                                                                                                        |
741|-------|-------------------------------------------------------------------------------------------------------------|
742| 801   | Capability not supported. Failed to call the API due to limited device capabilities.                                                       |
743| 1300014    | PiP internal error.                                    |
744
745**示例:**
746
747```ts
748let pipWindowInfo: PiPWindow.PiPWindowInfo | undefined = undefined;
749try {
750  let promise : Promise<PiPWindow.PiPWindowInfo> = pipController.getPiPWindowInfo();
751  promise.then((data) => {
752    pipWindowInfo = data;
753    console.info('Success in get pip window info. Info: ' + JSON.stringify(data));
754  }).catch((err: BusinessError) => {
755    console.error(`Failed to get pip window info. Cause code: ${err.code}, message: ${err.message}`);
756  });
757} catch (exception) {
758  console.error(`Failed to get pip window info. Cause code: ${exception.code}, message: ${exception.message}`);
759}
760```
761
762### on('stateChange')
763
764on(type: 'stateChange', callback: (state: PiPState, reason: string) => void): void
765
766开启画中画生命周期状态的监听。
767
768**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
769
770**系统能力:** SystemCapability.Window.SessionManager
771
772**参数:**
773
774| 参数名        | 类型        | 必填   | 说明                                                                                                |
775|------------|-----------|------|---------------------------------------------------------------------------------------------------|
776| type       | string    | 是    | 监听事件,固定为'stateChange',即画中画生命周期状态变化事件。                                                             |
777| callback   | function  | 是    | 回调生命周期状态变化事件以及原因。<br/>state:[PiPState](#pipstate),表示当前画中画生命周期状态。<br/>reason:string,表示当前生命周期的切换原因。 |
778
779**示例:**
780
781```ts
782pipController.on('stateChange', (state: PiPWindow.PiPState, reason: string) => {
783  let curState: string = '';
784  switch (state) {
785    case PiPWindow.PiPState.ABOUT_TO_START:
786      curState = 'ABOUT_TO_START';
787      break;
788    case PiPWindow.PiPState.STARTED:
789      curState = 'STARTED';
790      break;
791    case PiPWindow.PiPState.ABOUT_TO_STOP:
792      curState = 'ABOUT_TO_STOP';
793      break;
794    case PiPWindow.PiPState.STOPPED:
795      curState = 'STOPPED';
796      break;
797    case PiPWindow.PiPState.ABOUT_TO_RESTORE:
798      curState = 'ABOUT_TO_RESTORE';
799      break;
800    case PiPWindow.PiPState.ERROR:
801      curState = 'ERROR';
802      break;
803    default:
804      break;
805  }
806  console.info('stateChange:' + curState + ' reason:' + reason);
807});
808```
809
810### off('stateChange')
811
812off(type: 'stateChange'): void
813
814关闭画中画生命周期状态的监听。
815
816**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
817
818**系统能力:** SystemCapability.Window.SessionManager
819
820**参数:**
821
822| 参数名       | 类型            | 必填    | 说明                                     |
823|-----------|---------------|-------|----------------------------------------|
824| type      | string        | 是     | 监听事件,固定为'stateChange',即画中画生命周期状态变化事件。  |
825
826**示例:**
827
828```ts
829pipController.off('stateChange');
830```
831
832### on('controlPanelActionEvent')
833
834on(type: 'controlPanelActionEvent', callback: ControlPanelActionEventCallback): void
835
836开启画中画控制面板控件动作事件的监听。推荐使用[on('controlEvent')](#oncontrolevent12)来开启画中画控制面板控件动作事件的监听。
837
838**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
839
840**系统能力:** SystemCapability.Window.SessionManager
841
842**参数:**
843
844| 参数名      | 类型         | 必填    | 说明                                                |
845|----------|------------|-------|---------------------------------------------------|
846| type     | string     | 是     | 监听事件,固定为'controlPanelActionEvent',即画中画控制面板控件动作事件。 |
847| callback | [ControlPanelActionEventCallback](#controlpanelactioneventcallback12)  | 是     | 描述画中画控制面板控件动作事件回调。                                |
848
849**示例:**
850
851```ts
852pipController.on('controlPanelActionEvent', (event: PiPWindow.PiPActionEventType, status?: number) => {
853  switch (event) {
854    case 'playbackStateChanged':
855      if (status === 0) {
856        //停止视频
857      } else if (status === 1) {
858        //播放视频
859      }
860      break;
861    case 'nextVideo':
862      // 切换到下一个视频
863      break;
864    case 'previousVideo':
865      // 切换到上一个视频
866      break;
867    case 'fastForward':
868      // 视频进度快进
869      break;
870    case 'fastBackward':
871      // 视频进度后退
872      break;
873    default:
874      break;
875  }
876  console.info('registerActionEventCallback, event:' + event);
877});
878```
879
880### on('controlEvent')<sup>12+</sup>
881
882on(type: 'controlEvent', callback: Callback&lt;ControlEventParam&gt;): void
883
884开启画中画控制面板控件动作事件的监听。
885
886**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
887
888**系统能力:** SystemCapability.Window.SessionManager
889
890**参数:**
891
892| 参数名      | 类型                                                  | 必填    | 说明                                     |
893|----------|-----------------------------------------------------|-------|----------------------------------------|
894| type     | string                                              | 是     | 监听事件,固定为'controlEvent',即画中画控制面板控件动作事件。 |
895| callback | Callback<[ControlEventParam](#controleventparam12)> | 是     | 描述画中画控制面板控件动作事件回调。                     |
896
897**示例:**
898
899```ts
900pipController.on('controlEvent', (control) => {
901  switch (control.controlType) {
902    case PiPWindow.PiPControlType.VIDEO_PLAY_PAUSE:
903      if (control.status === PiPWindow.PiPControlStatus.PAUSE) {
904        //停止视频
905      } else if (control.status === PiPWindow.PiPControlStatus.PLAY) {
906        //播放视频
907      }
908      break;
909    case PiPWindow.PiPControlType.VIDEO_NEXT:
910      // 切换到下一个视频
911      break;
912    case PiPWindow.PiPControlType.VIDEO_PREVIOUS:
913      // 切换到上一个视频
914      break;
915    case PiPWindow.PiPControlType.FAST_FORWARD:
916      // 视频进度快进
917      break;
918    case PiPWindow.PiPControlType.FAST_BACKWARD:
919      // 视频进度后退
920      break;
921    default:
922      break;
923  }
924  console.info('registerControlEventCallback, controlType:' + control.controlType + ', status' + control.status);
925});
926```
927
928### off('controlPanelActionEvent')
929
930off(type: 'controlPanelActionEvent'): void
931
932关闭画中画控制面板控件动作事件的监听。推荐使用[off('controlEvent')](#offcontrolevent12)来关闭画中画控制面板控件动作事件的监听。
933
934**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
935
936**系统能力:** SystemCapability.Window.SessionManager
937
938**参数:**
939
940| 参数名        | 类型                           | 必填   | 说明                                            |
941|------------|------------------------------|------|-----------------------------------------------|
942| type       | string                       | 是    | 监听事件,固定为'controlPanelActionEvent',即画中画控制面板控件动作事件。   |
943
944**示例:**
945
946```ts
947pipController.off('controlPanelActionEvent');
948```
949
950### off('controlEvent')<sup>12+</sup>
951
952off(type: 'controlEvent', callback?: Callback&lt;ControlEventParam&gt;): void
953
954关闭画中画控制面板控件动作事件的监听。
955
956**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
957
958**系统能力:** SystemCapability.Window.SessionManager
959
960**参数:**
961
962| 参数名        | 类型                                                  | 必填 | 说明                                                     |
963|------------|-----------------------------------------------------|----|--------------------------------------------------------|
964| type       | string                                              | 是  | 监听事件,固定为'controlEvent',即画中画控制面板控件动作事件。                 |
965| callback | Callback<[ControlEventParam](#controleventparam12)> | 否  | 描述画中画控制面板控件动作事件回调。如果不传该参数时,解除type为'controlEvent'的所有回调。 |
966
967**示例:**
968
969```ts
970pipController.off('controlEvent', () => {});
971```
972
973### on('pipWindowSizeChange')<sup>15+</sup>
974
975on(type: 'pipWindowSizeChange', callback: Callback&lt;PiPWindowSize&gt;): void
976
977开启画中画窗口尺寸变化事件的监听。
978
979**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
980
981**系统能力:** SystemCapability.Window.SessionManager
982
983**参数:**
984
985| 参数名      | 类型                                          | 必填    | 说明                                                |
986|----------|---------------------------------------------|-------|---------------------------------------------------|
987| type     | string                                      | 是     | 监听事件,固定为'pipWindowSizeChange',即画中画窗口尺寸变化事件。 |
988| callback | Callback<[PiPWindowSize](#pipwindowsize15)> | 是     | 回调函数。返回当前画中画窗口的尺寸。 |
989
990**错误码:**
991
992以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[窗口错误码](errorcode-window.md)。
993
994| 错误码ID | 错误信息 |
995| ------- | -------------------------------------------- |
996| 401     | Params error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. |
997| 801   | Capability not supported.Failed to call the API due to limited device capabilities.                                                       |
998| 1300014    | PiP internal error.                                    |
999
1000**示例:**
1001
1002```ts
1003try {
1004  pipController.on('pipWindowSizeChange', (size: PiPWindow.PiPWindowSize) => {
1005    console.info('Succeeded in enabling the listener for pip window size changes. size: ' + JSON.stringify(size));
1006  });
1007} catch (exception) {
1008  console.error(`Failed to enable the listener for pip window size changes. Cause code: ${exception.code}, message: ${exception.message}`);
1009}
1010```
1011
1012### off('pipWindowSizeChange')<sup>15+</sup>
1013
1014off(type: 'pipWindowSizeChange', callback?: Callback&lt;PiPWindowSize&gt;): void
1015
1016关闭画中画窗口尺寸变化事件的监听。
1017
1018**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
1019
1020**系统能力:** SystemCapability.Window.SessionManager
1021
1022**参数:**
1023
1024| 参数名      | 类型         | 必填 | 说明                                                                  |
1025|----------|------------|----|---------------------------------------------------------------------|
1026| type     | string     | 是  | 监听事件,固定为'pipWindowSizeChange',即画中画窗口尺寸变化事件。                         |
1027| callback | Callback<[PiPWindowSize](#pipwindowsize15)> | 否  | 回调函数。返回当前画中画窗口的尺寸。如果传入参数,则关闭该监听。如果未传入参数,解除type为'pipWindowSizeChange'的所有回调。 |
1028
1029**错误码:**
1030
1031以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[窗口错误码](errorcode-window.md)。
1032
1033| 错误码ID | 错误信息 |
1034| ------- | -------------------------------------------- |
1035| 401     | Params error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3. Parameter verification failed. |
1036| 801   | Capability not supported.Failed to call the API due to limited device capabilities.                                                       |
1037| 1300014    | PiP internal error.                                    |
1038
1039**示例:**
1040
1041```ts
1042const callback = (size: PiPWindow.PiPWindowSize) => {
1043  // ...
1044}
1045try {
1046  // 通过on接口开启监听
1047  pipController.on('pipWindowSizeChange', callback);
1048} catch (exception) {
1049  console.error(`Failed to enable the listener for pip window size changes. Cause code: ${exception.code}, message: ${exception.message}`);
1050}
1051
1052try {
1053  // 关闭指定callback的监听
1054  pipController.off('pipWindowSizeChange', callback);
1055  // 如果通过on开启多个callback进行监听,同时关闭所有监听:
1056  pipController.off('pipWindowSizeChange');
1057} catch (exception) {
1058  console.error(`Failed to disable the listener for pip window size changes. Cause code: ${exception.code}, message: ${exception.message}`);
1059}
1060```