鸿蒙5.0版开发:UI界面-@ohos.PiPWindow (画中画窗口)

往期鸿蒙全套实战文章必看:


@ohos.PiPWindow (画中画窗口)

该模块提供画中画基础功能,包括判断当前系统是否开启画中画功能,以及创建画中画控制器用于启动、停止画中画等。主要用于视频播放、视频通话或视频会议场景下,以小窗(画中画)模式呈现内容。

说明:

本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

需要在支持SystemCapability.Window.SessionManager能力的系统上使用该模块。

导入模块

import { PiPWindow } from '@kit.ArkUI';

PiPWindow.isPiPEnabled

isPiPEnabled(): boolean

用于判断当前系统是否支持画中画功能。

原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.Window.SessionManager

返回值:

类型 说明
boolean 当前系统是否开启画中画功能。true表示支持,false则表示不支持。

示例:

let enable: boolean = PiPWindow.isPiPEnabled();
console.info('isPipEnabled:' + enable);

PiPWindow.create

create(config: PiPConfiguration): Promise<PiPController>

创建画中画控制器,使用Promise异步回调。

原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.Window.SessionManager

参数:

参数名 类型 必填 说明
config PiPConfiguration 创建画中画控制器的参数。该参数不能为空,并且构造该参数的context和componentController不能为空。构造该参数时,如果指定了templateType,需保证templateType是PiPTemplateType类型;如果指定了controlGroups,需保证controlGroups与templateType匹配。

返回值:

类型 说明
Promise<PiPController> Promise对象。返回当前创建的画中画控制器。

错误码:

以下错误码的详细介绍。

错误码ID 错误信息
401 Params error. Possible causes: 1.Mandatory parameters are left unspecified. 2.Incorrect parameter types. 3.Parameter verification failed.
801 Capability not supported.Failed to call the API due to limited device capabilities.

示例:

import { BusinessError } from '@kit.BasicServicesKit';
import { BuilderNode, FrameNode, NodeController, Size, UIContext } from '@kit.ArkUI';

class Params {
  text: string = '';
  constructor(text: string) {
    this.text = text;
  }
}

// 开发者可以通过@Builder装饰器实现布局构建
@Builder
function buildText(params: Params) {
  Column() {
    Text(params.text)
      .fontSize(20)
      .fontColor(Color.Red)
  }
  .width('100%') // 宽度方向充满画中画窗口
  .height('100%') // 高度方向充满画中画窗口
}

// 开发者可通过继承NodeController实现自定义UI控制器
class TextNodeController extends NodeController {
  private message: string;
  private textNode: BuilderNode<[Params]> | null = null;
  constructor(message: string) {
    super();
    this.message = message;
  }

  // 通过BuilderNode加载自定义布局
  makeNode(context: UIContext): FrameNode | null {
    this.textNode = new BuilderNode(context);
    this.textNode.build(wrapBuilder<[Params]>(buildText), new Params(this.message));
    return this.textNode.getFrameNode();
  }

  // 开发者可自定义该方法实现布局更新
  update(message: string) {
    console.log(`update message: ${message}`);
    if (this.textNode !== null) {
      this.textNode.update(new Params(message));
    }
  }
}

let pipController: PiPWindow.PiPController | undefined = undefined;
let mXComponentController: XComponentController = new XComponentController(); // 开发者应使用该mXComponentController初始化XComponent: XComponent( {id: 'video', type: 'surface', controller: mXComponentController} ),保证XComponent的内容可以被迁移到画中画窗口。
let nodeController: TextNodeController = new TextNodeController('this is custom UI');
let navId: string = "page_1"; // 假设当前页面的导航id为page_1,详见PiPConfiguration定义,具体导航名称由开发者自行定义。
let contentWidth: number = 800; // 假设当前内容宽度800px。
let contentHeight: number = 600; // 假设当前内容高度600px。
let config: PiPWindow.PiPConfiguration = {
  context: getContext(this),
  componentController: mXComponentController,
  navigationId: navId,
  templateType: PiPWindow.PiPTemplateType.VIDEO_PLAY,
  contentWidth: contentWidth,
  contentHeight: contentHeight,
  controlGroups: [PiPWindow.VideoPlayControlGroup.VIDEO_PREVIOUS_NEXT],
  customUIController: nodeController, // 可选,如果需要在画中画显示内容上方展示自定义UI,可设置该参数。
};

let promise : Promise<PiPWindow.PiPController> = PiPWindow.create(config);
promise.then((data : PiPWindow.PiPController) => {
  pipController = data;
  console.info(`Succeeded in creating pip controller. Data:${data}`);
}).catch((err: BusinessError) => {
  console.error(`Failed to create pip controller. Cause:${err.code}, message:${err.message}`);
});

PiPWindow.create12+

create(config: PiPConfiguration, contentNode: typeNode.XComponent): Promise<PiPController>

通过typeNode创建画中画控制器,使用Promise异步回调。

原子化服务API: 从API version 12开始,该接口支持在原子化服务中使用。

系统能力: SystemCapability.Window.SessionManager

参数:

参数名 类型 必填 说明
config PiPConfiguration 创建画中画控制器的参数。该参数不能为空,并且构造该参数的context不能为空。构造该参数时,如果指定了templateType,需保证templateType是PiPTemplateType类型;如果指定了controlGroups,需保证controlGroups与templateType匹配
contentNode typeNode.XComponent 用于渲染画中画窗口中的内容。该参数不能为空。

返回值:

类型 说明
Promise<PiPController> Promise对象。返回当前创建的画中画控制器。

错误码:

以下错误码的详细介绍。

错误码ID 错误信息
401 Params error. Possible causes: 1.Mandatory parameters are left unspecified. 2.Incorrect parameter types. 3.Parameter verification failed.
801 Capability not supported.Failed to call the API due to limited device capabilities.

示例:

import { BusinessError } from '@kit.BasicServicesKit';
import { PiPWindow, UIContext } from '@kit.ArkUI';
import { typeNode } from '@ohos.arkui.node';

let pipController: PiPWindow.PiPController | undef
<think>我们正在解决一个TypeScript环境下的模块找不到问题,具体是无法找到模块'@ohos.ui'或其类型声明。根据ArkTSCheck(可能是ArkTS的类型检查工具)的报错,我们需要确保该模块存在并且类型声明可用。解决思路:1.确认模块是否安装:检查项目依赖中是否包含提供'@ohos.ui'的包。2.安装类型声明:如果模块存在但没有类型声明,我们需要安装或创建对应的类型声明文件(.d.ts)。3.配置TypeScript:确保tsconfig.json中的路径设置正确,以便TypeScript能够找到模块和类型声明。步骤:1.检查依赖:查看项目的package.json,确认是否有包含'@ohos.ui'的依赖。由于'@ohos'前缀通常与OpenHarmony相关,可能是OpenHarmony的UI模块。在OpenHarmony应用开发中,UI模块是内置的,因此可能不需要额外安装,但TypeScript需要类型声明。2.安装类型声明:如果OpenHarmony提供了类型声明包,我们可以通过npm安装。如果没有,可能需要手动创建声明文件。3.创建自定义声明文件:在项目的某个位置(如src/typings目录)创建一个ohos.ui.d.ts文件,并声明该模块。4.配置tsconfig.json:确保TypeScript可以找到自定义声明文件,通过"typeRoots"或"paths"配置。具体操作:步骤1:检查依赖在package.json中,我们可能不需要显式添加'@ohos.ui',因为它可能是OpenHarmonySDK的一部分。但我们需要确保SDK已正确安装和配置。步骤2:查找官方类型声明查阅OpenHarmony的官方文档,看是否有提供类型声明包。如果有,使用npm或yarn安装。步骤3:手动创建声明文件(如果没有官方声明)在项目中创建声明文件,例如:src/typings/ohos.ui.d.ts内容示例:```typescriptdeclaremodule'@ohos.ui'{//根据实际API导出内容exportclassUIComponent{//具体属性和方法}//...其他导出}```注意:我们需要根据实际使用的API来完善这个声明,或者至少先声明为一个any类型以通过编译。步骤4:配置tsconfig.json确保tsconfig.json中包含以下配置:```json{"compilerOptions":{//其他配置..."typeRoots":["./node_modules/@types","./src/typings"//自定义声明文件的目录]}}```或者,如果我们想使用路径映射:```json{"compilerOptions":{"baseUrl":".","paths":{"@ohos.ui":["./src/typings/ohos.ui"]}}}```步骤5:重新启动TypeScript编译器或开发服务器,使配置生效。如果以上步骤仍不能解决问题,可能需要检查开发环境(如DevEcoStudio)是否配置正确,或者OpenHarmonySDK是否完整。相关问题:1.在OpenHarmony应用开发中,如何为内置模块添加类型声明?2.如何配置TypeScript的路径映射(pathmapping)?3.在OpenHarmony中,'@ohos.ui'模块提供了哪些UI组件?4.如何为第三方库创建自定义的类型声明文件?5.在TypeScript项目中,如何解决模块解析失败的问题?</think>### 解决无法找到模块 '@ohos.ui' 或其类型声明的问题 在 ArkTS 开发中遇到 `Cannot find module '@ohos.ui' or its corresponding type declarations` 错误,通常由以下原因导致: #### 1. **SDK 本不匹配**(最常见原因) - **问题**:`@ohos.ui` 是 OpenHarmony 3.2+ 引入的新 UI 框架模块,旧本 SDK 不存在此模块 - **解决**: ```bash # 升级 DevEco Studio 和 SDK npm update -g @ohos/hvigor # 更新构建工具 ``` 在 `build-profile.json5` 中确认 API 本: ```json5 "apiType": 'stageModel', // 必须为 Stage 模型 "releaseType": 'Release', // 使用正式 API "target": 'harmonyos' // 目标平台 ``` #### 2. **缺少类型声明文件** - **手动添加声明**:在项目根目录创建 `ohos.ui.d.ts`: ```typescript // ohos.ui.d.ts declare module '@ohos.ui' { export * from '@ohos.arkui.UIContext'; // 根据实际 API 调整 } ``` - **配置 `tsconfig.json`**: ```json { "compilerOptions": { "typeRoots": ["./typings", "./node_modules/@types"], "paths": { "@ohos.ui": ["./src/main/ets/ohos.ui.d.ts"] } } } ``` #### 3. **模块路径错误** - 确保导入路径完全匹配 SDK 规范: ```typescript // 正确示例 (Stage 模型) import { UIComponent } from '@ohos.arkui.UIContext'; // 而非 '@ohos.ui' ``` - 在 `package.json` 中声明依赖: ```json "dependencies": { "@ohos/arkui": ">3.2.0" } ``` #### 4. **清理构建缓存** ```bash # 删除缓存并重建 rm -rf build node_modules npm install hvigor clean ``` > **验证方案**: > 在 `entry/src/main/ets/pages/Index.ets` 中添加测试代码: > ```typescript > import { UIContext } from '@ohos.arkui.UIContext'; // 标准导入方式 > > @Entry > @Component > struct TestComponent { > build() { > Column() { > Text("Module Test").fontSize(20) > } > } > } > ``` --- ### 相关问题 1. **如何检查当前 OpenHarmony SDK 支持的 UI 模块本?** - 通过 `ohpm list` 查看已安装的 ARK UI本[^4] 2. **Stage 模型和 FA 模型在 UI 导入方式上有何区别?** - Stage 模型使用 `@ohos.arkui.UIContext`,FA 模型使用 `@ohos.ui`(已废弃)[^2] 3. **如何为自定义 HarmonyOS 原生模块创建类型声明?** - 需在 `.d.ts` 中使用 `declare interface` 扩展全局类型[^3] 4. **ArkTS 开发中常见的模块解析错误有哪些解决方案?** - 路径映射(paths)、类型根目录(typeRoots)、SDK 本验证三连排查法 5. **为什么升级 SDK 后仍出现模块缺失错误?** - 需同步更新 `ohos_version` 和 `compileSdkVersion` 的匹配性[^1] --- > 引用说明: > [^1]: 布尔类型属性命名规范影响 API 设计的一致性 > [^2]: WebXR 特性启用检测机制类比 SDK 模块可用性检查 > [^3]: Kotlin 逆变类型约束与 TS 类型声明扩展的相似性 > [^4]: Activiti 脚本任务兼容方案对应 SDK 本切换场景
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值