• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# XComponent
2
3可用于EGL/OpenGLES和媒体数据写入,并显示在XComponent组件。
4
5> **说明:**
6>
7> 该组件从API Version 8 开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9## 子组件
10
11  构造参数type为"surface"时不支持。
12
13  从API version 9开始,构造参数type为"component"时可以包含子组件。
14
15## 接口
16
17  XComponent(value: {id: string, type: string, libraryname?: string, controller?: XComponentController})
18
19**参数:**
20
21| 参数名         | 参数类型                                     | 必填   | 描述                                       |
22| ----------- | ---------------------------------------- | ---- | ---------------------------------------- |
23| id          | string                                   | 是    | 组件的唯一标识,支持最大的字符串长度128。                   |
24| type        | string                                   | 是    | 用于指定XComponent组件类型,可选值为:<br/>-"surface":用于EGL/OpenGLES和媒体数据写入,组件内容单独送显,直接合成到屏幕。<br/>-"component"<sup>9+</sup> :XComponent将变成一个容器组件,并可在其中执行非UI逻辑以动态加载显示内容。 |
25| libraryname | string                                   | 否    | 应用Native层编译输出动态库名称,仅XComponent类型为"surface"时有效。 |
26| controller  | [XComponentcontroller](#xcomponentcontroller) | 否    | 给组件绑定一个控制器,通过控制器调用组件方法,仅XComponent类型为"surface"时有效。 |
27
28> **说明:**
29>
30> type为"component"时,XComponent作为容器,子组件沿垂直方向布局:
31>
32> - 垂直方向上对齐格式:[FlexAlign](ts-appendix-enums.md#flexalign).Start
33> - 水平方向上对齐格式:[FlexAlign](ts-appendix-enums.md#flexalign).Center
34>
35> 所有的事件响应均不支持。
36>
37> 布局方式更改和事件响应均可通过挂载子组件来设置。
38>
39> 内部所写的非UI逻辑需要封装在一个或多个函数内。
40
41## 属性
42- XComponent显示的内容,可由开发者自定义绘制,通用属性不支持[背景设置](./ts-universal-attributes-background.md)、[透明度设置](./ts-universal-attributes-opacity.md)和[图像效果](./ts-universal-attributes-image-effect.md)。
43- type为"surface"时建议使用EGL/OpenGLES提供的接口设置相关内容。
44- type为"component"时建议使用挂载子组件的方式进行设置相关内容。
45
46## 事件
47
48仅type为"surface"时以下事件有效。不支持[通用事件](ts-universal-events-click.md)和[手势](ts-gesture-settings.md)。
49
50### onLoad
51
52onLoad(callback: (event?: object) => void )
53
54插件加载完成时回调事件。
55
56**参数:**
57
58| 参数名   | 参数类型   | 必填   | 描述                                       |
59| ----- | ------ | ---- | ---------------------------------------- |
60| event | object | 否    | 获取XComponent实例对象的context,context上挂载的方法由开发者在c++层定义。 |
61
62### onDestroy
63
64onDestroy(event: () => void )
65
66插件卸载完成时回调事件。
67
68## XComponentController
69
70xcomponent 组件的控制器,可以将此对象绑定至XComponent组件,然后通过控制器来调用组件方法。
71
72### 创建对象
73
74```
75xcomponentController: XComponentController = new XComponentController()
76```
77
78### getXComponentSurfaceId
79
80getXComponentSurfaceId(): string
81
82获取XComponent对应Surface的ID,供@ohos接口使用,使用方式可参考[相机管理](../apis/js-apis-camera.md),仅XComponent类型为"surface"时有效。
83
84
85**返回值:**
86
87| 类型     | 描述                      |
88| ------ | ----------------------- |
89| string | XComponent持有Surface的ID。 |
90
91
92### setXComponentSurfaceSize
93
94setXComponentSurfaceSize(value: {surfaceWidth: number, surfaceHeight: number}): void
95
96设置XComponent持有Surface的宽度和高度,仅XComponent类型为"surface"时有效。
97
98
99**参数:**
100
101| 参数名           | 参数类型   | 必填   | 描述                      |
102| ------------- | ------ | ---- | ----------------------- |
103| surfaceWidth  | number | 是    | XComponent持有Surface的宽度。 |
104| surfaceHeight | number | 是    | XComponent持有Surface的高度。 |
105
106
107### getXComponentContext
108
109getXComponentContext(): Object
110
111获取XComponent实例对象的context,仅XComponent类型为"surface"时有效。
112
113**返回值:**
114
115| 类型     | 描述                                       |
116| ------ | ---------------------------------------- |
117| Object | 获取XComponent实例对象的context,context包含的具体接口方法由开发者自定义。 |
118
119
120## 示例
121
122示例效果请以真机运行为准,当前IDE预览器不支持。
123
124```ts
125// xxx.ets
126@Entry
127@Component
128struct PreviewArea {
129  private surfaceId : string =''
130  xcomponentController: XComponentController = new XComponentController()
131  build() {
132    Row() {
133      XComponent({
134        id: 'xcomponent',
135        type: 'surface',
136        controller: this.xcomponentController
137      })
138        .onLoad(() => {
139          this.xcomponentController.setXComponentSurfaceSize({surfaceWidth:1920,surfaceHeight:1080});
140          this.surfaceId = this.xcomponentController.getXComponentSurfaceId()
141        })
142        .width('640px')
143        .height('480px')
144    }
145    .backgroundColor(Color.Black)
146    .position({x: 0, y: 48})
147  }
148}
149```
150