• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# FrameNode
2
3FrameNode表示组件树的实体节点。[NodeController](./js-apis-arkui-nodeController.md#nodecontroller)可通过[BuilderNode](./js-apis-arkui-builderNode.md#buildernode)持有的FrameNode将其挂载到[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md#nodecontainer)上,也可通过FrameNode获取[RenderNode](./js-apis-arkui-renderNode.md#rendernode),挂载到其他FrameNode上。
4
5> **说明:**
6>
7> 本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8>
9> 当前不支持在预览器中使用FrameNode节点。
10>
11> FrameNode节点暂不支持拖拽。
12
13## 导入模块
14
15```ts
16import { FrameNode, LayoutConstraint, ExpandMode, typeNode, NodeAdapter } from "@kit.ArkUI";
17```
18
19## CrossLanguageOptions<sup>15+</sup>
20
21该接口用于配置或查询FrameNode的跨语言访问权限。例如,针对ArkTS语言创建的节点,可通过该接口控制是否允许通过非ArkTS语言进行属性访问或修改。
22
23**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
24
25**系统能力:** SystemCapability.ArkUI.ArkUI.Full
26
27| 名称   | 类型   | 只读 | 可选 | 说明                   |
28| ------ | ------ | ---- | ---- | ---------------------- |
29| attributeSetting  | boolean | 否   | 是   | FrameNode是否支持跨ArkTS语言进行属性设置。<br/>true表示支持跨ArkTS语言进行属性设置,false表示不支持跨ArkTS语言进行属性设置。<br/>默认为false。 |
30
31## ExpandMode<sup>15+</sup>
32
33子节点展开模式枚举。
34
35**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
36
37**系统能力:** SystemCapability.ArkUI.ArkUI.Full
38
39| 名称 | 值 | 说明 |
40| -------- | -------- | -------- |
41| NOT_EXPAND | 0 | 表示不展开当前FrameNode的子节点。如果FrameNode包含[LazyForEach](./arkui-ts/ts-rendering-control-lazyforeach.md)子节点,获取在主节点树上的子节点时,不展开当前FrameNode的子节点。子节点序列号按在主节点树上的子节点计算。 |
42| EXPAND | 1 | 表示展开当前FrameNode的子节点。如果FrameNode包含[LazyForEach](./arkui-ts/ts-rendering-control-lazyforeach.md)子节点,获取所有子节点时,展开当前FrameNode的子节点。子节点序列号按所有子节点计算。 |
43| LAZY_EXPAND | 2 | 表示按需展开当前FrameNode的子节点。如果FrameNode包含[LazyForEach](./arkui-ts/ts-rendering-control-lazyforeach.md)子节点,获取在主树上的子节点时,不展开当前FrameNode的子节点;获取不在主树上的子节点时,展开当前FrameNode的子节点。子节点序列号按所有子节点计算。 |
44
45## FrameNode
46
47### constructor
48
49constructor(uiContext: UIContext)
50
51FrameNode的构造函数。
52
53**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
54
55**系统能力:** SystemCapability.ArkUI.ArkUI.Full
56
57**参数:**
58
59| 参数名    | 类型                                      | 必填 | 说明                               |
60| --------- | ----------------------------------------- | ---- | ---------------------------------- |
61| uiContext | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
62
63### getRenderNode
64
65getRenderNode(): RenderNode | null
66
67获取FrameNode中持有的RenderNode。
68
69**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
70
71**系统能力:** SystemCapability.ArkUI.ArkUI.Full
72
73**返回值:**
74
75| 类型                                                           | 说明                                                                                                             |
76| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
77| [RenderNode](./js-apis-arkui-renderNode.md#rendernode) \| null | 一个RenderNode对象。若该FrameNode不包含RenderNode,则返回空对象null。如果当前FrameNode为声明式组件创建的节点,则返回null。 |
78
79**示例:**
80
81```ts
82import { NodeController, FrameNode } from '@kit.ArkUI';
83
84class MyNodeController extends NodeController {
85  private rootNode: FrameNode | null = null;
86
87  makeNode(uiContext: UIContext): FrameNode | null {
88    this.rootNode = new FrameNode(uiContext);
89
90    const renderNode = this.rootNode.getRenderNode();
91    if (renderNode !== null) {
92      renderNode.size = { width: 100, height: 100 };
93      renderNode.backgroundColor = 0XFFFF0000;
94    }
95
96    return this.rootNode;
97  }
98}
99
100@Entry
101@Component
102struct Index {
103  private myNodeController: MyNodeController = new MyNodeController();
104
105  build() {
106    Row() {
107      NodeContainer(this.myNodeController)
108    }
109  }
110}
111```
112### isModifiable<sup>12+</sup>
113
114isModifiable(): boolean
115
116判断当前节点是否可修改。
117
118**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
119
120**系统能力:** SystemCapability.ArkUI.ArkUI.Full
121
122**返回值:**
123
124| 类型    | 说明                                                                                                                                  |
125| ------- | ------------------------------------------------------------------------------------------------------------------------------------- |
126| boolean | 判断当前节点是否可修改。当返回false的时候,当前FrameNode不支持appendChild、insertChildAfter、removeChild、clearChildren的操作。 |
127
128**示例:**
129
130请参考[节点操作示例](#节点操作示例)。
131
132### appendChild<sup>12+</sup>
133
134appendChild(node: FrameNode): void
135
136在FrameNode最后一个子节点后添加新的子节点。当前FrameNode如果不可修改,抛出异常信息。[typeNode](#typenode12)在appendChild时会校验子组件类型或个数,不满足抛出异常信息,限制情况请查看[typeNode](#typenode12)描述。
137
138**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
139
140**系统能力:** SystemCapability.ArkUI.ArkUI.Full
141
142**参数:**
143
144| 参数名 | 类型                    | 必填 | 说明                  |
145| ------ | ----------------------- | ---- | --------------------- |
146| node   | [FrameNode](#framenode) | 是   | 需要添加的FrameNode。<br/>**说明:**<br/> node节点不可以为声明式创建的节点,即不可修改的FrameNode。仅有从BuilderNode中获取的声明式节点可以作为子节点。若子节点不符合规格,则抛出异常信息。<br/> node节点不可以拥有父节点,否则抛出异常信息。|
147
148**错误码:**
149
150| 错误码ID | 错误信息                         |
151| -------- | -------------------------------- |
152| 100021   | The FrameNode is not modifiable. |
153
154**示例:**
155
156请参考[节点操作示例](#节点操作示例)。
157
158### insertChildAfter<sup>12+</sup>
159
160insertChildAfter(child: FrameNode, sibling: FrameNode | null): void
161
162在FrameNode指定子节点之后添加新的子节点。当前FrameNode如果不可修改,抛出异常信息。
163
164**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
165
166**系统能力:** SystemCapability.ArkUI.ArkUI.Full
167
168**参数:**
169
170| 参数名  | 类型                                      | 必填 | 说明                                                                         |
171| ------- | ----------------------------------------- | ---- | ---------------------------------------------------------------------------- |
172| child   | [FrameNode](#framenode)                   | 是   | 需要添加的子节点。<br/>**说明:**<br/> child节点不可以为声明式创建的节点,即不可修改的FrameNode。仅有从BuilderNode中获取的声明式节点可以作为子节点。若子节点不符合规格,则抛出异常信息。<br/> child节点不可以拥有父节点,否则抛出异常信息。                                                           |
173| sibling | [FrameNode](#framenode)&nbsp;\|&nbsp;null | 是   | 新节点将插入到该节点之后。若该参数设置为空,则新节点将插入到首个子节点之前。 |
174
175**错误码:**
176
177| 错误码ID | 错误信息                         |
178| -------- | -------------------------------- |
179| 100021   | The FrameNode is not modifiable. |
180
181**示例:**
182
183请参考[节点操作示例](#节点操作示例)。
184
185### removeChild<sup>12+</sup>
186
187removeChild(node: FrameNode): void
188
189从FrameNode中删除指定的子节点。当前FrameNode如果不可修改,抛出异常信息。
190
191**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
192
193**系统能力:** SystemCapability.ArkUI.ArkUI.Full
194
195**参数:**
196
197| 参数名 | 类型                    | 必填 | 说明               |
198| ------ | ----------------------- | ---- | ------------------ |
199| node   | [FrameNode](#framenode) | 是   | 需要删除的子节点。 |
200
201**错误码:**
202
203| 错误码ID | 错误信息                         |
204| -------- | -------------------------------- |
205| 100021   | The FrameNode is not modifiable. |
206
207**示例:**
208
209请参考[节点操作示例](#节点操作示例)。
210
211### clearChildren<sup>12+</sup>
212
213clearChildren(): void
214
215清除当前FrameNode的所有子节点。当前FrameNode如果不可修改,抛出异常信息。
216
217**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
218
219**系统能力:** SystemCapability.ArkUI.ArkUI.Full
220
221**错误码:**
222
223| 错误码ID | 错误信息                         |
224| -------- | -------------------------------- |
225| 100021   | The FrameNode is not modifiable. |
226
227**示例:**
228
229请参考[节点操作示例](#节点操作示例)。
230
231### getChild<sup>12+</sup>
232
233getChild(index: number): FrameNode | null
234
235获取当前节点指定位置的子节点。
236
237**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
238
239**系统能力:** SystemCapability.ArkUI.ArkUI.Full
240
241**参数:**
242
243| 参数名 | 类型   | 必填 | 说明                       |
244| ------ | ------ | ---- | -------------------------- |
245| index  | number | 是   | 需要查询的子节点的序列号。<br/>若当前节点有n个子节点,index取值范围为[0, n-1]。 |
246
247**返回值:**
248
249| 类型                            | 说明                                                          |
250| ------------------------------- | ------------------------------------------------------------- |
251| [FrameNode](#framenode) \| null | 子节点。若该FrameNode不包含所查询的子节点,则返回空对象null。 |
252
253**示例:**
254
255请参考[节点操作示例](#节点操作示例)。
256
257### getChild<sup>15+</sup>
258
259getChild(index: number, expandMode?: ExpandMode): FrameNode | null
260
261获取当前节点指定位置的子节点,支持指定子节点展开模式。
262
263**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
264
265**系统能力:** SystemCapability.ArkUI.ArkUI.Full
266
267**参数:**
268
269| 参数名 | 类型   | 必填 | 说明                       |
270| ------ | ------ | ---- | -------------------------- |
271| index  | number | 是   | 需要查询的子节点的序列号。<br/>若当前节点有n个子节点,index取值范围为[0, n-1]。 |
272| expandMode | [ExpandMode](#expandmode15) | 否 | 指定子节点展开模式。<br/>默认值:ExpandMode.EXPAND |
273
274**返回值:**
275
276| 类型                            | 说明                                                          |
277| ------------------------------- | ------------------------------------------------------------- |
278| [FrameNode](#framenode) \| null | 子节点。若该FrameNode不包含所查询的子节点,则返回空对象null。 |
279
280**示例:**
281
282请参考[LazyForEach场景节点操作示例](#lazyforeach场景节点操作示例)。
283
284### getFirstChildIndexWithoutExpand<sup>15+</sup>
285
286getFirstChildIndexWithoutExpand(): number
287
288获取当前节点第一个在主节点树上的子节点的序列号。子节点序列号按所有子节点计算。
289
290**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
291
292**系统能力:** SystemCapability.ArkUI.ArkUI.Full
293
294**返回值:**
295
296| 类型   | 说明                                      |
297| ------ | ---------------------------------------- |
298| number | 当前节点第一个在主节点树上的子节点的序列号。 |
299
300**示例:**
301
302请参考[LazyForEach场景节点操作示例](#lazyforeach场景节点操作示例)。
303
304### getLastChildIndexWithoutExpand<sup>15+</sup>
305
306getLastChildIndexWithoutExpand(): number
307
308获取当前节点最后一个在主节点树上的子节点的序列号。子节点序列号按所有子节点计算。
309
310**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
311
312**系统能力:** SystemCapability.ArkUI.ArkUI.Full
313
314**返回值:**
315
316| 类型   | 说明                                        |
317| ------ | ------------------------------------------ |
318| number | 当前节点最后一个在主节点树上的子节点的序列号。 |
319
320**示例:**
321
322请参考[LazyForEach场景节点操作示例](#lazyforeach场景节点操作示例)。
323
324### getFirstChild<sup>12+</sup>
325
326getFirstChild(): FrameNode | null
327
328获取当前FrameNode的第一个子节点。
329
330**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
331
332**系统能力:** SystemCapability.ArkUI.ArkUI.Full
333
334**返回值:**
335
336| 类型                            | 说明                                                      |
337| ------------------------------- | --------------------------------------------------------- |
338| [FrameNode](#framenode) \| null | 首个子节点。若该FrameNode不包含子节点,则返回空对象null。 |
339
340**示例:**
341
342请参考[节点操作示例](#节点操作示例)。
343
344### getNextSibling<sup>12+</sup>
345
346getNextSibling(): FrameNode | null
347
348获取当前FrameNode的下一个同级节点。
349
350**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
351
352**系统能力:** SystemCapability.ArkUI.ArkUI.Full
353
354**返回值:**
355
356| 类型                            | 说明                                                                                 |
357| ------------------------------- | ------------------------------------------------------------------------------------ |
358| [FrameNode](#framenode) \| null | 当前FrameNode的下一个同级节点。若该FrameNode不包含下一个同级节点,则返回空对象null。 |
359
360**示例:**
361
362请参考[节点操作示例](#节点操作示例)。
363
364### getPreviousSibling<sup>12+</sup>
365
366getPreviousSibling(): FrameNode | null
367
368获取当前FrameNode的上一个同级节点。
369
370**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
371
372**系统能力:** SystemCapability.ArkUI.ArkUI.Full
373
374**返回值:**
375
376| 类型                             | 说明                                                                                 |
377| -------------------------------- | ------------------------------------------------------------------------------------ |
378| [FrameNode](#framenode) \| null | 当前FrameNode的上一个同级节点。若该FrameNode不包含上一个同级节点,则返回空对象null。 |
379
380**示例:**
381
382请参考[节点操作示例](#节点操作示例)。
383
384### getParent<sup>12+</sup>
385
386getParent(): FrameNode | null;
387
388获取当前FrameNode的父节点。
389
390**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
391
392**系统能力:** SystemCapability.ArkUI.ArkUI.Full
393
394**返回值:**
395
396| 类型                             | 说明                                                                 |
397| -------------------------------- | -------------------------------------------------------------------- |
398| [FrameNode](#framenode) \| null | 当前FrameNode的父节点。若该FrameNode不包含父节点,则返回空对象null。 |
399
400**示例:**
401
402请参考[节点操作示例](#节点操作示例)。
403
404
405### getChildrenCount<sup>12+</sup>
406
407  getChildrenCount(): number;
408
409获取当前FrameNode的子节点数量。
410
411**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
412
413**系统能力:** SystemCapability.ArkUI.ArkUI.Full
414
415**返回值:**
416
417| 类型     | 说明                            |
418| -------- | ------------------------------- |
419| number | 获取当前FrameNode的子节点数量。 |
420
421**示例:**
422
423请参考[节点操作示例](#节点操作示例)。
424
425### moveTo<sup>18+</sup>
426
427moveTo(targetParent: FrameNode, index?: number): void
428
429将当前FrameNode移动到目标FrameNode的指定位置。当前FrameNode如果不可修改,抛出异常信息。targetParent为[typeNode](#typenode12)时会校验子组件类型或个数,不满足抛出异常信息,限制情况请查看[typeNode](#typenode12)描述。
430
431> **说明:**
432>
433> 当前仅支持以下类型的[TypedFrameNode](#typedframenode12)进行移动操作:[Stack](#stack12)、[XComponent](#xcomponent12)。对于其他类型的节点,移动操作不会生效。
434
435**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
436
437**系统能力:** SystemCapability.ArkUI.ArkUI.Full
438
439**参数:**
440
441| 参数名        | 类型                    | 必填 | 说明                  |
442| ------------ | ----------------------- | ---- | --------------------- |
443| targetParent | [FrameNode](#framenode) | 是   | 目标父节点。<br/>**说明:**<br/>targetParent节点不可以为声明式创建的节点,即不可修改的FrameNode。若目标父节点不符合规格,则抛出异常信息。 |
444| index        | number                  | 否   | 子节点序列号。当前FrameNode将被添加到目标FrameNode对应序列号的子节点之前,若目标FrameNode有n个节点,index取值范围为[0, n-1]。<br/>若参数无效或不指定,则添加到目标FrameNode的最后。<br/>默认值:-1 |
445
446**错误码:**
447
448| 错误码ID | 错误信息                          |
449| -------- | -------------------------------- |
450| 100021   | The FrameNode is not modifiable. |
451
452**示例:**
453
454请参考[节点操作示例](#节点操作示例)。
455
456### getPositionToWindow<sup>12+</sup>
457
458  getPositionToWindow(): Position
459
460获取FrameNode相对于窗口的位置偏移,单位为VP。
461
462**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
463
464**系统能力:** SystemCapability.ArkUI.ArkUI.Full
465
466**返回值:**
467
468| 类型     | 说明                            |
469| -------- | ------------------------------- |
470| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于窗口的位置偏移,单位为VP。 |
471
472**示例:**
473
474请参考[节点操作示例](#节点操作示例)。
475
476
477### getPositionToParent<sup>12+</sup>
478
479getPositionToParent(): Position
480
481获取FrameNode相对于父组件的位置偏移,单位为VP。
482
483**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
484
485**系统能力:** SystemCapability.ArkUI.ArkUI.Full
486
487**返回值:**
488
489| 类型                                                           | 说明                                                                  |
490| -------------------------------------------------------------- | --------------------------------------------------------------------- |
491| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于父组件的位置偏移,单位为VP。 |
492
493**示例:**
494
495请参考[节点操作示例](#节点操作示例)。
496
497### getPositionToScreen<sup>12+</sup>
498
499  getPositionToScreen(): Position
500
501获取FrameNode相对于屏幕的位置偏移,单位为VP。
502
503**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
504
505**系统能力:** SystemCapability.ArkUI.ArkUI.Full
506
507**返回值:**
508
509| 类型     | 说明                            |
510| -------- | ------------------------------- |
511| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于屏幕的位置偏移,单位为VP。 |
512
513**示例:**
514
515请参考[节点操作示例](#节点操作示例)。
516
517
518### getPositionToParentWithTransform<sup>12+</sup>
519
520getPositionToParentWithTransform(): Position
521
522获取FrameNode相对于父组件带有绘制属性的位置偏移,单位为VP,绘制属性比如transform, translate等,返回的坐标是组件布局时左上角变换后的坐标。
523
524**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
525
526**系统能力:** SystemCapability.ArkUI.ArkUI.Full
527
528**返回值:**
529
530| 类型                                                           | 说明                                                                  |
531| -------------------------------------------------------------- | --------------------------------------------------------------------- |
532| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于父组件的位置偏移,单位为VP。 当设置了其他(比如:transform, translate等)绘制属性,由于浮点数精度的影响,返回值会有微小偏差。 |
533
534**示例:**
535
536请参考[节点操作示例](#节点操作示例)。
537
538### getPositionToWindowWithTransform<sup>12+</sup>
539
540getPositionToWindowWithTransform(): Position
541
542获取FrameNode相对于窗口带有绘制属性的位置偏移,单位为VP,绘制属性比如transform, translate等,返回的坐标是组件布局时左上角变换后的坐标。
543
544**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
545
546**系统能力:** SystemCapability.ArkUI.ArkUI.Full
547
548**返回值:**
549
550| 类型                                                           | 说明                                                                  |
551| -------------------------------------------------------------- | --------------------------------------------------------------------- |
552| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于窗口的位置偏移,单位为VP。 当设置了其他(比如:transform, translate等)绘制属性,由于浮点数精度的影响,返回值会有微小偏差。 |
553
554**示例:**
555
556请参考[节点操作示例](#节点操作示例)。
557
558### getPositionToScreenWithTransform<sup>12+</sup>
559
560getPositionToScreenWithTransform(): Position
561
562获取FrameNode相对于屏幕带有绘制属性的位置偏移,单位为VP,绘制属性比如transform, translate等,返回的坐标是组件布局时左上角变换后的坐标。
563
564**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
565
566**系统能力:** SystemCapability.ArkUI.ArkUI.Full
567
568**返回值:**
569
570| 类型                                                           | 说明                                                                  |
571| -------------------------------------------------------------- | --------------------------------------------------------------------- |
572| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于屏幕的位置偏移,单位为VP。 当设置了其他(比如:transform, translate等)绘制属性,由于浮点数精度的影响,返回值会有微小偏差。 |
573
574**示例:**
575
576请参考[节点操作示例](#节点操作示例)。
577
578
579### getMeasuredSize<sup>12+</sup>
580
581getMeasuredSize(): Size
582
583获取FrameNode测量后的大小,单位为PX。
584
585**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
586
587**系统能力:** SystemCapability.ArkUI.ArkUI.Full
588
589**返回值:**
590
591| 类型                                                           | 说明                                                                  |
592| -------------------------------------------------------------- | --------------------------------------------------------------------- |
593| [Size](./js-apis-arkui-graphics.md#size) | 节点测量后的大小,单位为PX。 |
594
595**示例:**
596
597请参考[节点操作示例](#节点操作示例)。
598
599
600### getLayoutPosition<sup>12+</sup>
601
602getLayoutPosition(): Position
603
604获取FrameNode布局后相对于父组件的位置偏移,单位为PX。该偏移是父容器对该节点进行布局之后的结果,因此布局之后生效的offset属性和不参与布局的position属性不影响该偏移值。
605
606**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
607
608**系统能力:** SystemCapability.ArkUI.ArkUI.Full
609
610**返回值:**
611
612| 类型                                                           | 说明                                                                  |
613| -------------------------------------------------------------- | --------------------------------------------------------------------- |
614| [Position](./js-apis-arkui-graphics.md#position) | 节点布局后相对于父组件的位置偏移,单位为PX。 |
615
616**示例:**
617
618请参考[节点操作示例](#节点操作示例)。
619
620### getUserConfigBorderWidth<sup>12+</sup>
621
622getUserConfigBorderWidth(): Edges\<LengthMetrics\>
623
624获取用户设置的边框宽度。
625
626**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
627
628**系统能力:** SystemCapability.ArkUI.ArkUI.Full
629
630**返回值:**
631
632| 类型                                                           | 说明                                                                  |
633| -------------------------------------------------------------- | --------------------------------------------------------------------- |
634| [Edges](./js-apis-arkui-graphics.md#edgest12)\<[LengthMetrics](./js-apis-arkui-graphics.md#lengthmetrics12)\> | 用户设置的边框宽度。 |
635
636**示例:**
637
638请参考[节点操作示例](#节点操作示例)。
639
640### getUserConfigPadding<sup>12+</sup>
641
642getUserConfigPadding(): Edges\<LengthMetrics\>
643
644获取用户设置的内边距。
645
646**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
647
648**系统能力:** SystemCapability.ArkUI.ArkUI.Full
649
650**返回值:**
651
652| 类型                                                           | 说明                                                                  |
653| -------------------------------------------------------------- | --------------------------------------------------------------------- |
654| [Edges](./js-apis-arkui-graphics.md#edgest12)\<[LengthMetrics](./js-apis-arkui-graphics.md#lengthmetrics12)\> | 用户设置的内边距。 |
655
656**示例:**
657
658请参考[节点操作示例](#节点操作示例)。
659
660### getUserConfigMargin<sup>12+</sup>
661
662getUserConfigMargin(): Edges\<LengthMetrics\>
663
664获取用户设置的外边距。
665
666**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
667
668**系统能力:** SystemCapability.ArkUI.ArkUI.Full
669
670**返回值:**
671
672| 类型                                                           | 说明                                                                  |
673| -------------------------------------------------------------- | --------------------------------------------------------------------- |
674| [Edges](./js-apis-arkui-graphics.md#edgest12)\<[LengthMetrics](./js-apis-arkui-graphics.md#lengthmetrics12)\> | 用户设置的外边距。 |
675
676**示例:**
677
678请参考[节点操作示例](#节点操作示例)。
679
680### getUserConfigSize<sup>12+</sup>
681
682getUserConfigSize(): SizeT\<LengthMetrics\>
683
684获取用户设置的宽高。
685
686**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
687
688**系统能力:** SystemCapability.ArkUI.ArkUI.Full
689
690**返回值:**
691
692| 类型                                                         | 说明             |
693| ------------------------------------------------------------ | ---------------- |
694| [SizeT](./js-apis-arkui-graphics.md#sizett12)\<[LengthMetrics](./js-apis-arkui-graphics.md#lengthmetrics12)\> | 用户设置的宽高。 |
695
696**示例:**
697
698请参考[节点操作示例](#节点操作示例)。
699
700### getId<sup>12+</sup>
701
702getId(): string
703
704获取用户设置的节点ID(通用属性设置的[ID](./arkui-ts/ts-universal-attributes-component-id.md))。
705
706**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
707
708**系统能力:** SystemCapability.ArkUI.ArkUI.Full
709
710**返回值:**
711
712| 类型                                                           | 说明                                                                  |
713| -------------------------------------------------------------- | --------------------------------------------------------------------- |
714| string | 用户设置的节点ID(通用属性设置的[ID](./arkui-ts/ts-universal-attributes-component-id.md))。 |
715
716**示例:**
717
718请参考[节点操作示例](#节点操作示例)。
719
720### getUniqueId<sup>12+</sup>
721
722getUniqueId(): number
723
724获取系统分配的唯一标识的节点UniqueID。
725
726**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
727
728**系统能力:** SystemCapability.ArkUI.ArkUI.Full
729
730**返回值:**
731
732| 类型                                                           | 说明                                                                  |
733| -------------------------------------------------------------- | --------------------------------------------------------------------- |
734| number | 系统分配的唯一标识的节点UniqueID。 |
735
736**示例:**
737
738请参考[节点操作示例](#节点操作示例)。
739
740### getNodeType<sup>12+</sup>
741
742getNodeType(): string
743
744获取节点的类型。系统组件类型为组件名称,例如,按钮组件Button的类型为Button。而对于自定义组件,若其有渲染内容,则其类型为__Common__。
745
746**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
747
748**系统能力:** SystemCapability.ArkUI.ArkUI.Full
749
750**返回值:**
751
752| 类型                                                           | 说明                                                                  |
753| -------------------------------------------------------------- | --------------------------------------------------------------------- |
754| string | 节点的类型。 |
755
756**示例:**
757
758请参考[节点操作示例](#节点操作示例)。
759
760### getOpacity<sup>12+</sup>
761
762getOpacity(): number
763
764获取节点的不透明度,最小值为0,最大值为1。
765
766**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
767
768**系统能力:** SystemCapability.ArkUI.ArkUI.Full
769
770**返回值:**
771
772| 类型                                                           | 说明                                                                  |
773| -------------------------------------------------------------- | --------------------------------------------------------------------- |
774| number | 节点的不透明度。范围是[0, 1],值越大透明度越低。 |
775
776**示例:**
777
778请参考[节点操作示例](#节点操作示例)。
779
780### isVisible<sup>12+</sup>
781
782isVisible(): boolean
783
784获取节点是否可见。
785
786**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
787
788**系统能力:** SystemCapability.ArkUI.ArkUI.Full
789
790**返回值:**
791
792| 类型                                                           | 说明                                                                  |
793| -------------------------------------------------------------- | --------------------------------------------------------------------- |
794| boolean | 节点是否可见。<br/>true表示节点可见,false表示节点不可见。 |
795
796**示例:**
797
798请参考[节点操作示例](#节点操作示例)。
799
800### isClipToFrame<sup>12+</sup>
801
802isClipToFrame(): boolean
803
804获取节点是否是剪裁到组件区域。当调用[dispose](#dispose12)解除对实体FrameNode节点的引用关系之后,返回值为true。
805
806**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
807
808**系统能力:** SystemCapability.ArkUI.ArkUI.Full
809
810**返回值:**
811
812| 类型                                                           | 说明                                                                  |
813| -------------------------------------------------------------- | --------------------------------------------------------------------- |
814| boolean | 节点是否是剪裁到组件区域。<br/>true表示节点剪裁到组件区域,false表示节点不是剪裁到组件区域。 |
815
816**示例:**
817
818请参考[节点操作示例](#节点操作示例)。
819
820### isAttached<sup>12+</sup>
821
822isAttached(): boolean
823
824获取节点是否被挂载到主节点树上。
825
826**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
827
828**系统能力:** SystemCapability.ArkUI.ArkUI.Full
829
830**返回值:**
831
832| 类型                                                           | 说明                                                                  |
833| -------------------------------------------------------------- | --------------------------------------------------------------------- |
834| boolean | 节点是否被挂载到主节点树上。<br/>true表示节点被挂载到主节点树上,false表示节点不是被挂载到主节点树上。 |
835
836**示例:**
837
838请参考[节点操作示例](#节点操作示例)。
839
840### getInspectorInfo<sup>12+</sup>
841
842getInspectorInfo(): Object
843
844获取节点的结构信息,该信息和DevEco Studio内置<!--RP1-->ArkUI Inspector<!--RP1End-->工具里面的一致。
845
846**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
847
848**系统能力:** SystemCapability.ArkUI.ArkUI.Full
849
850**返回值:**
851
852| 类型                                                           | 说明                                                                  |
853| -------------------------------------------------------------- | --------------------------------------------------------------------- |
854| Object | 节点的结构信息。 |
855
856**示例:**
857
858请参考[节点操作示例](#节点操作示例)。
859
860### getCustomProperty<sup>12+</sup>
861
862getCustomProperty(name: string): Object | undefined
863
864通过名称获取组件的自定义属性。
865
866**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
867
868**系统能力:** SystemCapability.ArkUI.ArkUI.Full
869
870**参数:**
871
872| 参数名 | 类型                                                 | 必填 | 说明                                                         |
873| ------ | ---------------------------------------------------- | ---- | ------------------------------------------------------------ |
874| name  | string | 是   | 自定义属性的名称。 |
875
876**返回值:**
877
878| 类型                                                           | 说明                                                                  |
879| -------------------------------------------------------------- | --------------------------------------------------------------------- |
880| Object \| undefined | 自定义属性的值。 |
881
882**示例:**
883
884请参考[节点操作示例](#节点操作示例)。
885
886### dispose<sup>12+</sup>
887
888dispose(): void
889
890立即解除当前FrameNode对象对实体FrameNode节点的引用关系。
891
892**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
893
894**系统能力:** SystemCapability.ArkUI.ArkUI.Full
895
896> **说明:**
897>
898> FrameNode对象调用dispose后,由于不对应任何实体FrameNode节点,在调用部分查询接口([getMeasuredSize](#getmeasuredsize12)、[getLayoutPosition](#getlayoutposition12))的时候会导致应用出现jscrash。
899>
900> 通过[getUniqueId](#getuniqueid12)可以判断当前FrameNode是否对应一个实体FrameNode节点。当UniqueId大于0时表示该对象对应一个实体FrameNode节点。
901
902**示例:**
903
904```ts
905import { NodeController, FrameNode, BuilderNode } from '@kit.ArkUI';
906
907@Component
908struct TestComponent {
909  build() {
910    Column() {
911      Text('This is a BuilderNode.')
912        .fontSize(16)
913        .fontWeight(FontWeight.Bold)
914    }
915    .width('100%')
916    .backgroundColor(Color.Gray)
917  }
918
919  aboutToAppear() {
920    console.error('aboutToAppear');
921  }
922
923  aboutToDisappear() {
924    console.error('aboutToDisappear');
925  }
926}
927
928@Builder
929function buildComponent() {
930  TestComponent()
931}
932
933class MyNodeController extends NodeController {
934  private rootNode: FrameNode | null = null;
935  private builderNode: BuilderNode<[]> | null = null;
936
937  makeNode(uiContext: UIContext): FrameNode | null {
938    this.rootNode = new FrameNode(uiContext);
939    this.builderNode = new BuilderNode(uiContext, { selfIdealSize: { width: 200, height: 100 } });
940    this.builderNode.build(new WrappedBuilder(buildComponent));
941
942    const rootRenderNode = this.rootNode.getRenderNode();
943    if (rootRenderNode !== null) {
944      rootRenderNode.size = { width: 200, height: 200 };
945      rootRenderNode.backgroundColor = 0xff00ff00;
946      rootRenderNode.appendChild(this.builderNode!.getFrameNode()!.getRenderNode());
947    }
948
949    return this.rootNode;
950  }
951
952  disposeFrameNode() {
953    if (this.rootNode !== null && this.builderNode !== null) {
954      this.rootNode.removeChild(this.builderNode.getFrameNode());
955      this.builderNode.dispose();
956
957      this.rootNode.dispose();
958    }
959  }
960
961  removeBuilderNode() {
962    const rootRenderNode = this.rootNode!.getRenderNode();
963    if (rootRenderNode !== null && this.builderNode !== null && this.builderNode.getFrameNode() !== null) {
964      rootRenderNode.removeChild(this.builderNode!.getFrameNode()!.getRenderNode());
965    }
966  }
967}
968
969@Entry
970@Component
971struct Index {
972  private myNodeController: MyNodeController = new MyNodeController();
973
974  build() {
975    Column({ space: 4 }) {
976      NodeContainer(this.myNodeController)
977      Button('FrameNode dispose')
978        .onClick(() => {
979          this.myNodeController.disposeFrameNode();
980        })
981        .width('100%')
982    }
983  }
984}
985```
986
987### commonAttribute<sup>12+</sup>
988
989get commonAttribute(): CommonAttribute
990
991获取FrameNode中持有的CommonAttribute接口,用于设置通用属性。
992
993仅可以修改自定义节点的属性。
994
995**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
996
997**系统能力:** SystemCapability.ArkUI.ArkUI.Full
998
999**返回值:**
1000
1001| 类型                                                           | 说明                                                                                                             |
1002| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
1003| CommonAttribute | 获取FrameNode中持有的CommonAttribute接口,用于设置通用属性。|
1004
1005> **说明:**
1006>
1007> FrameNode的效果参考对齐方式为顶部起始端的[Stack](./arkui-ts/ts-container-stack.md)容器组件。
1008>
1009> FrameNode的属性支持范围参考[CommonModifier](./arkui-ts/ts-universal-attributes-attribute-modifier.md#自定义modifier)。
1010
1011**示例:**
1012
1013请参考[基础事件示例](#基础事件示例)。
1014
1015### commonEvent<sup>12+</sup>
1016
1017get commonEvent(): UICommonEvent
1018
1019获取FrameNode中持有的UICommonEvent对象,用于设置基础事件。设置的基础事件与声明式定义的事件平行,参与事件竞争;设置的基础事件不覆盖原有的声明式事件。同时设置两个事件回调的时候,优先回调声明式事件。
1020
1021LazyForEach场景下,由于存在节点的销毁重建,对于重建的节点需要重新设置事件回调才能保证监听事件正常响应。
1022
1023**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1024
1025**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1026
1027**返回值:**
1028
1029| 类型                                                           | 说明                                                                                                             |
1030| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
1031| [UICommonEvent](./arkui-ts/ts-uicommonevent.md#设置事件回调) | UICommonEvent对象,用于设置基础事件。 |
1032
1033**示例:**
1034
1035请参考[基础事件示例](#基础事件示例)和[LazyForEach场景基础事件使用示例](#lazyforeach场景基础事件使用示例)。
1036
1037### gestureEvent<sup>14+</sup>
1038
1039get gestureEvent(): UIGestureEvent
1040
1041获取FrameNode中持有的UIGestureEvent对象,用于设置组件绑定的手势事件。通过gestureEvent接口设置的手势不会覆盖通过[声明式手势接口](./arkui-ts/ts-gesture-settings.md)绑定的手势,两者同时设置了手势时,优先回调声明式接口设置的手势事件。
1042
1043**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
1044
1045**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1046
1047**返回值:**
1048
1049| 类型                                                           | 说明                                                                                                             |
1050| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
1051| [UIGestureEvent](./arkui-ts/ts-uigestureevent.md#设置组件绑定的手势) | UIGestureEvent对象,用于设置组件绑定的手势。 |
1052
1053**示例:**
1054
1055请参考[手势事件示例](#手势事件示例)。
1056
1057### onDraw<sup>12+</sup>
1058
1059onDraw?(context: DrawContext): void
1060
1061FrameNode的自绘制方法,该方法会在FrameNode进行内容绘制时被调用。
1062
1063**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1064
1065**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1066
1067**参数:**
1068
1069| 参数名  | 类型                                                   | 必填 | 说明             |
1070| ------- | ------------------------------------------------------ | ---- | ---------------- |
1071| context | [DrawContext](./js-apis-arkui-graphics.md#drawcontext) | 是   | 图形绘制上下文。自绘制区域无法超出组件自身大小。 |
1072
1073**示例:**
1074
1075请参考[节点自定义示例](#节点自定义示例)。
1076
1077### onMeasure<sup>12+</sup>
1078
1079onMeasure(constraint: LayoutConstraint): void
1080
1081FrameNode的自定义测量方法,该方法会重写默认测量方法,在FrameNode进行测量时被调用,测量FrameNode及其内容的大小。
1082
1083**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1084
1085**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1086
1087**参数:**
1088
1089| 参数名  | 类型                                                   | 必填 | 说明             |
1090| ------- | ------------------------------------------------------ | ---- | ---------------- |
1091| constraint | [LayoutConstraint](#layoutconstraint12) | 是   | 组件进行测量时使用的布局约束。 |
1092
1093**示例:**
1094
1095请参考[节点自定义示例](#节点自定义示例)。
1096
1097### LayoutConstraint<sup>12+</sup>
1098
1099描述组件的布局约束。
1100
1101**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1102
1103**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1104
1105| 名称            |  类型  | 必填  | 说明                                       |
1106| -------------- | ------ | ----- | ------------------------------------------ |
1107| maxSize           | [Size](./js-apis-arkui-graphics.md#size) | 是    | 最大尺寸。              |
1108| minSize            | [Size](./js-apis-arkui-graphics.md#size) | 是    | 最小尺寸。                  |
1109| percentReference      | [Size](./js-apis-arkui-graphics.md#size) | 是    | 子节点计算百分比时的尺寸基准。
1110
1111### onLayout<sup>12+</sup>
1112
1113onLayout(position: Position): void
1114
1115FrameNode的自定义布局方法,该方法会重写默认布局方法,在FrameNode进行布局时被调用,为FrameNode及其子节点指定位置。
1116
1117**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1118
1119**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1120
1121**参数:**
1122
1123| 参数名  | 类型                                                   | 必填 | 说明             |
1124| ------- | ------------------------------------------------------ | ---- | ---------------- |
1125| position | [Position](./js-apis-arkui-graphics.md#position) | 是   | 组件进行布局时使用的位置信息。 |
1126
1127**示例:**
1128
1129请参考[节点自定义示例](#节点自定义示例)。
1130
1131### setMeasuredSize<sup>12+</sup>
1132
1133setMeasuredSize(size: Size): void
1134
1135设置FrameNode的测量后的尺寸,默认单位PX。若设置的宽高为负数,自动取零。
1136
1137**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1138
1139**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1140
1141**参数:**
1142
1143| 参数名  | 类型                                                   | 必填 | 说明             |
1144| ------- | ------------------------------------------------------ | ---- | ---------------- |
1145| size | [Size](./js-apis-arkui-graphics.md#size) | 是   | FrameNode的测量后的尺寸。 |
1146
1147**示例:**
1148
1149请参考[节点自定义示例](#节点自定义示例)。
1150
1151### setLayoutPosition<sup>12+</sup>
1152
1153setLayoutPosition(position: Position): void
1154
1155设置FrameNode的布局后的位置,默认单位PX。
1156
1157**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1158
1159**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1160
1161**参数:**
1162
1163| 参数名  | 类型                                                   | 必填 | 说明             |
1164| ------- | ------------------------------------------------------ | ---- | ---------------- |
1165| position | [Position](./js-apis-arkui-graphics.md#position) | 是   | FrameNode的布局后的位置。 |
1166
1167**示例:**
1168
1169请参考[节点自定义示例](#节点自定义示例)。
1170
1171### measure<sup>12+</sup>
1172
1173measure(constraint: LayoutConstraint): void
1174
1175调用FrameNode的测量方法,根据父容器的布局约束,对FrameNode进行测量,计算出尺寸,如果测量方法被重写,则调用重写的方法。建议在[onMeasure](#onmeasure12)方法中调用。
1176
1177**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1178
1179**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1180
1181**参数:**
1182
1183| 参数名  | 类型                                                   | 必填 | 说明             |
1184| ------- | ------------------------------------------------------ | ---- | ---------------- |
1185| constraint | [LayoutConstraint](#layoutconstraint12) | 是   | 组件进行测量时使用的父容器布局约束。 |
1186
1187**示例:**
1188
1189请参考[节点自定义示例](#节点自定义示例)。
1190
1191### layout<sup>12+</sup>
1192
1193layout(position: Position): void
1194
1195调用FrameNode的布局方法,为FrameNode及其子节点指定布局位置,如果布局方法被重写,则调用重写的方法。建议在[onLayout](#onlayout12)方法中调用。
1196
1197**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1198
1199**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1200
1201**参数:**
1202
1203| 参数名  | 类型                                                   | 必填 | 说明             |
1204| ------- | ------------------------------------------------------ | ---- | ---------------- |
1205| position | [Position](./js-apis-arkui-graphics.md#position) | 是   | 组件进行布局时使用的位置信息。 |
1206
1207**示例:**
1208
1209请参考[节点自定义示例](#节点自定义示例)。
1210
1211### setNeedsLayout<sup>12+</sup>
1212
1213setNeedsLayout(): void
1214
1215该方法会将FrameNode标记为需要布局的状态,下一帧将会进行重新布局。
1216
1217**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1218
1219**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1220
1221**示例:**
1222
1223请参考[节点自定义示例](#节点自定义示例)。
1224
1225### invalidate<sup>12+</sup>
1226
1227invalidate(): void
1228
1229该方法会触发FrameNode自绘制内容的重新渲染。
1230
1231**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1232
1233**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1234
1235### addComponentContent<sup>12+</sup>
1236
1237addComponentContent\<T>(content: ComponentContent\<T>): void
1238
1239支持添加ComponentContent类型的组件内容。要求当前节点是一个可修改的节点,即[isModifiable](#ismodifiable12)的返回值为true,否则抛出异常信息。
1240
1241**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1242
1243**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1244
1245**参数:**
1246
1247| 参数名  | 类型                                                   | 必填 | 说明             |
1248| ------- | ------------------------------------------------------ | ---- | ---------------- |
1249| content | [ComponentContent](./js-apis-arkui-ComponentContent.md#componentcontent)\<T> | 是   | FrameNode节点中显示的组件内容。 |
1250
1251**错误码:**
1252
1253| 错误码ID | 错误信息                         |
1254| -------- | -------------------------------- |
1255| 100021   | The FrameNode is not modifiable. |
1256
1257```ts
1258import { NodeController, FrameNode, ComponentContent, typeNode } from '@kit.ArkUI';
1259
1260@Builder
1261function buildText() {
1262  Column() {
1263    Text('hello')
1264      .width(50)
1265      .height(50)
1266      .backgroundColor(Color.Yellow)
1267  }
1268}
1269
1270class MyNodeController extends NodeController {
1271  makeNode(uiContext: UIContext): FrameNode | null {
1272    let node = new FrameNode(uiContext)
1273    node.commonAttribute.width(300).height(300).backgroundColor(Color.Red)
1274    let col = typeNode.createNode(uiContext, "Column")
1275    col.initialize({ space: 10 })
1276    node.appendChild(col)
1277    let row4 = typeNode.createNode(uiContext, "Row")
1278    row4.attribute.width(200)
1279      .height(200)
1280      .borderWidth(1)
1281      .borderColor(Color.Black)
1282      .backgroundColor(Color.Green)
1283    let component = new ComponentContent<Object>(uiContext, wrapBuilder(buildText))
1284    if (row4.isModifiable()) {
1285      row4.addComponentContent(component)
1286      col.appendChild(row4)
1287    }
1288    return node
1289  }
1290}
1291
1292@Entry
1293@Component
1294struct FrameNodeTypeTest {
1295  private myNodeController: MyNodeController = new MyNodeController();
1296
1297  build() {
1298    Row() {
1299      NodeContainer(this.myNodeController);
1300    }
1301  }
1302}
1303```
1304
1305### disposeTree<sup>12+</sup>
1306
1307disposeTree(): void
1308
1309下树并递归释放当前节点为根的子树。
1310
1311**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1312
1313**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1314
1315```ts
1316import { FrameNode, NodeController, BuilderNode } from '@kit.ArkUI';
1317
1318@Component
1319struct TestComponent {
1320  private myNodeController: MyNodeController = new MyNodeController(wrapBuilder(buildComponent2));
1321
1322  build() {
1323    Column() {
1324      Text('This is a BuilderNode.')
1325        .fontSize(16)
1326        .fontWeight(FontWeight.Bold)
1327      NodeContainer(this.myNodeController)
1328    }
1329    .width('100%')
1330    .backgroundColor(Color.Gray)
1331  }
1332
1333  aboutToAppear() {
1334    console.error('BuilderNode aboutToAppear');
1335  }
1336
1337  aboutToDisappear() {
1338    console.error('BuilderNode aboutToDisappear');
1339  }
1340}
1341
1342@Component
1343struct TestComponent2 {
1344  private myNodeController: MyNodeController = new MyNodeController(wrapBuilder(buildComponent3));
1345  private myNodeController2: MyNodeController = new MyNodeController(wrapBuilder(buildComponent4));
1346
1347  build() {
1348    Column() {
1349      Text('This is a BuilderNode 2.')
1350        .fontSize(16)
1351        .fontWeight(FontWeight.Bold)
1352      NodeContainer(this.myNodeController)
1353      NodeContainer(this.myNodeController2)
1354    }
1355    .width('100%')
1356    .backgroundColor(Color.Gray)
1357  }
1358
1359  aboutToAppear() {
1360    console.error('BuilderNode 2 aboutToAppear');
1361  }
1362
1363  aboutToDisappear() {
1364    console.error('BuilderNode 2 aboutToDisappear');
1365  }
1366}
1367
1368@Component
1369struct TestComponent3 {
1370  build() {
1371    Column() {
1372      Text('This is a BuilderNode 3.')
1373        .fontSize(16)
1374        .fontWeight(FontWeight.Bold)
1375
1376    }
1377    .width('100%')
1378    .backgroundColor(Color.Gray)
1379  }
1380
1381  aboutToAppear() {
1382    console.error('BuilderNode 3 aboutToAppear');
1383  }
1384
1385  aboutToDisappear() {
1386    console.error('BuilderNode 3 aboutToDisappear');
1387  }
1388}
1389
1390@Component
1391struct TestComponent4 {
1392  build() {
1393    Column() {
1394      Text('This is a BuilderNode 4.')
1395        .fontSize(16)
1396        .fontWeight(FontWeight.Bold)
1397
1398    }
1399    .width('100%')
1400    .backgroundColor(Color.Gray)
1401  }
1402
1403  aboutToAppear() {
1404    console.error('BuilderNode 4 aboutToAppear');
1405  }
1406
1407  aboutToDisappear() {
1408    console.error('BuilderNode 4 aboutToDisappear');
1409  }
1410}
1411
1412@Builder
1413function buildComponent() {
1414  TestComponent()
1415}
1416
1417@Builder
1418function buildComponent2() {
1419  TestComponent2()
1420}
1421
1422@Builder
1423function buildComponent3() {
1424  TestComponent3()
1425}
1426
1427@Builder
1428function buildComponent4() {
1429  TestComponent4()
1430}
1431
1432class MyNodeController extends NodeController {
1433  private rootNode: FrameNode | null = null;
1434  private builderNode: BuilderNode<[]> | null = null;
1435  private wrappedBuilder: WrappedBuilder<[]>;
1436
1437  constructor(builder: WrappedBuilder<[]>) {
1438    super();
1439    this.wrappedBuilder = builder;
1440  }
1441
1442  makeNode(uiContext: UIContext): FrameNode | null {
1443    this.builderNode = new BuilderNode(uiContext, { selfIdealSize: { width: 200, height: 100 } });
1444    this.builderNode.build(this.wrappedBuilder);
1445
1446    return this.builderNode.getFrameNode();
1447  }
1448
1449  dispose() {
1450    if (this.builderNode !== null) {
1451      this.builderNode.getFrameNode()?.disposeTree()
1452    }
1453  }
1454
1455  removeBuilderNode() {
1456    const rootRenderNode = this.rootNode!.getRenderNode();
1457    if (rootRenderNode !== null && this.builderNode !== null && this.builderNode.getFrameNode() !== null) {
1458      rootRenderNode.removeChild(this.builderNode!.getFrameNode()!.getRenderNode());
1459    }
1460  }
1461}
1462
1463@Entry
1464@Component
1465struct Index {
1466  private myNodeController: MyNodeController = new MyNodeController(wrapBuilder(buildComponent));
1467
1468  build() {
1469    Column({ space: 4 }) {
1470      NodeContainer(this.myNodeController)
1471      Button('BuilderNode dispose')
1472        .onClick(() => {
1473          this.myNodeController.dispose();
1474        })
1475        .width('100%')
1476      Button('BuilderNode rebuild')
1477        .onClick(() => {
1478          this.myNodeController.rebuild();
1479        })
1480        .width('100%')
1481    }
1482  }
1483}
1484```
1485
1486**示例:**
1487
1488请参考[节点自定义示例](#节点自定义示例)。
1489
1490### setCrossLanguageOptions<sup>15+</sup>
1491
1492setCrossLanguageOptions(options: CrossLanguageOptions): void
1493
1494设置当前FrameNode的跨ArkTS语言访问选项。例如ArkTS语言创建的节点,设置该节点是否可通过非ArkTS语言进行属性设置。当前FrameNode如果不可修改或不可设置跨ArkTS语言访问选项,抛出异常信息。
1495
1496> **说明:**
1497>
1498> 当前仅支持[Scroll](#scroll12)类型的[TypedFrameNode](#typedframenode12)设置跨ArkTS语言访问选项。
1499
1500**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
1501
1502**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1503
1504**参数:**
1505
1506| 参数名        | 类型                    | 必填 | 说明                  |
1507| ------------ | ----------------------- | ---- | --------------------- |
1508| options | [CrossLanguageOptions](#crosslanguageoptions15) | 是   | 跨ArkTS语言访问选项。 |
1509
1510**错误码:**
1511
1512| 错误码ID | 错误信息                          |
1513| -------- | -------------------------------- |
1514| 100022   | The FrameNode cannot be set whether to support cross-language common attribute setting. |
1515
1516**示例:**
1517
1518请参考[节点操作示例](#节点操作示例)。
1519
1520### getCrossLanguageOptions<sup>15+</sup>
1521
1522getCrossLanguageOptions(): CrossLanguageOptions
1523
1524获取当前FrameNode的跨ArkTS语言访问选项。例如ArkTS语言创建的节点,返回该节点是否可通过非ArkTS语言进行属性设置。
1525
1526**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
1527
1528**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1529
1530**返回值:**
1531
1532| 类型                    | 说明                  |
1533| ----------------------- | --------------------- |
1534| [CrossLanguageOptions](#crosslanguageoptions15) | 跨ArkTS语言访问选项。 |
1535
1536**示例:**
1537
1538请参考[节点操作示例](#节点操作示例)。
1539
1540### recycle<sup>18+</sup>
1541
1542recycle(): void
1543
1544子组件的回收方法。
1545
1546**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
1547
1548**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1549
1550**示例:**
1551
1552请参考[节点复用回收使用示例](#节点复用回收使用示例)。
1553
1554### reuse<sup>18+</sup>
1555
1556reuse(): void
1557
1558子组件的复用方法。
1559
1560**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
1561
1562**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1563
1564**示例:**
1565
1566请参考[节点复用回收使用示例](#节点复用回收使用示例)。
1567
1568## TypedFrameNode<sup>12+</sup>
1569
1570TypedFrameNode继承自[FrameNode](#framenode),用于声明具体类型的FrameNode。
1571
1572### 属性
1573
1574**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1575
1576**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1577
1578| 名称       | 类型 | 只读 | 可选 | 说明                                                         |
1579| ---------- | ---- | ---- | ---- | ------------------------------------------------------------ |
1580| initialize | C    | 否   | 否   | 该接口用于创建对应组件的构造参数,用于设置/更新组件的初始值。 |
1581| attribute  | T    | 否   | 否   | 该接口用于获取对应组件的属性设置对象,用于设置/更新组件的通用、私有属性。 |
1582
1583> **说明:**
1584>
1585> [commonAttribute](#commonattribute12)仅在CustomFrameNode上生效,TypedFrameNode上commonAttribute行为未定义。建议使用[attribute](#属性)接口而非[commonAttribute](#commonattribute12)接口进行通用属性设置,如node.attribute.backgroundColor(Color.Pink)。
1586
1587## typeNode<sup>12+</sup>
1588
1589typeNode提供创建具体类型的FrameNode能力,可通过FrameNode的基础接口进行自定义的挂载,使用占位容器进行显示。
1590
1591使用typeNode创建Text、Image、Select、Toggle节点时,当传入的[UIContext](./js-apis-arkui-UIContext.md)对应的UI实例销毁后,调用该接口会返回一个无效的FrameNode节点,无法正常挂载和显示。
1592
1593**示例:**
1594
1595请参考[自定义具体类型节点示例](#自定义具体类型节点示例)。
1596
1597### Text<sup>12+</sup>
1598type Text = TypedFrameNode&lt;TextInterface, TextAttribute&gt;
1599
1600Text类型的FrameNode节点类型。不允许添加子组件。
1601
1602**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1603
1604**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1605
1606| 类型                                               | 说明                                                         |
1607| -------------------------------------------------- | ------------------------------------------------------------ |
1608| TypedFrameNode&lt;TextInterface, TextAttribute&gt; | 提供Text类型FrameNode节点。<br/>**说明:**<br/> TextInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Text组件的构造函数类型。 <br/> TextAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Text组件的属性设置对象。 |
1609
1610### createNode('Text')<sup>12+</sup>
1611createNode(context: UIContext, nodeType: 'Text'): Text
1612
1613创建Text类型的FrameNode节点。
1614
1615**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1616
1617**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1618
1619**参数:**
1620
1621| 参数名 | 类型 | 必填 | 说明  |
1622| ------------------ | ------------------ | ------------------- | ------------------- |
1623| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1624| nodeType | 'Text' | 是 | 创建Text类型的FrameNode节点。 |
1625
1626**返回值:**
1627
1628| 类型                  | 说明      |
1629| ------------------ | ------------------ |
1630| [Text](#text12) | Text类型的FrameNode节点。 |
1631
1632**示例:**
1633
1634<!--code_no_check-->
1635
1636```ts
1637typeNode.createNode(uiContext, 'Text');
1638```
1639
1640### Column<sup>12+</sup>
1641type Column = TypedFrameNode&lt;ColumnInterface, ColumnAttribute&gt;
1642
1643Column类型的FrameNode节点类型。
1644
1645**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1646
1647**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1648
1649| 类型                                                   | 说明                                                         |
1650| ------------------------------------------------------ | ------------------------------------------------------------ |
1651| TypedFrameNode&lt;ColumnInterface, ColumnAttribute&gt; | 提供Column类型FrameNode节点。<br/>**说明:**<br/> ColumnInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Column组件的构造函数类型。 <br/> ColumnAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Column组件的属性设置对象。 |
1652
1653### createNode('Column')<sup>12+</sup>
1654createNode(context: UIContext, nodeType: 'Column'): Column
1655
1656创建Column类型的FrameNode节点。
1657
1658**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1659
1660**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1661
1662**参数:**
1663
1664| 参数名 | 类型 | 必填 | 说明  |
1665| ------------------ | ------------------ | ------------------- | ------------------- |
1666| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1667| nodeType | 'Column' | 是 | 创建Column类型的FrameNode节点。 |
1668
1669**返回值:**
1670
1671| 类型                  | 说明      |
1672| ------------------ | ------------------ |
1673| [Column](#column12) | Column类型的FrameNode节点。 |
1674
1675**示例:**
1676
1677<!--code_no_check-->
1678
1679```ts
1680typeNode.createNode(uiContext, 'Column');
1681```
1682### Row<sup>12+</sup>
1683type Row = TypedFrameNode&lt;RowInterface, RowAttribute&gt;
1684
1685Row类型的FrameNode节点类型。
1686
1687**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1688
1689**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1690
1691| 类型                                             | 说明                                                         |
1692| ------------------------------------------------ | ------------------------------------------------------------ |
1693| TypedFrameNode&lt;RowInterface, RowAttribute&gt; | 提供Row类型FrameNode节点。<br/>**说明:**<br/> RowInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Row组件的构造函数类型。 <br/> RowAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Row组件的属性设置对象。 |
1694
1695### createNode('Row')<sup>12+</sup>
1696createNode(context: UIContext, nodeType: 'Row'): Row
1697
1698创建Row类型的FrameNode节点。
1699
1700**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1701
1702**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1703
1704**参数:**
1705
1706| 参数名 | 类型 | 必填 | 说明  |
1707| ------------------ | ------------------ | ------------------- | ------------------- |
1708| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1709| nodeType | 'Row' | 是 | 创建Row类型的FrameNode节点。 |
1710
1711**返回值:**
1712
1713| 类型                  | 说明      |
1714| ------------------ | ------------------ |
1715| [Row](#row12) | Row类型的FrameNode节点。 |
1716
1717**示例:**
1718
1719<!--code_no_check-->
1720
1721```ts
1722typeNode.createNode(uiContext, 'Row');
1723```
1724### Stack<sup>12+</sup>
1725type Stack = TypedFrameNode&lt;StackInterface, StackAttribute&gt;
1726
1727Stack类型的FrameNode节点类型。
1728
1729**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1730
1731**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1732
1733| 类型                                                 | 说明                                                         |
1734| ---------------------------------------------------- | ------------------------------------------------------------ |
1735| TypedFrameNode&lt;StackInterface, StackAttribute&gt; | 提供Stack类型FrameNode节点。<br/>**说明:**<br/> StackInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Stack组件的构造函数类型。 <br/> StackAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Stack组件的属性设置对象。 |
1736
1737### createNode('Stack')<sup>12+</sup>
1738createNode(context: UIContext, nodeType: 'Stack'): Stack
1739
1740创建Stack类型的FrameNode节点。
1741
1742**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1743
1744**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1745
1746**参数:**
1747
1748| 参数名 | 类型 | 必填 | 说明  |
1749| ------------------ | ------------------ | ------------------- | ------------------- |
1750| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1751| nodeType | 'Stack' | 是 | 创建Stack类型的FrameNode节点。 |
1752
1753**返回值:**
1754
1755| 类型                  | 说明      |
1756| ------------------ | ------------------ |
1757| [Stack](#stack12) | Stack类型的FrameNode节点。 |
1758
1759**示例:**
1760
1761<!--code_no_check-->
1762
1763```ts
1764typeNode.createNode(uiContext, 'Stack');
1765```
1766### GridRow<sup>12+</sup>
1767type GridRow = TypedFrameNode&lt;GridRowInterface, GridRowAttribute&gt;
1768
1769GridRow类型的FrameNode节点类型。只允许添加GridCol类型子组件。
1770
1771**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1772
1773**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1774
1775| 类型                                                     | 说明                                                         |
1776| -------------------------------------------------------- | ------------------------------------------------------------ |
1777| TypedFrameNode&lt;GridRowInterface, GridRowAttribute&gt; | 提供GridRow类型FrameNode节点。<br/>**说明:**<br/> GridRowInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为GridRow组件的构造函数类型。 <br/> GridRowAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回GridRow组件的属性设置对象。 |
1778
1779### createNode('GridRow')<sup>12+</sup>
1780createNode(context: UIContext, nodeType: 'GridRow'): GridRow
1781
1782创建GridRow类型的FrameNode节点。
1783
1784**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1785
1786**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1787
1788**参数:**
1789
1790| 参数名 | 类型 | 必填 | 说明  |
1791| ------------------ | ------------------ | ------------------- | ------------------- |
1792| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1793| nodeType | 'GridRow' | 是 | 创建GridRow类型的FrameNode节点。 |
1794
1795**返回值:**
1796
1797| 类型                  | 说明      |
1798| ------------------ | ------------------ |
1799| [GridRow](#gridrow12) | GridRow类型的FrameNode节点。 |
1800
1801**示例:**
1802
1803<!--code_no_check-->
1804
1805```ts
1806typeNode.createNode(uiContext, 'GridRow');
1807```
1808### GridCol<sup>12+</sup>
1809type GridCol = TypedFrameNode&lt;GridColInterface, GridColAttribute&gt;
1810
1811GridCol类型的FrameNode节点类型。不允许添加子组件。
1812
1813**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1814
1815**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1816
1817| 类型                                                     | 说明                                                         |
1818| -------------------------------------------------------- | ------------------------------------------------------------ |
1819| TypedFrameNode&lt;GridColInterface, GridColAttribute&gt; | 提供GridCol类型FrameNode节点。<br/>**说明:**<br/> GridColInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为GridCol组件的构造函数类型。 <br/> GridColAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回GridCol组件的属性设置对象。 |
1820
1821### createNode('GridCol')<sup>12+</sup>
1822createNode(context: UIContext, nodeType: 'GridCol'): GridCol
1823
1824创建GridCol类型的FrameNode节点。
1825
1826**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1827
1828**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1829
1830**参数:**
1831
1832| 参数名 | 类型 | 必填 | 说明  |
1833| ------------------ | ------------------ | ------------------- | ------------------- |
1834| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1835| nodeType | 'GridCol' | 是 | 创建GridCol类型的FrameNode节点。 |
1836
1837**返回值:**
1838
1839| 类型                  | 说明      |
1840| ------------------ | ------------------ |
1841| [GridCol](#gridcol12) | GridCol类型的FrameNode节点。 |
1842
1843**示例:**
1844
1845<!--code_no_check-->
1846
1847```ts
1848typeNode.createNode(uiContext, 'GridCol');
1849```
1850### Flex<sup>12+</sup>
1851type Flex = TypedFrameNode&lt;FlexInterface, FlexAttribute&gt;
1852
1853Flex类型的FrameNode节点类型。
1854
1855**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1856
1857**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1858
1859| 类型                                               | 说明                                                         |
1860| -------------------------------------------------- | ------------------------------------------------------------ |
1861| TypedFrameNode&lt;FlexInterface, FlexAttribute&gt; | 提供Flex类型FrameNode节点。<br/>**说明:**<br/> FlexInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Flex组件的构造函数类型。 <br/> FlexAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Flex组件的属性设置对象。 |
1862
1863### createNode('Flex')<sup>12+</sup>
1864createNode(context: UIContext, nodeType: 'Flex'): Flex
1865
1866创建Flex类型的FrameNode节点。
1867
1868**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1869
1870**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1871
1872**参数:**
1873
1874| 参数名 | 类型 | 必填 | 说明  |
1875| ------------------ | ------------------ | ------------------- | ------------------- |
1876| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1877| nodeType | 'Flex' | 是 | 创建Flex类型的FrameNode节点。 |
1878
1879**返回值:**
1880
1881| 类型                  | 说明      |
1882| ------------------ | ------------------ |
1883| [Flex](#flex12) | Flex类型的FrameNode节点。 |
1884
1885**示例:**
1886
1887<!--code_no_check-->
1888
1889```ts
1890typeNode.createNode(uiContext, 'Flex');
1891```
1892### Swiper<sup>12+</sup>
1893type Swiper = TypedFrameNode&lt;SwiperInterface, SwiperAttribute&gt;
1894
1895Swiper类型的FrameNode节点类型。
1896
1897**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1898
1899**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1900
1901| 类型                                                   | 说明                                                         |
1902| ------------------------------------------------------ | ------------------------------------------------------------ |
1903| TypedFrameNode&lt;SwiperInterface, SwiperAttribute&gt; | 提供Swiper类型FrameNode节点。<br/>**说明:**<br/> SwiperInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Swiper组件的构造函数类型。 <br/> SwiperAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Swiper组件的属性设置对象。 |
1904
1905### createNode('Swiper')<sup>12+</sup>
1906createNode(context: UIContext, nodeType: 'Swiper'): Swiper
1907
1908创建Swiper类型的FrameNode节点。
1909
1910**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1911
1912**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1913
1914**参数:**
1915
1916| 参数名 | 类型 | 必填 | 说明  |
1917| ------------------ | ------------------ | ------------------- | ------------------- |
1918| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1919| nodeType | 'Swiper' | 是 | 创建Swiper类型的FrameNode节点。 |
1920
1921**返回值:**
1922
1923| 类型                  | 说明      |
1924| ------------------ | ------------------ |
1925| [Swiper](#swiper12) | Swiper类型的FrameNode节点。 |
1926
1927**示例:**
1928
1929<!--code_no_check-->
1930
1931```ts
1932typeNode.createNode(uiContext, 'Swiper');
1933```
1934### Progress<sup>12+</sup>
1935type Progress = TypedFrameNode&lt;ProgressInterface, ProgressAttribute&gt;
1936
1937Progress类型的FrameNode节点类型。不允许添加子组件。
1938
1939**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1940
1941**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1942
1943| 类型                                                       | 说明                                                         |
1944| ---------------------------------------------------------- | ------------------------------------------------------------ |
1945| TypedFrameNode&lt;ProgressInterface, ProgressAttribute&gt; | 提供Progress类型FrameNode节点。<br/>**说明:**<br/> ProgressInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Progress组件的构造函数类型。 <br/> ProgressAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Progress组件的属性设置对象。 |
1946
1947### createNode('Progress')<sup>12+</sup>
1948createNode(context: UIContext, nodeType: 'Progress'): Progress
1949
1950创建Progress类型的FrameNode节点。
1951
1952**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1953
1954**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1955
1956**参数:**
1957
1958| 参数名 | 类型 | 必填 | 说明  |
1959| ------------------ | ------------------ | ------------------- | ------------------- |
1960| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
1961| nodeType | 'Progress' | 是 | 创建Progress类型的FrameNode节点。 |
1962
1963**返回值:**
1964
1965| 类型                  | 说明      |
1966| ------------------ | ------------------ |
1967| [Progress](#progress12) | Progress类型的FrameNode节点。 |
1968
1969**示例:**
1970
1971<!--code_no_check-->
1972
1973```ts
1974typeNode.createNode(uiContext, 'Progress');
1975```
1976### Scroll<sup>12+</sup>
1977type Scroll = TypedFrameNode&lt;ScrollInterface, ScrollAttribute&gt;
1978
1979Scroll类型的FrameNode节点类型。允许添加一个子组件。
1980
1981**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1982
1983**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1984
1985| 类型                                                   | 说明                                                         |
1986| ------------------------------------------------------ | ------------------------------------------------------------ |
1987| TypedFrameNode&lt;ScrollInterface, ScrollAttribute&gt; | 提供Scroll类型FrameNode节点。<br/>**说明:**<br/> ScrollInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Scroll组件的构造函数类型。 <br/> ScrollAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Scroll组件的属性设置对象。 |
1988
1989### createNode('Scroll')<sup>12+</sup>
1990createNode(context: UIContext, nodeType: 'Scroll'): Scroll
1991
1992创建Scroll类型的FrameNode节点。
1993
1994**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1995
1996**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1997
1998**参数:**
1999
2000| 参数名 | 类型 | 必填 | 说明  |
2001| ------------------ | ------------------ | ------------------- | ------------------- |
2002| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2003| nodeType | 'Scroll' | 是 | 创建Scroll类型的FrameNode节点。 |
2004
2005**返回值:**
2006
2007| 类型                  | 说明      |
2008| ------------------ | ------------------ |
2009| [Scroll](#scroll12) | Scroll类型的FrameNode节点。 |
2010
2011**示例:**
2012
2013<!--code_no_check-->
2014
2015```ts
2016typeNode.createNode(uiContext, 'Scroll');
2017```
2018
2019### getAttribute('Scroll')<sup>15+</sup>
2020getAttribute(node: FrameNode, nodeType: 'Scroll'): ScrollAttribute | undefined
2021
2022获取Scroll节点的属性。若该节点非ArkTS语言创建,则需要设置是否支持跨语言访问,如果不支持跨语言访问,则返回undefined。该接口不支持声明式方式创建的节点。
2023
2024**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
2025
2026**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2027
2028**参数:**
2029
2030| 参数名 | 类型 | 必填 | 说明  |
2031| ------------------ | ------------------ | ------------------- | ------------------- |
2032| node | [FrameNode](./js-apis-arkui-frameNode.md) | 是   | 获取属性时所需的目标节点。 |
2033| nodeType | 'Scroll' | 是 | 获取Scroll节点类型的属性。 |
2034
2035**返回值:**
2036
2037| 类型                  | 说明      |
2038| ------------------ | ------------------ |
2039| ScrollAttribute&nbsp;\|&nbsp;undefined | Scroll节点类型的属性,若获取失败,则返回undefined。 |
2040
2041**示例:**
2042
2043<!--code_no_check-->
2044
2045```ts
2046typeNode.getAttribute(node, 'Scroll');
2047```
2048
2049### bindController('Scroll')<sup>15+</sup>
2050bindController(node: FrameNode, controller: Scroller, nodeType: 'Scroll'): void
2051
2052将滚动控制器Scroller绑定到Scroll节点。若该节点非ArkTS语言创建,则需要设置是否支持跨语言访问,如果不支持跨语言访问,则抛出异常。该接口不支持声明式方式创建的节点。
2053
2054**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
2055
2056**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2057
2058**参数:**
2059
2060| 参数名 | 类型 | 必填 | 说明  |
2061| ------------------ | ------------------ | ------------------- | ------------------- |
2062| node | [FrameNode](./js-apis-arkui-frameNode.md) | 是   | 绑定滚动控制器的目标节点。 |
2063| controller | [Scroller](arkui-ts/ts-container-scroll.md#scroller) | 是   | 滚动控制器。 |
2064| nodeType | 'Scroll' | 是 | 绑定滚动控制器的目标节点的节点类型为Scroll。 |
2065
2066**错误码:**
2067
2068| 错误码ID | 错误信息                         |
2069| -------- | -------------------------------- |
2070| 401      | Parameter error. Possible causes: 1. the type of the node is error. 2. the node is null or undefined. |
2071| 100021   | The FrameNode is not modifiable. |
2072
2073**示例:**
2074
2075<!--code_no_check-->
2076
2077```ts
2078typeNode.bindController(node, scroller, 'Scroll');
2079```
2080### RelativeContainer<sup>12+</sup>
2081type RelativeContainer = TypedFrameNode&lt;RelativeContainerInterface, RelativeContainerAttribute&gt;
2082
2083RelativeContainer类型的FrameNode节点类型。
2084
2085**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2086
2087**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2088
2089| 类型                                                         | 说明                                                         |
2090| ------------------------------------------------------------ | ------------------------------------------------------------ |
2091| TypedFrameNode&lt;RelativeContainerInterface, RelativeContainerAttribute&gt; | 提供RelativeContainer类型FrameNode节点。<br/>**说明:**<br/> RelativeContainerInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为RelativeContainer组件的构造函数类型。 <br/> RelativeContainerAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回RelativeContainer组件的属性设置对象。 |
2092
2093### createNode('RelativeContainer')<sup>12+</sup>
2094createNode(context: UIContext, nodeType: 'RelativeContainer'): RelativeContainer
2095
2096创建RelativeContainer类型的FrameNode节点。
2097
2098**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2099
2100**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2101
2102**参数:**
2103
2104| 参数名 | 类型 | 必填 | 说明  |
2105| ------------------ | ------------------ | ------------------- | ------------------- |
2106| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2107| nodeType | 'RelativeContainer' | 是 | 创建RelativeContainer类型的FrameNode节点。 |
2108
2109**返回值:**
2110
2111| 类型                  | 说明      |
2112| ------------------ | ------------------ |
2113| [RelativeContainer](#relativecontainer12) | RelativeContainer类型的FrameNode节点。 |
2114
2115**示例:**
2116
2117<!--code_no_check-->
2118
2119```ts
2120typeNode.createNode(uiContext, 'RelativeContainer');
2121```
2122### Divider<sup>12+</sup>
2123type Divider = TypedFrameNode&lt;DividerInterface, DividerAttribute&gt;
2124
2125Divider类型的FrameNode节点类型。不允许添加子组件。
2126
2127**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2128
2129**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2130
2131| 类型                                                     | 说明                                                         |
2132| -------------------------------------------------------- | ------------------------------------------------------------ |
2133| TypedFrameNode&lt;DividerInterface, DividerAttribute&gt; | 提供Divider类型FrameNode节点。<br/>**说明:**<br/> DividerInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为RelativeContainer组件的构造函数类型。 <br/> DividerAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Divider组件的属性设置对象。 |
2134
2135### createNode('Divider')<sup>12+</sup>
2136createNode(context: UIContext, nodeType: 'Divider'): Divider
2137
2138创建Divider类型的FrameNode节点。
2139
2140**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2141
2142**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2143
2144**参数:**
2145
2146| 参数名 | 类型 | 必填 | 说明  |
2147| ------------------ | ------------------ | ------------------- | ------------------- |
2148| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2149| nodeType | 'Divider' | 是 | 创建Divider类型的FrameNode节点。 |
2150
2151**返回值:**
2152
2153| 类型                  | 说明      |
2154| ------------------ | ------------------ |
2155| [Divider](#divider12) | Divider类型的FrameNode节点。 |
2156
2157**示例:**
2158
2159<!--code_no_check-->
2160
2161```ts
2162typeNode.createNode(uiContext, 'Divider');
2163```
2164### LoadingProgress<sup>12+</sup>
2165type LoadingProgress = TypedFrameNode&lt;LoadingProgressInterface, LoadingProgressAttribute&gt;
2166
2167LoadingProgress类型的FrameNode节点类型。不允许添加子组件。
2168
2169**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2170
2171**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2172
2173| 类型                                                         | 说明                                                         |
2174| ------------------------------------------------------------ | ------------------------------------------------------------ |
2175| TypedFrameNode&lt;LoadingProgressInterface, LoadingProgressAttribute&gt; | 提供LoadingProgress类型FrameNode节点。<br/>**说明:**<br/> LoadingProgressInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为LoadingProgress组件的构造函数类型。 <br/> LoadingProgressAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回LoadingProgress组件的属性设置对象。 |
2176
2177### createNode('LoadingProgress')<sup>12+</sup>
2178createNode(context: UIContext, nodeType: 'LoadingProgress'): LoadingProgress
2179
2180创建LoadingProgress类型的FrameNode节点。
2181
2182**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2183
2184**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2185
2186**参数:**
2187
2188| 参数名 | 类型 | 必填 | 说明  |
2189| ------------------ | ------------------ | ------------------- | ------------------- |
2190| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2191| nodeType | 'LoadingProgress' | 是 | 创建LoadingProgress类型的FrameNode节点。 |
2192
2193**返回值:**
2194
2195| 类型                  | 说明      |
2196| ------------------ | ------------------ |
2197| [LoadingProgress](#loadingprogress12) | LoadingProgress类型的FrameNode节点。 |
2198
2199**示例:**
2200
2201<!--code_no_check-->
2202
2203```ts
2204typeNode.createNode(uiContext, 'LoadingProgress');
2205```
2206### Search<sup>12+</sup>
2207type Search = TypedFrameNode&lt;SearchInterface, SearchAttribute&gt;
2208
2209Search类型的FrameNode节点类型。
2210
2211**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2212
2213**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2214
2215| 类型                                                   | 说明                                                         |
2216| ------------------------------------------------------ | ------------------------------------------------------------ |
2217| TypedFrameNode&lt;SearchInterface, SearchAttribute&gt; | 提供Search类型FrameNode节点。<br/>**说明:**<br/> SearchInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Search组件的构造函数类型。 <br/> SearchAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Search组件的属性设置对象。 |
2218
2219### createNode('Search')<sup>12+</sup>
2220createNode(context: UIContext, nodeType: 'Search'): Search
2221
2222创建Search类型的FrameNode节点。
2223
2224**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2225
2226**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2227
2228**参数:**
2229
2230| 参数名 | 类型 | 必填 | 说明  |
2231| ------------------ | ------------------ | ------------------- | ------------------- |
2232| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2233| nodeType | 'Search' | 是 | 创建Search类型的FrameNode节点。 |
2234
2235**返回值:**
2236
2237| 类型                  | 说明      |
2238| ------------------ | ------------------ |
2239| [Search](#search12) | Search类型的FrameNode节点。 |
2240
2241**示例:**
2242
2243<!--code_no_check-->
2244
2245```ts
2246typeNode.createNode(uiContext, 'Search');
2247```
2248### Blank<sup>12+</sup>
2249type Blank = TypedFrameNode&lt;BlankInterface, BlankAttribute&gt;
2250
2251Blank类型的FrameNode节点类型。不允许添加子组件。
2252
2253**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2254
2255**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2256
2257| 类型                                                 | 说明                                                         |
2258| ---------------------------------------------------- | ------------------------------------------------------------ |
2259| TypedFrameNode&lt;BlankInterface, BlankAttribute&gt; | 提供Blank类型FrameNode节点。<br/>**说明:**<br/> BlankInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Blank组件的构造函数类型。 <br/> BlankAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Blank组件的属性设置对象。 |
2260
2261### createNode('Blank')<sup>12+</sup>
2262createNode(context: UIContext, nodeType: 'Blank'): Blank;
2263
2264创建Blank类型的FrameNode节点。
2265
2266**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2267
2268**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2269
2270**参数:**
2271
2272| 参数名 | 类型 | 必填 | 说明  |
2273| ------------------ | ------------------ | ------------------- | ------------------- |
2274| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2275| nodeType | 'Blank' | 是 | 创建Blank类型的FrameNode节点。 |
2276
2277**返回值:**
2278
2279| 类型                  | 说明      |
2280| ------------------ | ------------------ |
2281| [Blank](#blank12) | Blank类型的FrameNode节点。 |
2282
2283**示例:**
2284
2285<!--code_no_check-->
2286
2287```ts
2288typeNode.createNode(uiContext, 'Blank');
2289```
2290### Image<sup>12+</sup>
2291type Image = TypedFrameNode&lt;ImageInterface, ImageAttribute&gt;
2292
2293Image类型的FrameNode节点类型。不允许添加子组件。
2294
2295**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2296
2297**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2298
2299| 类型                                                 | 说明                                                         |
2300| ---------------------------------------------------- | ------------------------------------------------------------ |
2301| TypedFrameNode&lt;ImageInterface, ImageAttribute&gt; | 提供Image类型FrameNode节点。<br/>**说明:**<br/> ImageInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Image组件的构造函数类型。 <br/> ImageAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Image组件的属性设置对象。 |
2302
2303### createNode('Image')<sup>12+</sup>
2304createNode(context: UIContext, nodeType: 'Image'): Image
2305
2306创建Image类型的FrameNode节点。
2307
2308**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2309
2310**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2311
2312**参数:**
2313
2314| 参数名 | 类型 | 必填 | 说明  |
2315| ------------------ | ------------------ | ------------------- | ------------------- |
2316| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2317| nodeType | 'Image' | 是 | 创建Image类型的节点。 |
2318
2319**返回值:**
2320
2321| 类型                  | 说明      |
2322| ------------------ | ------------------ |
2323| [Image](#image12) | Image类型的FrameNode节点。 |
2324
2325**示例:**
2326
2327<!--code_no_check-->
2328
2329```ts
2330typeNode.createNode(uiContext, 'Image');
2331```
2332### List<sup>12+</sup>
2333type List = TypedFrameNode&lt;ListInterface, ListAttribute&gt;
2334
2335List类型的FrameNode节点类型。只允许添加ListItem、ListItemGroup类型子组件。
2336
2337**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2338
2339**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2340
2341| 类型                                               | 说明                                                         |
2342| -------------------------------------------------- | ------------------------------------------------------------ |
2343| TypedFrameNode&lt;ListInterface, ListAttribute&gt; | 提供List类型FrameNode节点。<br/>**说明:**<br/> ListInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为List组件的构造函数类型。 <br/> ListAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回List组件的属性设置对象。 |
2344
2345### createNode('List')<sup>12+</sup>
2346createNode(context: UIContext, nodeType: 'List'): List
2347
2348创建List类型的FrameNode节点。
2349
2350**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2351
2352**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2353
2354**参数:**
2355
2356| 参数名 | 类型 | 必填 | 说明  |
2357| ------------------ | ------------------ | ------------------- | ------------------- |
2358| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2359| nodeType | 'List' | 是 | 创建List类型的节点。 |
2360
2361**返回值:**
2362
2363| 类型                  | 说明      |
2364| ------------------ | ------------------ |
2365| [List](#list12) | List类型的FrameNode节点。 |
2366
2367**示例:**
2368
2369<!--code_no_check-->
2370
2371```ts
2372typeNode.createNode(uiContext, 'List');
2373```
2374### ListItem<sup>12+</sup>
2375type ListItem = TypedFrameNode&lt;ListItemInterface, ListItemAttribute&gt;
2376
2377ListItem类型的FrameNode节点类型。
2378
2379**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2380
2381**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2382
2383| 类型                                                       | 说明                                                         |
2384| ---------------------------------------------------------- | ------------------------------------------------------------ |
2385| TypedFrameNode&lt;ListItemInterface, ListItemAttribute&gt; | 提供ListItem类型FrameNode节点。<br/>**说明:**<br/> ListItemInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为ListItem组件的构造函数类型。 <br/> ListItemAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回ListItem组件的属性设置对象。 |
2386
2387### createNode('ListItem')<sup>12+</sup>
2388createNode(context: UIContext, nodeType: 'ListItem'): ListItem
2389
2390创建ListItem类型的FrameNode节点。
2391
2392**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2393
2394**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2395
2396**参数:**
2397
2398| 参数名 | 类型 | 必填 | 说明  |
2399| ------------------ | ------------------ | ------------------- | ------------------- |
2400| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2401| nodeType | 'ListItem' | 是 | 创建ListItem类型的节点。 |
2402
2403**返回值:**
2404
2405| 类型                  | 说明      |
2406| ------------------ | ------------------ |
2407| [ListItem](#listitem12) | ListItem类型的FrameNode节点。 |
2408
2409**示例:**
2410
2411<!--code_no_check-->
2412
2413```ts
2414typeNode.createNode(uiContext, 'ListItem');
2415```
2416
2417### TextInput<sup>12+</sup>
2418type TextInput = TypedFrameNode&lt;TextInputInterface, TextInputAttribute&gt;
2419
2420TextInput类型的FrameNode节点类型。
2421
2422**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2423
2424**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2425
2426| 类型                                                         | 说明                                                         |
2427| ------------------------------------------------------------ | ------------------------------------------------------------ |
2428| TypedFrameNode&lt;TextInputInterface, TextInputAttribute&gt; | 提供TextInput类型FrameNode节点。<br/>**说明:**<br/> TextInputInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为TextInput组件的构造函数类型。 <br/> TextInputAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回TextInput组件的属性设置对象。 |
2429
2430### createNode('TextInput')<sup>12+</sup>
2431createNode(context: UIContext, nodeType: 'TextInput'): TextInput
2432
2433创建TextInput类型的FrameNode节点。
2434
2435**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2436
2437**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2438
2439**参数:**
2440
2441| 参数名 | 类型 | 必填 | 说明  |
2442| ------------------ | ------------------ | ------------------- | ------------------- |
2443| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2444| nodeType | 'TextInput' | 是 | 创建TextInput类型的节点。 |
2445
2446**返回值:**
2447
2448| 类型                  | 说明      |
2449| ------------------ | ------------------ |
2450| [TextInput](#textinput12) | TextInput类型的FrameNode节点。 |
2451
2452**示例:**
2453
2454<!--code_no_check-->
2455
2456```ts
2457typeNode.createNode(uiContext, 'TextInput');
2458```
2459
2460### Button<sup>12+</sup>
2461type Button = TypedFrameNode&lt;ButtonInterface, ButtonAttribute&gt;
2462
2463Button类型的FrameNode节点类型。以子组件模式创建允许添加一个子组件。以label模式创建不可以添加子组件。
2464
2465**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2466
2467**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2468
2469| 类型                                                   | 说明                                                         |
2470| ------------------------------------------------------ | ------------------------------------------------------------ |
2471| TypedFrameNode&lt;ButtonInterface, ButtonAttribute&gt; | 提供Button类型FrameNode节点。<br/>**说明:**<br/> ButtonInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Button组件的构造函数类型。 <br/> ButtonAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Button组件的属性设置对象。<br/> 接口入参label不为空时,以label模式创建Button组件,以此模式创建无法包含子组件,并且不允许再设置子组件,否则会抛出异常。且label模式和子组件模式在第一次initialize创建之后无法在后续的initialize进行动态修改,如需要包含子组件,第一次initialize时不要设置label参数。<br/> 以子组件模式创建时,只能包含一个子组件,不能设置多个子组件,否则会抛出异常。 |
2472
2473### createNode('Button')<sup>12+</sup>
2474createNode(context: UIContext, nodeType: 'Button'): Button
2475
2476创建Button类型的FrameNode节点。
2477
2478**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2479
2480**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2481
2482**参数:**
2483
2484| 参数名 | 类型 | 必填 | 说明  |
2485| ------------------ | ------------------ | ------------------- | ------------------- |
2486| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2487| nodeType | 'Button' | 是 | 创建Button类型的节点。 |
2488
2489**返回值:**
2490
2491| 类型                  | 说明      |
2492| ------------------ | ------------------ |
2493| [Button](#button12) | Button类型的FrameNode节点。 |
2494
2495**示例:**
2496
2497<!--code_no_check-->
2498
2499```ts
2500typeNode.createNode(uiContext, 'Button');
2501```
2502
2503### ListItemGroup<sup>12+</sup>
2504type ListItemGroup = TypedFrameNode&lt;ListItemGroupInterface, ListItemGroupAttribute&gt;
2505
2506ListItemGroup类型的FrameNode节点类型。只允许添加ListItem类型子组件。
2507
2508**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2509
2510**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2511
2512| 类型                                                         | 说明                                                         |
2513| ------------------------------------------------------------ | ------------------------------------------------------------ |
2514| TypedFrameNode&lt;ListItemGroupInterface, ListItemGroupAttribute&gt; | 提供ListItemGroup类型FrameNode节点。<br/>**说明:**<br/> ListItemGroupInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为ListItemGroup组件的构造函数类型。 <br/> ListItemGroupAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回ListItemGroup组件的属性设置对象。 |
2515
2516### createNode('ListItemGroup')<sup>12+</sup>
2517createNode(context: UIContext, nodeType: 'ListItemGroup'): ListItemGroup
2518
2519创建ListItemGroup类型的FrameNode节点。
2520
2521**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2522
2523**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2524
2525**参数:**
2526
2527| 参数名 | 类型 | 必填 | 说明  |
2528| ------------------ | ------------------ | ------------------- | ------------------- |
2529| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2530| nodeType | 'ListItemGroup' | 是 | 创建ListItemGroup类型的节点。 |
2531
2532**返回值:**
2533
2534| 类型                  | 说明      |
2535| ------------------ | ------------------ |
2536| [ListItemGroup](#listitemgroup12) | ListItemGroup类型的FrameNode节点。 |
2537
2538**示例:**
2539
2540<!--code_no_check-->
2541
2542```ts
2543typeNode.createNode(uiContext, 'ListItemGroup');
2544```
2545
2546### WaterFlow<sup>12+</sup>
2547type WaterFlow = TypedFrameNode&lt;WaterFlowInterface, WaterFlowAttribute&gt;
2548
2549WaterFlow类型的FrameNode节点类型。只允许添加FlowItem类型子组件。
2550
2551**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2552
2553**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2554
2555| 类型                                                         | 说明                                                         |
2556| ------------------------------------------------------------ | ------------------------------------------------------------ |
2557| TypedFrameNode&lt;WaterFlowInterface, WaterFlowAttribute&gt; | 提供WaterFlow类型FrameNode节点。<br/>**说明:**<br/> WaterFlowInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为WaterFlow组件的构造函数类型。 <br/> WaterFlowAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回WaterFlow组件的属性设置对象。 |
2558
2559### createNode('WaterFlow')<sup>12+</sup>
2560createNode(context: UIContext, nodeType: 'WaterFlow'): WaterFlow
2561
2562创建WaterFlow类型的FrameNode节点。
2563
2564**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2565
2566**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2567
2568**参数:**
2569
2570| 参数名 | 类型 | 必填 | 说明  |
2571| ------------------ | ------------------ | ------------------- | ------------------- |
2572| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2573| nodeType | 'WaterFlow' | 是 | 创建WaterFlow类型的节点。 |
2574
2575**返回值:**
2576
2577| 类型                  | 说明      |
2578| ------------------ | ------------------ |
2579| [WaterFlow](#waterflow12) | WaterFlow类型的FrameNode节点。 |
2580
2581**示例:**
2582
2583<!--code_no_check-->
2584
2585```ts
2586typeNode.createNode(uiContext, 'WaterFlow');
2587```
2588
2589### FlowItem<sup>12+</sup>
2590type FlowItem = TypedFrameNode&lt;FlowItemInterface, FlowItemAttribute&gt;
2591
2592FlowItem类型的FrameNode节点类型。允许添加一个子组件。
2593
2594**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2595
2596**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2597
2598| 类型                                                       | 说明                                                         |
2599| ---------------------------------------------------------- | ------------------------------------------------------------ |
2600| TypedFrameNode&lt;FlowItemInterface, FlowItemAttribute&gt; | 提供FlowItem类型FrameNode节点。<br/>**说明:**<br/> FlowItemInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为FlowItem组件的构造函数类型。 <br/> FlowItemAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回FlowItem组件的属性设置对象。 |
2601
2602### createNode('FlowItem')<sup>12+</sup>
2603createNode(context: UIContext, nodeType: 'FlowItem'): FlowItem
2604
2605创建FlowItem类型的FrameNode节点。
2606
2607**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2608
2609**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2610
2611**参数:**
2612
2613| 参数名 | 类型 | 必填 | 说明  |
2614| ------------------ | ------------------ | ------------------- | ------------------- |
2615| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2616| nodeType | 'FlowItem' | 是 | 创建FlowItem类型的节点。 |
2617
2618**返回值:**
2619
2620| 类型                  | 说明      |
2621| ------------------ | ------------------ |
2622| [FlowItem](#flowitem12) | FlowItem类型的FrameNode节点。 |
2623
2624**示例:**
2625
2626<!--code_no_check-->
2627
2628```ts
2629typeNode.createNode(uiContext, 'FlowItem');
2630```
2631
2632### XComponent<sup>12+</sup>
2633type XComponent = TypedFrameNode&lt;XComponentInterface, XComponentAttribute&gt;
2634
2635XComponent类型的FrameNode节点类型。
2636
2637**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2638
2639**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2640
2641| 类型                                                         | 说明                                                         |
2642| ------------------------------------------------------------ | ------------------------------------------------------------ |
2643| TypedFrameNode&lt;XComponentInterface, XComponentAttribute&gt; | 提供XComponent类型FrameNode节点。<br/>**说明:**<br/> XComponentInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为XComponent组件的构造函数类型。 <br/> XComponentAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回XComponent组件的属性设置对象。 |
2644
2645### createNode('XComponent')<sup>12+</sup>
2646createNode(context: UIContext, nodeType: 'XComponent'): XComponent
2647
2648创建XComponent类型的FrameNode节点。
2649
2650**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2651
2652**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2653
2654**参数:**
2655
2656| 参数名 | 类型 | 必填 | 说明  |
2657| ------------------ | ------------------ | ------------------- | ------------------- |
2658| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2659| nodeType | 'XComponent' | 是 | 创建XComponent类型的节点。 |
2660
2661**返回值:**
2662
2663| 类型                  | 说明      |
2664| ------------------ | ------------------ |
2665| [XComponent](#xcomponent12) | XComponent类型的FrameNode节点。 |
2666
2667**示例:**
2668
2669<!--code_no_check-->
2670
2671```ts
2672typeNode.createNode(uiContext, 'XComponent');
2673```
2674
2675### createNode('XComponent')<sup>12+</sup>
2676createNode(context: UIContext, nodeType: 'XComponent', options: XComponentOptions): XComponent
2677
2678按照options中的配置参数创建XComponent类型的FrameNode节点。
2679
2680**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2681
2682**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2683
2684**参数:**
2685
2686| 参数名 | 类型 | 必填 | 说明  |
2687| ------------------ | ------------------ | ------------------- | ------------------- |
2688| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2689| nodeType | 'XComponent' | 是 | 创建XComponent类型的节点。 |
2690| options | [XComponentOptions](./arkui-ts/ts-basic-components-xcomponent.md#xcomponentoptions12) | 是 | 定义XComponent的具体配置参数。 |
2691
2692**返回值:**
2693
2694| 类型                  | 说明      |
2695| ------------------ | ------------------ |
2696| [XComponent](#xcomponent12) | XComponent类型的FrameNode节点。 |
2697
2698**示例:**
2699
2700<!--code_no_check-->
2701
2702```ts
2703let controller: XComponentController = new XComponentController();
2704let options: XComponentOptions = {
2705  type: XComponentType.TEXTURE,
2706  controller: controller
2707};
2708typeNode.createNode(uiContext, 'XComponent', options);
2709```
2710
2711### QRCode<sup>14+</sup>
2712type QRCode = TypedFrameNode&lt;QRCodeInterface, QRCodeAttribute&gt;
2713
2714QRCode类型的FrameNode节点类型。
2715
2716**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2717
2718**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2719
2720| 类型                            | 说明                   |
2721| ----------------------------- | -------------------- |
2722| TypedFrameNode&lt;QRCodeInterface, QRCodeAttribute&gt; | 提供QRCode类型FrameNode节点。<br/>**说明:**<br/> QRCodeInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为QRCode组件的构造函数类型。 <br/> QRCodeAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回QRCode组件的属性设置对象。 |
2723
2724### createNode('QRCode')<sup>14+</sup>
2725createNode(context: UIContext, nodeType: 'QRCode'): QRCode
2726
2727创建QRCode类型的FrameNode节点。
2728
2729**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2730
2731**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2732
2733**参数:**
2734
2735| 参数名 | 类型 | 必填 | 说明  |
2736| ------------------ | ------------------ | ------------------- | ------------------- |
2737| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2738| nodeType | 'QRCode' | 是 | 创建QRCode类型的节点。 |
2739
2740**返回值:**
2741
2742| 类型                  | 说明      |
2743| ------------------ | ------------------ |
2744| [QRCode](#qrcode14) | QRCode类型的FrameNode节点。 |
2745
2746**示例:**
2747
2748<!--code_no_check-->
2749
2750```ts
2751typeNode.createNode(uiContext, 'QRCode');
2752```
2753
2754### Badge<sup>14+</sup>
2755type Badge = TypedFrameNode&lt;BadgeInterface, BadgeAttribute&gt;
2756
2757Badge类型的FrameNode节点类型。
2758
2759**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2760
2761**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2762
2763| 类型                            | 说明                   |
2764| ----------------------------- | -------------------- |
2765| TypedFrameNode&lt;BadgeInterface, BadgeAttribute&gt; | 提供Badge类型FrameNode节点。<br/>**说明:**<br/> BadgeInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Badge组件的构造函数类型。 <br/> BadgeAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Badge组件的属性设置对象。 |
2766
2767### createNode('Badge')<sup>14+</sup>
2768createNode(context: UIContext, nodeType: 'Badge'): Badge
2769
2770创建Badge类型的FrameNode节点。
2771
2772**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2773
2774**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2775
2776**参数:**
2777
2778| 参数名 | 类型 | 必填 | 说明  |
2779| ------------------ | ------------------ | ------------------- | ------------------- |
2780| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2781| nodeType | 'Badge' | 是 | 创建Badge类型的节点。 |
2782
2783**返回值:**
2784
2785| 类型                  | 说明      |
2786| ------------------ | ------------------ |
2787| [Badge](#badge14) | Badge类型的FrameNode节点。 |
2788
2789**示例:**
2790
2791<!--code_no_check-->
2792
2793```ts
2794typeNode.createNode(uiContext, 'Badge');
2795```
2796
2797### Grid<sup>14+</sup>
2798type Grid = TypedFrameNode&lt;GridInterface, GridAttribute&gt;
2799
2800Grid类型的FrameNode节点类型。
2801
2802**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2803
2804**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2805
2806| 类型                            | 说明                   |
2807| ----------------------------- | -------------------- |
2808| TypedFrameNode&lt;GridInterface, GridAttribute&gt; | 提供Grid类型FrameNode节点。<br/>**说明:**<br/> GridInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Grid组件的构造函数类型。 <br/> GridAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Grid组件的属性设置对象。 |
2809
2810### createNode('Grid')<sup>14+</sup>
2811createNode(context: UIContext, nodeType: 'Grid'): Grid
2812
2813创建Grid类型的FrameNode节点。
2814
2815**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2816
2817**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2818
2819**参数:**
2820
2821| 参数名 | 类型 | 必填 | 说明  |
2822| ------------------ | ------------------ | ------------------- | ------------------- |
2823| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2824| nodeType | 'Grid' | 是 | 创建Grid类型的节点。 |
2825
2826**返回值:**
2827
2828| 类型                  | 说明      |
2829| ------------------ | ------------------ |
2830| [Grid](#grid14) | Grid类型的FrameNode节点。 |
2831
2832**示例:**
2833
2834<!--code_no_check-->
2835
2836```ts
2837typeNode.createNode(uiContext, 'Grid');
2838```
2839
2840### GridItem<sup>14+</sup>
2841type GridItem = TypedFrameNode&lt;GridItemInterface, GridItemAttribute&gt;
2842
2843GridItem类型的FrameNode节点类型。
2844
2845**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2846
2847**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2848
2849| 类型                            | 说明                   |
2850| ----------------------------- | -------------------- |
2851| TypedFrameNode&lt;GridItemInterface, GridItemAttribute&gt; | 提供GridItem类型FrameNode节点。<br/>**说明:**<br/> GridItemInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为GridItem组件的构造函数类型。 <br/> GridItemAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回GridItem组件的属性设置对象。 |
2852
2853### createNode('GridItem')<sup>14+</sup>
2854createNode(context: UIContext, nodeType: 'GridItem'): GridItem
2855
2856创建GridItem类型的FrameNode节点。
2857
2858**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2859
2860**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2861
2862**参数:**
2863
2864| 参数名 | 类型 | 必填 | 说明  |
2865| ------------------ | ------------------ | ------------------- | ------------------- |
2866| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2867| nodeType | 'GridItem' | 是 | 创建GridItem类型的节点。 |
2868
2869**返回值:**
2870
2871| 类型                  | 说明      |
2872| ------------------ | ------------------ |
2873| [GridItem](#griditem14) | GridItem类型的FrameNode节点。 |
2874
2875**示例:**
2876
2877<!--code_no_check-->
2878
2879```ts
2880typeNode.createNode(uiContext, 'GridItem');
2881```
2882
2883### TextClock<sup>14+</sup>
2884type TextClock = TypedFrameNode&lt;TextClockInterface, TextClockAttribute&gt;
2885
2886TextClock类型的FrameNode节点类型。
2887
2888**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2889
2890**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2891
2892| 类型                            | 说明                   |
2893| ----------------------------- | -------------------- |
2894| TypedFrameNode&lt;TextClockInterface, TextClockAttribute&gt; | 提供TextClock类型FrameNode节点。<br/>**说明:**<br/> TextClockInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为TextClock组件的构造函数类型。 <br/> TextClockAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回TextClock组件的属性设置对象。 |
2895
2896### createNode('TextClock')<sup>14+</sup>
2897createNode(context: UIContext, nodeType: 'TextClock'): TextClock
2898
2899创建TextClock类型的FrameNode节点。
2900
2901**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2902
2903**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2904
2905**参数:**
2906
2907| 参数名 | 类型 | 必填 | 说明  |
2908| ------------------ | ------------------ | ------------------- | ------------------- |
2909| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2910| nodeType | 'TextClock' | 是 | 创建TextClock类型的节点。 |
2911
2912**返回值:**
2913
2914| 类型                  | 说明      |
2915| ------------------ | ------------------ |
2916| [TextClock](#textclock14) | TextClock类型的FrameNode节点。 |
2917
2918**示例:**
2919
2920<!--code_no_check-->
2921
2922```ts
2923typeNode.createNode(uiContext, 'TextClock');
2924```
2925
2926### TextTimer<sup>14+</sup>
2927type TextTimer = TypedFrameNode&lt;TextTimerInterface, TextTimerAttribute&gt;
2928
2929TextTimer类型的FrameNode节点类型。
2930
2931**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2932
2933**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2934
2935| 类型                            | 说明                   |
2936| ----------------------------- | -------------------- |
2937| TypedFrameNode&lt;TextTimerInterface, TextTimerAttribute&gt; | 提供TextTimer类型FrameNode节点。<br/>**说明:**<br/> TextTimerInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为TextTimer组件的构造函数类型。 <br/> TextTimerAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回TextTimer组件的属性设置对象。 |
2938
2939### createNode('TextTimer')<sup>14+</sup>
2940createNode(context: UIContext, nodeType: 'TextTimer'): TextTimer
2941
2942创建TextTimer类型的FrameNode节点。
2943
2944**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2945
2946**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2947
2948**参数:**
2949
2950| 参数名 | 类型 | 必填 | 说明  |
2951| ------------------ | ------------------ | ------------------- | ------------------- |
2952| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2953| nodeType | 'TextTimer' | 是 | 创建TextTimer类型的节点。 |
2954
2955**返回值:**
2956
2957| 类型                  | 说明      |
2958| ------------------ | ------------------ |
2959| [TextTimer](#texttimer14) | TextTimer类型的FrameNode节点。 |
2960
2961**示例:**
2962
2963<!--code_no_check-->
2964
2965```ts
2966typeNode.createNode(uiContext, 'TextTimer');
2967```
2968
2969### Marquee<sup>14+</sup>
2970type Marquee = TypedFrameNode&lt;MarqueeInterface, MarqueeAttribute&gt;
2971
2972Marquee类型的FrameNode节点类型。
2973
2974**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2975
2976**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
2977
2978| 类型                            | 说明                   |
2979| ----------------------------- | -------------------- |
2980| TypedFrameNode&lt;MarqueeInterface, MarqueeAttribute&gt; | 提供Marquee类型FrameNode节点。<br/>**说明:**<br/> MarqueeInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Marquee组件的构造函数类型。 <br/> MarqueeAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Marquee组件的属性设置对象。 |
2981
2982### createNode('Marquee')<sup>14+</sup>
2983createNode(context: UIContext, nodeType: 'Marquee'): Marquee
2984
2985创建Marquee类型的FrameNode节点。
2986
2987**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
2988
2989**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2990
2991**参数:**
2992
2993| 参数名 | 类型 | 必填 | 说明  |
2994| ------------------ | ------------------ | ------------------- | ------------------- |
2995| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
2996| nodeType | 'Marquee' | 是 | 创建Marquee类型的节点。 |
2997
2998**返回值:**
2999
3000| 类型                  | 说明      |
3001| ------------------ | ------------------ |
3002| [Marquee](#marquee14) | Marquee类型的FrameNode节点。 |
3003
3004**示例:**
3005
3006<!--code_no_check-->
3007
3008```ts
3009typeNode.createNode(uiContext, 'Marquee');
3010```
3011
3012### TextArea<sup>14+</sup>
3013type TextArea = TypedFrameNode&lt;TextAreaInterface, TextAreaAttribute&gt;
3014
3015TextArea类型的FrameNode节点类型。
3016
3017**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
3018
3019**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3020
3021| 类型                            | 说明                   |
3022| ----------------------------- | -------------------- |
3023| TypedFrameNode&lt;TextAreaInterface, TextAreaAttribute&gt; | 提供TextArea类型FrameNode节点。<br/>**说明:**<br/> TextAreaInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为TextArea组件的构造函数类型。 <br/> TextAreaAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回TextArea组件的属性设置对象。 |
3024
3025### createNode('TextArea')<sup>14+</sup>
3026createNode(context: UIContext, nodeType: 'TextArea'): TextArea
3027
3028创建TextArea类型的FrameNode节点。
3029
3030**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
3031
3032**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3033
3034**参数:**
3035
3036| 参数名 | 类型 | 必填 | 说明  |
3037| ------------------ | ------------------ | ------------------- | ------------------- |
3038| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3039| nodeType | 'TextArea' | 是 | 创建TextArea类型的节点。 |
3040
3041**返回值:**
3042
3043| 类型                  | 说明      |
3044| ------------------ | ------------------ |
3045| [TextArea](#textarea14) | TextArea类型的FrameNode节点。 |
3046
3047**示例:**
3048
3049<!--code_no_check-->
3050
3051```ts
3052typeNode.createNode(uiContext, 'TextArea');
3053```
3054
3055### SymbolGlyph<sup>14+</sup>
3056type SymbolGlyph = TypedFrameNode&lt;SymbolGlyphInterface, SymbolGlyphAttribute&gt;
3057
3058SymbolGlyph类型的FrameNode节点类型。
3059
3060**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
3061
3062**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3063
3064| 类型                            | 说明                   |
3065| ----------------------------- | -------------------- |
3066| TypedFrameNode&lt;SymbolGlyphInterface, SymbolGlyphAttribute&gt; | 提供SymbolGlyph类型FrameNode节点。<br/>**说明:**<br/> SymbolGlyphInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为SymbolGlyph组件的构造函数类型。 <br/> SymbolGlyphAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回SymbolGlyph组件的属性设置对象。 |
3067
3068### createNode('SymbolGlyph')<sup>14+</sup>
3069createNode(context: UIContext, nodeType: 'SymbolGlyph'): SymbolGlyph
3070
3071创建SymbolGlyph类型的FrameNode节点。
3072
3073**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
3074
3075**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3076
3077**参数:**
3078
3079| 参数名 | 类型 | 必填 | 说明  |
3080| ------------------ | ------------------ | ------------------- | ------------------- |
3081| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3082| nodeType | 'SymbolGlyph' | 是 | 创建SymbolGlyph类型的节点。 |
3083
3084**返回值:**
3085
3086| 类型                  | 说明      |
3087| ------------------ | ------------------ |
3088| [SymbolGlyph](#symbolglyph14) | SymbolGlyph类型的FrameNode节点。 |
3089
3090**示例:**
3091
3092<!--code_no_check-->
3093
3094```ts
3095typeNode.createNode(uiContext, 'SymbolGlyph');
3096```
3097
3098### Checkbox<sup>18+</sup>
3099type Checkbox = TypedFrameNode&lt;CheckboxInterface, CheckboxAttribute&gt;
3100
3101Checkbox类型的FrameNode节点类型。
3102
3103**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3104
3105**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3106
3107| 类型                            | 说明                   |
3108| ----------------------------- | -------------------- |
3109| TypedFrameNode&lt;CheckboxInterface, CheckboxAttribute&gt; | 提供Checkbox类型FrameNode节点。<br/>**说明:**<br/> CheckboxInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Checkbox组件的构造函数类型。 <br/> CheckboxAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Checkbox组件的属性设置对象。 |
3110
3111### createNode('Checkbox')<sup>18+</sup>
3112createNode(context: UIContext, nodeType: 'Checkbox'): Checkbox
3113
3114创建Checkbox类型的FrameNode节点。
3115
3116**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3117
3118**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3119
3120**参数:**
3121
3122| 参数名 | 类型 | 必填 | 说明  |
3123| ------------------ | ------------------ | ------------------- | ------------------- |
3124| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3125| nodeType | 'Checkbox' | 是 | 创建Checkbox类型的节点。 |
3126
3127**返回值:**
3128
3129| 类型                  | 说明      |
3130| ------------------ | ------------------ |
3131| [Checkbox](#checkbox18) | Checkbox类型的FrameNode节点。 |
3132
3133**示例:**
3134
3135<!--code_no_check-->
3136
3137```ts
3138typeNode.createNode(uiContext, 'Checkbox');
3139```
3140
3141### CheckboxGroup<sup>18+</sup>
3142type CheckboxGroup = TypedFrameNode&lt;CheckboxGroupInterface, CheckboxGroupAttribute&gt;
3143
3144CheckboxGroup类型的FrameNode节点类型。
3145
3146**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3147
3148**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3149
3150| 类型                            | 说明                   |
3151| ----------------------------- | -------------------- |
3152| TypedFrameNode&lt;CheckboxGroupInterface, CheckboxGroupAttribute&gt; | 提供CheckboxGroup类型FrameNode节点。<br/>**说明:**<br/> CheckboxGroupInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为CheckboxGroup组件的构造函数类型。 <br/> CheckboxGroupAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回CheckboxGroup组件的属性设置对象。 |
3153
3154### createNode('CheckboxGroup')<sup>18+</sup>
3155createNode(context: UIContext, nodeType: 'CheckboxGroup'): CheckboxGroup
3156
3157创建CheckboxGroup类型的FrameNode节点。
3158
3159**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3160
3161**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3162
3163**参数:**
3164
3165| 参数名 | 类型 | 必填 | 说明  |
3166| ------------------ | ------------------ | ------------------- | ------------------- |
3167| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3168| nodeType | 'CheckboxGroup' | 是 | 创建CheckboxGroup类型的节点。 |
3169
3170**返回值:**
3171
3172| 类型                  | 说明      |
3173| ------------------ | ------------------ |
3174| [CheckboxGroup](#checkboxgroup18) | CheckboxGroup类型的FrameNode节点。 |
3175
3176**示例:**
3177
3178<!--code_no_check-->
3179
3180```ts
3181typeNode.createNode(uiContext, 'CheckboxGroup');
3182```
3183
3184### Rating<sup>18+</sup>
3185type Rating = TypedFrameNode&lt;RatingInterface, RatingAttribute&gt;
3186
3187Rating类型的FrameNode节点类型。
3188
3189**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3190
3191**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3192
3193| 类型                            | 说明                   |
3194| ----------------------------- | -------------------- |
3195| TypedFrameNode&lt;RatingInterface, RatingAttribute&gt; | 提供Rating类型FrameNode节点。<br/>**说明:**<br/> RatingInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Rating组件的构造函数类型。 <br/> RatingAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Rating组件的属性设置对象。 |
3196
3197### createNode('Rating')<sup>18+</sup>
3198createNode(context: UIContext, nodeType: 'Rating'): Rating
3199
3200创建Rating类型的FrameNode节点。
3201
3202**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3203
3204**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3205
3206**参数:**
3207
3208| 参数名 | 类型 | 必填 | 说明  |
3209| ------------------ | ------------------ | ------------------- | ------------------- |
3210| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3211| nodeType | 'Rating' | 是 | 创建Rating类型的节点。 |
3212
3213**返回值:**
3214
3215| 类型                  | 说明      |
3216| ------------------ | ------------------ |
3217| [Rating](#rating18) | Rating类型的FrameNode节点。 |
3218
3219**示例:**
3220
3221<!--code_no_check-->
3222
3223```ts
3224typeNode.createNode(uiContext, 'Rating');
3225```
3226
3227### Radio<sup>18+</sup>
3228type Radio = TypedFrameNode&lt;RadioInterface, RadioAttribute&gt;
3229
3230Radio类型的FrameNode节点类型。
3231
3232**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3233
3234**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3235
3236| 类型                            | 说明                   |
3237| ----------------------------- | -------------------- |
3238| TypedFrameNode&lt;RadioInterface, RadioAttribute&gt; | 提供Radio类型FrameNode节点。<br/>**说明:**<br/> RadioInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Radio组件的构造函数类型。 <br/> RadioAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Radio组件的属性设置对象。 |
3239
3240### createNode('Radio')<sup>18+</sup>
3241createNode(context: UIContext, nodeType: 'Radio'): Radio
3242
3243创建Radio类型的FrameNode节点。
3244
3245**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3246
3247**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3248
3249**参数:**
3250
3251| 参数名 | 类型 | 必填 | 说明  |
3252| ------------------ | ------------------ | ------------------- | ------------------- |
3253| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3254| nodeType | 'Radio' | 是 | 创建Radio类型的节点。 |
3255
3256**返回值:**
3257
3258| 类型                  | 说明      |
3259| ------------------ | ------------------ |
3260| [Radio](#radio18) | Radio类型的FrameNode节点。 |
3261
3262**示例:**
3263
3264<!--code_no_check-->
3265
3266```ts
3267typeNode.createNode(uiContext, 'Radio');
3268```
3269
3270### Slider<sup>18+</sup>
3271type Slider = TypedFrameNode&lt;SliderInterface, SliderAttribute&gt;
3272
3273Slider类型的FrameNode节点类型。
3274
3275**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3276
3277**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3278
3279| 类型                            | 说明                   |
3280| ----------------------------- | -------------------- |
3281| TypedFrameNode&lt;SliderInterface, SliderAttribute&gt; | 提供Slider类型FrameNode节点。<br/>**说明:**<br/> SliderInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Slider组件的构造函数类型。 <br/> SliderAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Slider组件的属性设置对象。 |
3282
3283### createNode('Slider')<sup>18+</sup>
3284createNode(context: UIContext, nodeType: 'Slider'): Slider
3285
3286创建Slider类型的FrameNode节点。
3287
3288**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3289
3290**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3291
3292**参数:**
3293
3294| 参数名 | 类型 | 必填 | 说明  |
3295| ------------------ | ------------------ | ------------------- | ------------------- |
3296| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3297| nodeType | 'Slider' | 是 | 创建Slider类型的节点。 |
3298
3299**返回值:**
3300
3301| 类型                  | 说明      |
3302| ------------------ | ------------------ |
3303| [Slider](#slider18) | Slider类型的FrameNode节点。 |
3304
3305**示例:**
3306
3307<!--code_no_check-->
3308
3309```ts
3310typeNode.createNode(uiContext, 'Slider');
3311```
3312
3313### Select<sup>18+</sup>
3314type Select = TypedFrameNode&lt;SelectInterface, SelectAttribute&gt;
3315
3316Select类型的FrameNode节点类型。
3317
3318**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3319
3320**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3321
3322| 类型                            | 说明                   |
3323| ----------------------------- | -------------------- |
3324| TypedFrameNode&lt;SelectInterface, SelectAttribute&gt; | 提供Select类型FrameNode节点。<br/>**说明:**<br/> SelectInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Select组件的构造函数类型。 <br/> SelectAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Select组件的属性设置对象。 |
3325
3326### createNode('Select')<sup>18+</sup>
3327createNode(context: UIContext, nodeType: 'Select'): Select
3328
3329创建Select类型的FrameNode节点。
3330
3331**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3332
3333**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3334
3335**参数:**
3336
3337| 参数名 | 类型 | 必填 | 说明  |
3338| ------------------ | ------------------ | ------------------- | ------------------- |
3339| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3340| nodeType | 'Select' | 是 | 创建Select类型的节点。 |
3341
3342**返回值:**
3343
3344| 类型                  | 说明      |
3345| ------------------ | ------------------ |
3346| [Select](#select18) | Select类型的FrameNode节点。 |
3347
3348**示例:**
3349
3350<!--code_no_check-->
3351
3352```ts
3353typeNode.createNode(uiContext, 'Select');
3354```
3355
3356### Toggle<sup>18+</sup>
3357type Toggle = TypedFrameNode&lt;ToggleInterface, ToggleAttribute&gt;
3358
3359Toggle类型的FrameNode节点类型。
3360
3361**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3362
3363**系统能力:**  SystemCapability.ArkUI.ArkUI.Full
3364
3365| 类型                            | 说明                   |
3366| ----------------------------- | -------------------- |
3367| TypedFrameNode&lt;ToggleInterface, ToggleAttribute&gt; | 提供Toggle类型FrameNode节点。<br/>**说明:**<br/> ToggleInterface用于[TypedFrameNode](#typedframenode12)的[initialize](#属性)接口的入参,入参为Toggle组件的构造函数类型。 <br/> ToggleAttribute用于TypedFrameNode的[attribute](#属性)接口的返回值,返回Toggle组件的属性设置对象。 |
3368
3369### createNode('Toggle')<sup>18+</sup>
3370createNode(context: UIContext, nodeType: 'Toggle', options?: ToggleOptions): Toggle
3371
3372创建Toggle类型的FrameNode节点。
3373
3374**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
3375
3376**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3377
3378**参数:**
3379
3380| 参数名 | 类型 | 必填 | 说明  |
3381| ------------------ | ------------------ | ------------------- | ------------------- |
3382| context | [UIContext](./js-apis-arkui-UIContext.md) | 是   | 创建对应节点时所需的UI上下文。 |
3383| nodeType | 'Toggle' | 是 | 创建Toggle类型的节点。 |
3384| options | [ToggleOptions](./arkui-ts/ts-basic-components-toggle.md#toggleoptions18对象说明) | 否 | 创建Toggle节点的接口参数,仅可通过ToggleOptions中的type属性设置开关样式。 |
3385
3386**返回值:**
3387
3388| 类型                  | 说明      |
3389| ------------------ | ------------------ |
3390| [Toggle](#toggle18) | Toggle类型的FrameNode节点。 |
3391
3392**示例:**
3393
3394<!--code_no_check-->
3395
3396```ts
3397let toggleOptions: ToggleOptions = {type: ToggleType.Button, isOn: false};
3398typeNode.createNode(uiContext, 'Toggle', toggleOptions);
3399```
3400
3401## NodeAdapter<sup>12+</sup>
3402
3403NodeAdapter提供FrameNode的数据懒加载能力。
3404
3405> **说明:**
3406>
3407> 入参不能为负数,入参为负数时不做处理。
3408
3409**示例:**
3410
3411请参考[NodeAdapter使用示例](#nodeadapter使用示例)。
3412
3413### constructor<sup>12+</sup>
3414
3415constructor()
3416
3417NodeAdapter的构造函数。
3418
3419**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3420
3421**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3422
3423### dispose<sup>12+</sup>
3424
3425dispose(): void
3426
3427立即释放当前的NodeAdapter。如果是已绑定的状态,会先进行解绑操作,再释放当前的NodeAdapter。
3428
3429**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3430
3431**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3432
3433### totalNodeCount<sup>12+</sup>
3434
3435set totalNodeCount(count: number)
3436
3437设置数据节点总数。
3438
3439**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3440
3441**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3442
3443**参数:**
3444
3445| 参数名  | 类型                                                   | 必填 | 说明             |
3446| ------- | ------------------------------------------------------ | ---- | ---------------- |
3447| count | number | 是   | 数据节点总数。<br/>取值范围:[0, +∞) |
3448
3449get totalNodeCount(): number
3450
3451获取数据节点总数。
3452
3453**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3454
3455**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3456
3457**返回值:**
3458
3459| 类型                     | 说明                 |
3460| ----------------- | ------------ |
3461| number | 数据节点总数。<br/>取值范围:[0, +∞) |
3462
3463### reloadAllItems<sup>12+</sup>
3464
3465reloadAllItems(): void
3466
3467重新加载全部数据操作。
3468
3469**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3470
3471**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3472
3473### reloadItem<sup>12+</sup>
3474
3475reloadItem(start: number, count: number): void
3476
3477从索引值开始重新加载指定数量的节点数据。
3478
3479**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3480
3481**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3482
3483**参数:**
3484
3485| 参数名  | 类型                                                   | 必填 | 说明             |
3486| ------- | ------------------------------------------------------ | ---- | ---------------- |
3487| start | number | 是   | 重新加载的节点开始索引值。<br/>取值范围:[0, +∞) |
3488| count | number | 是   | 重新加载数据节点的数量。<br/>取值范围:[0, +∞) |
3489
3490### removeItem<sup>12+</sup>
3491
3492removeItem(start: number, count: number): void
3493
3494从索引值开始删除指定数量的节点数据。
3495
3496**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3497
3498**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3499
3500**参数:**
3501
3502| 参数名  | 类型                                                   | 必填 | 说明             |
3503| ------- | ------------------------------------------------------ | ---- | ---------------- |
3504| start | number | 是   | 删除的节点开始索引值。<br/>取值范围:[0, +∞) |
3505| count | number | 是   | 删除数据节点的数量。<br/>取值范围:[0, +∞) |
3506
3507### insertItem<sup>12+</sup>
3508
3509insertItem(start: number, count: number): void
3510
3511从索引值开始新增指定数量的节点数据。
3512
3513**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3514
3515**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3516
3517**参数:**
3518
3519| 参数名  | 类型                                                   | 必填 | 说明             |
3520| ------- | ------------------------------------------------------ | ---- | ---------------- |
3521| start | number | 是   | 新增的节点开始索引值。<br/>取值范围:[0, +∞) |
3522| count | number | 是   | 新增数据节点的数量。<br/>取值范围:[0, +∞) |
3523
3524### moveItem<sup>12+</sup>
3525
3526moveItem(from: number, to: number): void
3527
3528将数据从原始索引移动到目的索引。
3529
3530**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3531
3532**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3533
3534**参数:**
3535
3536| 参数名  | 类型                                                   | 必填 | 说明             |
3537| ------- | ------------------------------------------------------ | ---- | ---------------- |
3538| from | number | 是   | 数据移动的原始索引值。<br/>取值范围:[0, +∞) |
3539| to | number | 是   | 数据移动的目的索引值。<br/>取值范围:[0, +∞) |
3540
3541### getAllAvailableItems<sup>12+</sup>
3542
3543getAllAvailableItems(): Array&lt;FrameNode&gt;
3544
3545获取所有有效数据。
3546
3547**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3548
3549**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3550
3551**返回值:**
3552
3553| 类型                     | 说明                 |
3554| ----------------- | ------------ |
3555| Array&lt;FrameNode&gt; | FrameNode数据节点集合。 |
3556
3557### onAttachToNode<sup>12+</sup>
3558
3559onAttachToNode?(target: FrameNode): void
3560
3561FrameNode绑定NodeAdapter时回调。
3562
3563**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3564
3565**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3566
3567**参数:**
3568
3569| 参数名  | 类型                                                   | 必填 | 说明             |
3570| ------- | ------------------------------------------------------ | ---- | ---------------- |
3571| target | FrameNode | 是   | 绑定NodeAdapter的FrameNode节点。 |
3572
3573### onDetachFromNode<sup>12+</sup>
3574
3575onDetachFromNode?(): void
3576
3577解除绑定时回调。
3578
3579**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3580
3581**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3582
3583### onGetChildId<sup>12+</sup>
3584
3585onGetChildId?(index: number): number
3586
3587节点首次加载或新节点滑入时回调。用于生成自定义的Id,需要开发者自行保证Id的唯一性。
3588
3589**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3590
3591**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3592
3593**参数:**
3594
3595| 参数名  | 类型                                                   | 必填 | 说明             |
3596| ------- | ------------------------------------------------------ | ---- | ---------------- |
3597| index | number | 是   | 加载节点索引值。<br/>取值范围:[0, +∞) |
3598
3599**返回值:**
3600
3601| 类型                     | 说明                 |
3602| ----------------- | ------------ |
3603| number | 返回开发者自定义生成的Id,需要开发者自行保证Id的唯一性。 |
3604
3605### onCreateChild<sup>12+</sup>
3606
3607onCreateChild?(index: number): FrameNode
3608
3609节点首次加载或新节点滑入时回调。
3610
3611**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3612
3613**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3614
3615**参数:**
3616
3617| 参数名  | 类型                                                   | 必填 | 说明             |
3618| ------- | ------------------------------------------------------ | ---- | ---------------- |
3619| index | number | 是   | 加载节点索引值。<br/>取值范围:[0, +∞) |
3620
3621**返回值:**
3622
3623| 类型                     | 说明                 |
3624| ----------------- | ------------ |
3625| FrameNode | 返回开发者创建的FrameNode节点。 |
3626
3627### onDisposeChild<sup>12+</sup>
3628
3629onDisposeChild?(id: number, node: FrameNode): void
3630
3631子节点即将销毁时回调。
3632
3633**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3634
3635**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3636
3637**参数:**
3638
3639| 参数名  | 类型                                                   | 必填 | 说明             |
3640| ------- | ------------------------------------------------------ | ---- | ---------------- |
3641| id | number | 是   | 即将销毁的子节点id。 |
3642| node | FrameNode | 是   | 即将销毁的FrameNode节点。 |
3643
3644### onUpdateChild<sup>12+</sup>
3645
3646onUpdateChild?(id: number, node: FrameNode): void
3647
3648重新加载的数据节点被复用时回调。
3649
3650**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3651
3652**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3653
3654**参数:**
3655
3656| 参数名  | 类型                                                   | 必填 | 说明             |
3657| ------- | ------------------------------------------------------ | ---- | ---------------- |
3658| id | number | 是   | 复用节点索引值。 |
3659| node | FrameNode | 是   | 被复用的FrameNode节点。 |
3660
3661### attachNodeAdapter<sup>12+</sup>
3662
3663static attachNodeAdapter(adapter: NodeAdapter, node: FrameNode): boolean
3664
3665给FrameNode绑定一个NodeAdapter。一个节点只能绑定一个NodeAdapter。已经绑定NodeAdapter的再次绑定会失败并返回false。
3666
3667**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3668
3669**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3670
3671**参数:**
3672
3673| 参数名  | 类型                                                   | 必填 | 说明             |
3674| ------- | ------------------------------------------------------ | ---- | ---------------- |
3675| adapter | [NodeAdapter](#nodeadapter12) | 是   | 定义懒加载的NodeAdapter类。 |
3676| node | FrameNode | 是   | 绑定的FrameNode节点。 |
3677
3678**返回值:**
3679
3680| 类型                     | 说明                 |
3681| ----------------- | ------------ |
3682| boolean | 绑定结果,返回true绑定成功,false绑定失败。 |
3683
3684### detachNodeAdapter<sup>12+</sup>
3685
3686static detachNodeAdapter(node: FrameNode): void
3687
3688解除绑定操作,解除FrameNode节点绑定的NodeAdapter。
3689
3690**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3691
3692**系统能力:** SystemCapability.ArkUI.ArkUI.Full
3693
3694**参数:**
3695
3696| 参数名  | 类型                                                   | 必填 | 说明             |
3697| ------- | ------------------------------------------------------ | ---- | ---------------- |
3698| node | FrameNode | 是   | 要解除绑定的FrameNode节点。 |
3699
3700## 自定义具体类型节点示例
3701
3702以Text节点为例,创建Text类型节点。
3703
3704```ts
3705import { NodeController, FrameNode, typeNode } from '@kit.ArkUI';
3706
3707class MyNodeController extends NodeController {
3708  makeNode(uiContext: UIContext): FrameNode | null {
3709    let node = new FrameNode(uiContext);
3710    node.commonAttribute.width(100)
3711      .height(50)
3712      .borderColor(Color.Gray)
3713      .borderWidth(1)
3714      .margin({ left: 10 });
3715    let col = typeNode.createNode(uiContext, 'Column');
3716    col.initialize({ space: 5 })
3717      .width('100%').height('100%').margin({ top: 5 });
3718    node.appendChild(col);
3719    let text = typeNode.createNode(uiContext, 'Text');
3720    text.initialize("Hello").fontColor(Color.Blue).fontSize(14);
3721    col.appendChild(text);
3722    return node;
3723  }
3724}
3725
3726@Entry
3727@Component
3728struct FrameNodeTypeTest {
3729  private myNodeController: MyNodeController = new MyNodeController();
3730
3731  build() {
3732    Row() {
3733      NodeContainer(this.myNodeController);
3734    }
3735  }
3736}
3737```
3738
3739![FrameNodeTextTest](figures/FrameNodeTextTest.png)
3740
3741## 节点操作示例
3742```ts
3743import { NodeController, FrameNode, UIContext } from '@kit.ArkUI';
3744import { BusinessError } from '@kit.BasicServicesKit';
3745
3746const TEST_TAG: string = "FrameNode "
3747
3748class MyNodeController extends NodeController {
3749  public frameNode: FrameNode | null = null;
3750  public childList: Array<FrameNode> = new Array<FrameNode>();
3751  private rootNode: FrameNode | null = null;
3752  private uiContext: UIContext | null = null;
3753  private childrenCount: number = 0;
3754
3755  makeNode(uiContext: UIContext): FrameNode | null {
3756    this.rootNode = new FrameNode(uiContext);
3757    this.uiContext = uiContext;
3758
3759    this.frameNode = new FrameNode(uiContext);
3760    this.frameNode.commonAttribute.backgroundColor(Color.Pink);
3761    this.frameNode.commonAttribute.size({ width: 100, height: 100 });
3762
3763    this.rootNode.appendChild(this.frameNode);
3764    this.childrenCount = this.childrenCount + 1;
3765    for (let i = 0; i < 10; i++) {
3766      let childNode = new FrameNode(uiContext);
3767      this.childList.push(childNode);
3768      this.frameNode.appendChild(childNode);
3769    }
3770    return this.rootNode;
3771  }
3772
3773  createFrameNode() {
3774    let frameNode = new FrameNode(this.uiContext!);
3775    frameNode.commonAttribute.backgroundColor(Color.Pink);
3776    frameNode.commonAttribute.size({ width: 100, height: 100 });
3777    frameNode.commonAttribute.position({ x: this.childrenCount * 120, y: 0 });
3778
3779    return frameNode;
3780  }
3781
3782  appendChild() {
3783    const childNode = this.createFrameNode();
3784    this.rootNode!.appendChild(childNode);
3785    this.childrenCount = this.childrenCount + 1;
3786  }
3787
3788  insertChildAfter(index: number) {
3789    let insertNode = this.createFrameNode();
3790    let childNode = this.rootNode!.getChild(index);
3791    this.rootNode!.insertChildAfter(insertNode, childNode);
3792    this.childrenCount = this.childrenCount + 1;
3793  }
3794
3795  removeChild(index: number) {
3796    let childNode = this.rootNode!.getChild(index);
3797    if (childNode == null) {
3798      console.log(`${TEST_TAG} getchild at index {${index}} : fail`);
3799      return;
3800    }
3801    this.rootNode!.removeChild(childNode);
3802    this.childrenCount = this.childrenCount - 1;
3803  }
3804
3805  getChildNumber() {
3806    console.log(TEST_TAG + " getChildNumber " + this.rootNode!.getChildrenCount())
3807    console.log(TEST_TAG + " children count is " + this.childrenCount);
3808  }
3809
3810  clearChildren() {
3811    this.rootNode!.clearChildren();
3812  }
3813
3814  searchFrameNode() {
3815    if (this.rootNode!.getFirstChild() === null) {
3816      console.log(TEST_TAG + " the rootNode does not have child node.")
3817    }
3818    if (this.rootNode!.getFirstChild() === this.frameNode) {
3819      console.log(TEST_TAG +
3820        " getFirstChild  result: success. The first child of the rootNode is equals to frameNode.");
3821    } else {
3822      console.log(TEST_TAG +
3823        " getFirstChild  result: fail. The first child of the rootNode is not equals to frameNode.");
3824    }
3825    if (this.frameNode!.getChild(5) === this.frameNode!.getChild(4)!.getNextSibling()) {
3826      console.log(TEST_TAG + " getNextSibling  result: success.");
3827    } else {
3828      console.log(TEST_TAG + " getNextSibling  result: fail.");
3829    }
3830    if (this.frameNode!.getChild(3) === this.frameNode!.getChild(4)!.getPreviousSibling()) {
3831      console.log(TEST_TAG + " getPreviousSibling  result: success.");
3832    } else {
3833      console.log(TEST_TAG + " getPreviousSibling  result: fail.");
3834    }
3835    if (this.rootNode!.getFirstChild() !== null && this.rootNode!.getFirstChild()!.getParent() === this.rootNode) {
3836      console.log(TEST_TAG + " getParent  result: success.");
3837    } else {
3838      console.log(TEST_TAG + " getParent  result: fail.");
3839    }
3840    if (this.rootNode!.getParent() !== undefined || this.rootNode!.getParent() !== null) {
3841      console.log(TEST_TAG + " get ArkTsNode success.")
3842      console.log(TEST_TAG + " check rootNode whether is modifiable " + this.rootNode!.isModifiable())
3843      console.log(TEST_TAG + " check getParent whether is modifiable " + this.rootNode!.getParent()!.isModifiable())
3844    } else {
3845      console.log(TEST_TAG + " get ArkTsNode fail.");
3846    }
3847  }
3848
3849  moveFrameNode() {
3850    const currentNode = this.frameNode!.getChild(4);
3851    try {
3852      currentNode!.moveTo(this.rootNode, 0);
3853      if (this.rootNode!.getChild(0) === currentNode) {
3854        console.log(TEST_TAG + " moveTo  result: success.");
3855      } else {
3856        console.log(TEST_TAG + " moveTo  result: fail.");
3857      }
3858    } catch (err) {
3859      console.log(TEST_TAG + " " + (err as BusinessError).code + " : " + (err as BusinessError).message);
3860      console.log(TEST_TAG + " moveTo  result: fail.");
3861    }
3862  }
3863
3864  getPositionToWindow() {
3865    let positionToWindow = this.rootNode?.getPositionToWindow();
3866    console.log(TEST_TAG + JSON.stringify(positionToWindow));
3867  }
3868
3869  getPositionToParent() {
3870    let positionToParent = this.rootNode?.getPositionToParent();
3871    console.log(TEST_TAG + JSON.stringify(positionToParent));
3872  }
3873
3874  getPositionToScreen() {
3875    let positionToScreen = this.rootNode?.getPositionToScreen();
3876    console.log(TEST_TAG + JSON.stringify(positionToScreen));
3877  }
3878
3879  getPositionToWindowWithTransform() {
3880    let positionToWindowWithTransform = this.rootNode?.getPositionToWindowWithTransform();
3881    console.log(TEST_TAG + JSON.stringify(positionToWindowWithTransform));
3882  }
3883
3884  getPositionToParentWithTransform() {
3885    let positionToParentWithTransform = this.rootNode?.getPositionToParentWithTransform();
3886    console.log(TEST_TAG + JSON.stringify(positionToParentWithTransform));
3887  }
3888
3889  getPositionToScreenWithTransform() {
3890    let positionToScreenWithTransform = this.rootNode?.getPositionToScreenWithTransform();
3891    console.log(TEST_TAG + JSON.stringify(positionToScreenWithTransform));
3892  }
3893
3894  getMeasuredSize() {
3895    let measuredSize = this.frameNode?.getMeasuredSize();
3896    console.log(TEST_TAG + JSON.stringify(measuredSize));
3897  }
3898
3899  getLayoutPosition() {
3900    let layoutPosition = this.frameNode?.getLayoutPosition();
3901    console.log(TEST_TAG + JSON.stringify(layoutPosition));
3902  }
3903
3904  getUserConfigBorderWidth() {
3905    let userConfigBorderWidth = this.frameNode?.getUserConfigBorderWidth();
3906    console.log(TEST_TAG + JSON.stringify(userConfigBorderWidth));
3907  }
3908
3909  getUserConfigPadding() {
3910    let userConfigPadding = this.frameNode?.getUserConfigPadding();
3911    console.log(TEST_TAG + JSON.stringify(userConfigPadding));
3912  }
3913
3914  getUserConfigMargin() {
3915    let userConfigMargin = this.frameNode?.getUserConfigMargin();
3916    console.log(TEST_TAG + JSON.stringify(userConfigMargin));
3917  }
3918
3919  getUserConfigSize() {
3920    let userConfigSize = this.frameNode?.getUserConfigSize();
3921    console.log(TEST_TAG + JSON.stringify(userConfigSize));
3922  }
3923
3924  getId() {
3925    let id = this.frameNode?.getId();
3926    console.log(TEST_TAG + id);
3927  }
3928
3929  getUniqueId() {
3930    let uniqueId = this.frameNode?.getUniqueId();
3931    console.log(TEST_TAG + uniqueId);
3932  }
3933
3934  getNodeType() {
3935    let nodeType = this.frameNode?.getNodeType();
3936    console.log(TEST_TAG + nodeType);
3937  }
3938
3939  getOpacity() {
3940    let opacity = this.frameNode?.getOpacity();
3941    console.log(TEST_TAG + JSON.stringify(opacity));
3942  }
3943
3944  isVisible() {
3945    let visible = this.frameNode?.isVisible();
3946    console.log(TEST_TAG + JSON.stringify(visible));
3947  }
3948
3949  isClipToFrame() {
3950    let clipToFrame = this.frameNode?.isClipToFrame();
3951    console.log(TEST_TAG + JSON.stringify(clipToFrame));
3952  }
3953
3954  isAttached() {
3955    let attached = this.frameNode?.isAttached();
3956    console.log(TEST_TAG + JSON.stringify(attached));
3957  }
3958
3959  getInspectorInfo() {
3960    let inspectorInfo = this.frameNode?.getInspectorInfo();
3961    console.log(TEST_TAG + JSON.stringify(inspectorInfo));
3962  }
3963
3964  setCrossLanguageOptions() {
3965    console.log(TEST_TAG + " getCrossLanguageOptions " + JSON.stringify(this.frameNode?.getCrossLanguageOptions()));
3966    try {
3967      this.frameNode?.setCrossLanguageOptions({
3968        attributeSetting: true
3969      });
3970      console.log(TEST_TAG + " setCrossLanguageOptions success.");
3971    } catch (err) {
3972      console.log(TEST_TAG + " " + (err as BusinessError).code + " : " + (err as BusinessError).message);
3973      console.log(TEST_TAG + " setCrossLanguageOptions fail.");
3974    }
3975    console.log(TEST_TAG + " getCrossLanguageOptions " + JSON.stringify(this.frameNode?.getCrossLanguageOptions()));
3976  }
3977
3978  throwError() {
3979    try {
3980      this.rootNode!.getParent()!.clearChildren();
3981    } catch (err) {
3982      console.log(TEST_TAG + " " + (err as BusinessError).code + " : " + (err as BusinessError).message);
3983    }
3984    try {
3985      this.rootNode!.getParent()!.appendChild(new FrameNode(this.uiContext));
3986    } catch (err) {
3987      console.log(TEST_TAG + " " + (err as BusinessError).code + " : " + (err as BusinessError).message);
3988    }
3989    try {
3990      this.rootNode!.getParent()!.removeChild(this.rootNode!.getParent()!.getChild(0));
3991    } catch (err) {
3992      console.log(TEST_TAG + " " + (err as BusinessError).code + " : " + (err as BusinessError).message);
3993    }
3994  }
3995}
3996
3997@Entry
3998@Component
3999struct Index {
4000  private myNodeController: MyNodeController = new MyNodeController();
4001  private scroller: Scroller = new Scroller();
4002  @State index: number = 0;
4003
4004  build() {
4005    Scroll(this.scroller) {
4006      Column({ space: 8 }) {
4007        Column() {
4008          Row() {
4009            Button("ADD")
4010              .onClick(() => {
4011                this.index++;
4012              })
4013            Button("DEC")
4014              .onClick(() => {
4015                this.index--;
4016              })
4017          }
4018
4019          Text("Current index is " + this.index)
4020            .textAlign(TextAlign.Center)
4021            .borderRadius(10)
4022            .backgroundColor(0xFFFFFF)
4023            .width('100%')
4024            .fontSize(16)
4025        }
4026
4027        Column() {
4028          Text("This is a NodeContainer.")
4029            .textAlign(TextAlign.Center)
4030            .borderRadius(10)
4031            .backgroundColor(0xFFFFFF)
4032            .width('100%')
4033            .fontSize(16)
4034          NodeContainer(this.myNodeController)
4035            .borderWidth(1)
4036            .width(300)
4037            .height(100)
4038        }
4039
4040        Button("appendChild")
4041          .width(300)
4042          .onClick(() => {
4043            this.myNodeController.appendChild();
4044          })
4045        Button("insertChildAfter")
4046          .width(300)
4047          .onClick(() => {
4048            this.myNodeController.insertChildAfter(this.index);
4049          })
4050        Button("removeChild")
4051          .width(300)
4052          .onClick(() => {
4053            this.myNodeController.removeChild(this.index);
4054          })
4055        Button("clearChildren")
4056          .width(300)
4057          .onClick(() => {
4058            this.myNodeController.clearChildren();
4059          })
4060        Button("getChildNumber")
4061          .width(300)
4062          .onClick(() => {
4063            this.myNodeController.getChildNumber();
4064          })
4065        Button("searchFrameNode")
4066          .width(300)
4067          .onClick(() => {
4068            this.myNodeController.searchFrameNode();
4069          })
4070        Button("moveFrameNode")
4071          .width(300)
4072          .onClick(() => {
4073            this.myNodeController.moveFrameNode();
4074          })
4075        Button("getPositionToWindow")
4076          .width(300)
4077          .onClick(() => {
4078            this.myNodeController.getPositionToWindow();
4079          })
4080        Button("getPositionToParent")
4081          .width(300)
4082          .onClick(() => {
4083            this.myNodeController.getPositionToParent();
4084          })
4085        Button("getPositionToScreen")
4086          .width(300)
4087          .onClick(() => {
4088            this.myNodeController.getPositionToScreen();
4089          })
4090        Button("getPositionToParentWithTransform")
4091          .width(300)
4092          .onClick(() => {
4093            this.myNodeController.getPositionToParentWithTransform();
4094          })
4095        Button("getPositionToWindowWithTransform")
4096          .width(300)
4097          .onClick(() => {
4098            this.myNodeController.getPositionToWindowWithTransform();
4099          })
4100        Button("getPositionToScreenWithTransform")
4101          .width(300)
4102          .onClick(() => {
4103            this.myNodeController.getPositionToScreenWithTransform();
4104          })
4105        Button("getMeasuredSize")
4106          .width(300)
4107          .onClick(() => {
4108            this.myNodeController.getMeasuredSize();
4109          })
4110        Button("getLayoutPosition")
4111          .width(300)
4112          .onClick(() => {
4113            this.myNodeController.getLayoutPosition();
4114          })
4115        Button("getUserConfigBorderWidth")
4116          .width(300)
4117          .onClick(() => {
4118            this.myNodeController.getUserConfigBorderWidth();
4119          })
4120        Button("getUserConfigPadding")
4121          .width(300)
4122          .onClick(() => {
4123            this.myNodeController.getUserConfigPadding();
4124          })
4125        Button("getUserConfigMargin")
4126          .width(300)
4127          .onClick(() => {
4128            this.myNodeController.getUserConfigMargin();
4129          })
4130        Button("getUserConfigSize")
4131          .width(300)
4132          .onClick(() => {
4133            this.myNodeController.getUserConfigSize();
4134          })
4135        Button("getId")
4136          .width(300)
4137          .onClick(() => {
4138            this.myNodeController.getId();
4139          })
4140        Button("getUniqueId")
4141          .width(300)
4142          .onClick(() => {
4143            this.myNodeController.getUniqueId();
4144          })
4145        Button("getNodeType")
4146          .width(300)
4147          .onClick(() => {
4148            this.myNodeController.getNodeType();
4149          })
4150        Button("getOpacity")
4151          .width(300)
4152          .onClick(() => {
4153            this.myNodeController.getOpacity();
4154          })
4155        Button("isVisible")
4156          .width(300)
4157          .onClick(() => {
4158            this.myNodeController.isVisible();
4159          })
4160        Button("isClipToFrame")
4161          .width(300)
4162          .onClick(() => {
4163            this.myNodeController.isClipToFrame();
4164          })
4165        Button("isAttached")
4166          .width(300)
4167          .onClick(() => {
4168            this.myNodeController.isAttached();
4169          })
4170        Button("getInspectorInfo")
4171          .width(300)
4172          .onClick(() => {
4173            this.myNodeController.getInspectorInfo();
4174          })
4175        Button("getCustomProperty")
4176          .width(300)
4177          .onClick(() => {
4178            const uiContext: UIContext = this.getUIContext();
4179            if (uiContext) {
4180              const node: FrameNode | null = uiContext.getFrameNodeById("Test_Button") || null;
4181              if (node) {
4182                for (let i = 1; i < 4; i++) {
4183                  const key = 'customProperty' + i;
4184                  const property = node.getCustomProperty(key);
4185                  console.log(TEST_TAG + key, JSON.stringify(property));
4186                }
4187              }
4188            }
4189          })
4190          .id('Test_Button')
4191          .customProperty('customProperty1', {
4192            'number': 10,
4193            'string': 'this is a string',
4194            'bool': true,
4195            'object': {
4196              'name': 'name',
4197              'value': 100
4198            }
4199          })
4200          .customProperty('customProperty2', {})
4201          .customProperty('customProperty2', undefined)
4202        Button("setCrossLanguageOptions")
4203          .width(300)
4204          .onClick(() => {
4205            this.myNodeController.setCrossLanguageOptions();
4206          })
4207        Button("throwError")
4208          .width(300)
4209          .onClick(() => {
4210            this.myNodeController.throwError();
4211          })
4212      }
4213      .width("100%")
4214    }
4215    .scrollable(ScrollDirection.Vertical) // 滚动方向纵向
4216  }
4217}
4218```
4219
4220## LazyForEach场景节点操作示例
4221
4222```ts
4223import { NodeController, FrameNode, UIContext, BuilderNode, ExpandMode, LengthUnit } from '@kit.ArkUI';
4224
4225const TEST_TAG: string = "FrameNode "
4226
4227// BasicDataSource实现了IDataSource接口,用于管理listener监听,以及通知LazyForEach数据更新
4228class BasicDataSource implements IDataSource {
4229  private listeners: DataChangeListener[] = [];
4230  private originDataArray: string[] = [];
4231
4232  public totalCount(): number {
4233    return 0;
4234  }
4235
4236  public getData(index: number): string {
4237    return this.originDataArray[index];
4238  }
4239
4240  // 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
4241  registerDataChangeListener(listener: DataChangeListener): void {
4242    if (this.listeners.indexOf(listener) < 0) {
4243      console.info('add listener');
4244      this.listeners.push(listener);
4245    }
4246  }
4247
4248  // 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
4249  unregisterDataChangeListener(listener: DataChangeListener): void {
4250    const pos = this.listeners.indexOf(listener);
4251    if (pos >= 0) {
4252      console.info('remove listener');
4253      this.listeners.splice(pos, 1);
4254    }
4255  }
4256
4257  // 通知LazyForEach组件需要重载所有子组件
4258  notifyDataReload(): void {
4259    this.listeners.forEach(listener => {
4260      listener.onDataReloaded();
4261    })
4262  }
4263
4264  // 通知LazyForEach组件需要在index对应索引处添加子组件
4265  notifyDataAdd(index: number): void {
4266    this.listeners.forEach(listener => {
4267      listener.onDataAdd(index);
4268      // 写法2:listener.onDatasetChange([{type: DataOperationType.ADD, index: index}]);
4269    })
4270  }
4271
4272  // 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件
4273  notifyDataChange(index: number): void {
4274    this.listeners.forEach(listener => {
4275      listener.onDataChange(index);
4276      // 写法2:listener.onDatasetChange([{type: DataOperationType.CHANGE, index: index}]);
4277    })
4278  }
4279
4280  // 通知LazyForEach组件需要在index对应索引处删除该子组件
4281  notifyDataDelete(index: number): void {
4282    this.listeners.forEach(listener => {
4283      listener.onDataDelete(index);
4284      // 写法2:listener.onDatasetChange([{type: DataOperationType.DELETE, index: index}]);
4285    })
4286  }
4287
4288  // 通知LazyForEach组件将from索引和to索引处的子组件进行交换
4289  notifyDataMove(from: number, to: number): void {
4290    this.listeners.forEach(listener => {
4291      listener.onDataMove(from, to);
4292      // 写法2:listener.onDatasetChange(
4293      //         [{type: DataOperationType.EXCHANGE, index: {start: from, end: to}}]);
4294    })
4295  }
4296
4297  notifyDatasetChange(operations: DataOperation[]): void {
4298    this.listeners.forEach(listener => {
4299      listener.onDatasetChange(operations);
4300    })
4301  }
4302}
4303
4304class MyDataSource extends BasicDataSource {
4305  private dataArray: string[] = []
4306
4307  public totalCount(): number {
4308    return this.dataArray.length;
4309  }
4310
4311  public getData(index: number): string {
4312    return this.dataArray[index];
4313  }
4314
4315  public addData(index: number, data: string): void {
4316    this.dataArray.splice(index, 0, data);
4317    this.notifyDataAdd(index);
4318  }
4319
4320  public pushData(data: string): void {
4321    this.dataArray.push(data);
4322    this.notifyDataAdd(this.dataArray.length - 1);
4323  }
4324}
4325
4326class Params {
4327  data: MyDataSource | null = null;
4328  scroller: Scroller | null = null;
4329  constructor(data: MyDataSource, scroller: Scroller) {
4330    this.data = data;
4331    this.scroller = scroller;
4332  }
4333}
4334
4335@Builder
4336function buildData(params: Params) {
4337  List({ scroller: params.scroller }) {
4338    LazyForEach(params.data, (item: string) => {
4339      ListItem() {
4340        Column() {
4341          Text(item)
4342            .fontSize(20)
4343            .onAppear(() => {
4344              console.log(TEST_TAG + " node appear: " + item)
4345            })
4346            .backgroundColor(Color.Pink)
4347            .margin({
4348              top: 30,
4349              bottom: 30,
4350              left: 10,
4351              right: 10
4352            })
4353        }
4354      }
4355      .id(item)
4356    }, (item: string) => item)
4357  }
4358  .cachedCount(5)
4359  .listDirection(Axis.Horizontal)
4360}
4361
4362class MyNodeController extends NodeController {
4363  private rootNode: FrameNode | null = null;
4364  private uiContext: UIContext | null = null;
4365  private data: MyDataSource = new MyDataSource();
4366  private scroller: Scroller = new Scroller();
4367
4368  makeNode(uiContext: UIContext): FrameNode | null {
4369    this.uiContext = uiContext;
4370    for (let i = 0; i <= 20; i++) {
4371      this.data.pushData(`N${i}`);
4372    }
4373    const params: Params = new Params(this.data, this.scroller);
4374    const dataNode: BuilderNode<[Params]> = new BuilderNode(uiContext);
4375    dataNode.build(wrapBuilder<[Params]>(buildData), params);
4376    this.rootNode = dataNode.getFrameNode();
4377    const scrollToIndexOptions: ScrollToIndexOptions = {
4378      extraOffset: {
4379        value: 20, unit: LengthUnit.VP
4380      }
4381    };
4382    this.scroller.scrollToIndex(6, true, ScrollAlign.START, scrollToIndexOptions);
4383    return this.rootNode;
4384  }
4385
4386  getFirstChildIndexWithoutExpand() {
4387    console.log(`${TEST_TAG} getFirstChildIndexWithoutExpand: ${this.rootNode!.getFirstChildIndexWithoutExpand()}`);
4388  }
4389
4390  getLastChildIndexWithoutExpand() {
4391    console.log(`${TEST_TAG} getLastChildIndexWithoutExpand: ${this.rootNode!.getLastChildIndexWithoutExpand()}`);
4392  }
4393
4394  getChildWithNotExpand() {
4395    const childNode = this.rootNode!.getChild(3, ExpandMode.NOT_EXPAND);
4396    console.log(TEST_TAG + " getChild(3, ExpandMode.NOT_EXPAND): " + childNode!.getId());
4397    if (childNode!.getId() === "N9") {
4398      console.log(TEST_TAG + " getChild(3, ExpandMode.NOT_EXPAND)  result: success.");
4399    } else {
4400      console.log(TEST_TAG + " getChild(3, ExpandMode.NOT_EXPAND)  result: fail.");
4401    }
4402  }
4403
4404  getChildWithExpand() {
4405    const childNode = this.rootNode!.getChild(3, ExpandMode.EXPAND);
4406    console.log(TEST_TAG + " getChild(3, ExpandMode.EXPAND): " + childNode!.getId());
4407    if (childNode!.getId() === "N3") {
4408      console.log(TEST_TAG + " getChild(3, ExpandMode.EXPAND)  result: success.");
4409    } else {
4410      console.log(TEST_TAG + " getChild(3, ExpandMode.EXPAND)  result: fail.");
4411    }
4412  }
4413
4414  getChildWithLazyExpand() {
4415    const childNode = this.rootNode!.getChild(3, ExpandMode.LAZY_EXPAND);
4416    console.log(TEST_TAG + " getChild(3, ExpandMode.LAZY_EXPAND): " + childNode!.getId());
4417    if (childNode!.getId() === "N3") {
4418      console.log(TEST_TAG + " getChild(3, ExpandMode.LAZY_EXPAND)  result: success.");
4419    } else {
4420      console.log(TEST_TAG + " getChild(3, ExpandMode.LAZY_EXPAND)  result: fail.");
4421    }
4422  }
4423}
4424
4425@Entry
4426@Component
4427struct Index {
4428  private myNodeController: MyNodeController = new MyNodeController();
4429  private scroller: Scroller = new Scroller();
4430
4431  build() {
4432    Scroll(this.scroller) {
4433      Column({ space: 8 }) {
4434        Column() {
4435          Text("This is a NodeContainer.")
4436            .textAlign(TextAlign.Center)
4437            .borderRadius(10)
4438            .backgroundColor(0xFFFFFF)
4439            .width('100%')
4440            .fontSize(16)
4441          NodeContainer(this.myNodeController)
4442            .borderWidth(1)
4443            .width(300)
4444            .height(100)
4445        }
4446
4447        Button("getFirstChildIndexWithoutExpand")
4448          .width(300)
4449          .onClick(() => {
4450            this.myNodeController.getFirstChildIndexWithoutExpand();
4451          })
4452        Button("getLastChildIndexWithoutExpand")
4453          .width(300)
4454          .onClick(() => {
4455            this.myNodeController.getLastChildIndexWithoutExpand();
4456          })
4457        Button("getChildWithNotExpand")
4458          .width(300)
4459          .onClick(() => {
4460            this.myNodeController.getChildWithNotExpand();
4461          })
4462        Button("getChildWithExpand")
4463          .width(300)
4464          .onClick(() => {
4465            this.myNodeController.getChildWithExpand();
4466          })
4467        Button("getChildWithLazyExpand")
4468          .width(300)
4469          .onClick(() => {
4470            this.myNodeController.getChildWithLazyExpand();
4471          })
4472      }
4473      .width("100%")
4474    }
4475    .scrollable(ScrollDirection.Vertical) // 滚动方向纵向
4476  }
4477}
4478```
4479
4480## 基础事件示例
4481```ts
4482import { NodeController, FrameNode } from '@kit.ArkUI';
4483
4484class MyNodeController extends NodeController {
4485  public rootNode: FrameNode | null = null;
4486
4487  makeNode(uiContext: UIContext): FrameNode | null {
4488    this.rootNode = new FrameNode(uiContext);
4489    this.rootNode.commonAttribute.width(100)
4490      .height(100)
4491      .backgroundColor(Color.Pink);
4492    this.addCommonEvent(this.rootNode);
4493    return this.rootNode;
4494  }
4495
4496  addCommonEvent(frameNode: FrameNode) {
4497    frameNode.commonEvent.setOnHover(((isHover: boolean, event: HoverEvent): void => {
4498      console.log(`isHover FrameNode: ${isHover}`);
4499      console.log(`isHover FrameNode: ${JSON.stringify(event)}`);
4500      event.stopPropagation();
4501    }))
4502    frameNode.commonEvent.setOnClick((event: ClickEvent) => {
4503      console.log(`Click FrameNode: ${JSON.stringify(event)}`)
4504    })
4505    frameNode.commonEvent.setOnTouch((event: TouchEvent) => {
4506      console.log(`touch FrameNode: ${JSON.stringify(event)}`)
4507    })
4508    frameNode.commonEvent.setOnAppear(() => {
4509      console.log(`on Appear FrameNode`)
4510    })
4511    frameNode.commonEvent.setOnDisappear(() => {
4512      console.log(`onDisAppear FrameNode`)
4513    })
4514    frameNode.commonEvent.setOnFocus(() => {
4515      console.log(`onFocus FrameNode`)
4516    })
4517    frameNode.commonEvent.setOnBlur(() => {
4518      console.log(`onBlur FrameNode`)
4519    })
4520    frameNode.commonEvent.setOnKeyEvent((event: KeyEvent) => {
4521      console.log(`Key FrameNode: ${JSON.stringify(event)}`)
4522    })
4523    frameNode.commonEvent.setOnMouse((event: MouseEvent) => {
4524      console.log(`Mouse FrameNode: ${JSON.stringify(event)}`)
4525    })
4526    frameNode.commonEvent.setOnSizeChange((oldValue: SizeOptions, newValue: SizeOptions) => {
4527      console.info(`onSizeChange FrameNode: oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`)
4528    })
4529  }
4530}
4531
4532@Entry
4533@Component
4534struct Index {
4535  @State index: number = 0;
4536  private myNodeController: MyNodeController = new MyNodeController();
4537
4538  build() {
4539    Column() {
4540      Button("add CommonEvent to Text")
4541        .onClick(() => {
4542          this.myNodeController!.addCommonEvent(this.myNodeController!.rootNode!.getParent()!.getPreviousSibling() !)
4543        })
4544      Text("this is a Text")
4545        .fontSize(16)
4546        .borderWidth(1)
4547        .onHover(((isHover: boolean, event: HoverEvent): void => {
4548          console.log(`isHover Text: ${isHover}`);
4549          console.log(`isHover Text: ${JSON.stringify(event)}`);
4550          event.stopPropagation();
4551        }))
4552        .onClick((event: ClickEvent) => {
4553          console.log(`Click Text    : ${JSON.stringify(event)}`)
4554        })
4555        .onTouch((event: TouchEvent) => {
4556          console.log(`touch Text    : ${JSON.stringify(event)}`)
4557        })
4558        .onAppear(() => {
4559          console.log(`on Appear Text`)
4560        })
4561        .onDisAppear(() => {
4562          console.log(`onDisAppear Text`)
4563        })
4564        .onFocus(() => {
4565          console.log(`onFocus Text`)
4566        })
4567        .onBlur(() => {
4568          console.log(`onBlur Text`)
4569        })
4570        .onKeyEvent((event: KeyEvent) => {
4571          console.log(`Key Text    : ${JSON.stringify(event)}`)
4572        })
4573        .onMouse((event: MouseEvent) => {
4574          console.log(`Mouse Text : ${JSON.stringify(event)}`)
4575        })
4576        .onSizeChange((oldValue: SizeOptions, newValue: SizeOptions) => {
4577          console.info(`onSizeChange Text: oldValue is ${JSON.stringify(oldValue)} value is ${JSON.stringify(newValue)}`)
4578        })
4579      NodeContainer(this.myNodeController)
4580        .borderWidth(1)
4581        .width(300)
4582        .height(100)
4583    }.width("100%")
4584  }
4585}
4586```
4587
4588## LazyForEach场景基础事件使用示例
4589
4590<!--code_no_check-->
4591
4592```ts
4593// index.ets
4594import {Track, TrackManager, TrackNode} from "./track"
4595
4596@Builder
4597function page1() {
4598  Column() {
4599    Text("Page1")
4600    PageList().height("90%")
4601    Button("DumpMessage")
4602      .onClick(() => {
4603        TrackManager.get().dump()
4604      })
4605
4606  }.width("100%").height("100%")
4607}
4608
4609class BasicDataSource implements IDataSource {
4610  private listeners: DataChangeListener[] = [];
4611  private originDataArray: string[] = [];
4612
4613  public totalCount(): number {
4614    return 0;
4615  }
4616
4617  public getData(index: number): string {
4618    return this.originDataArray[index];
4619  }
4620
4621  // 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
4622  registerDataChangeListener(listener: DataChangeListener): void {
4623    if (this.listeners.indexOf(listener) < 0) {
4624      console.info('add listener');
4625      this.listeners.push(listener);
4626    }
4627  }
4628
4629  // 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
4630  unregisterDataChangeListener(listener: DataChangeListener): void {
4631    const pos = this.listeners.indexOf(listener);
4632    if (pos >= 0) {
4633      console.info('remove listener');
4634      this.listeners.splice(pos, 1);
4635    }
4636  }
4637
4638  // 通知LazyForEach组件需要重载所有子组件
4639  notifyDataReload(): void {
4640    this.listeners.forEach(listener => {
4641      listener.onDataReloaded();
4642    })
4643  }
4644
4645  // 通知LazyForEach组件需要在index对应索引处添加子组件
4646  notifyDataAdd(index: number): void {
4647    this.listeners.forEach(listener => {
4648      listener.onDataAdd(index);
4649    })
4650  }
4651
4652  // 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件
4653  notifyDataChange(index: number): void {
4654    this.listeners.forEach(listener => {
4655      listener.onDataChange(index);
4656    })
4657  }
4658
4659  // 通知LazyForEach组件需要在index对应索引处删除该子组件
4660  notifyDataDelete(index: number): void {
4661    this.listeners.forEach(listener => {
4662      listener.onDataDelete(index);
4663    })
4664  }
4665
4666  // 通知LazyForEach组件将from索引和to索引处的子组件进行交换
4667  notifyDataMove(from: number, to: number): void {
4668    this.listeners.forEach(listener => {
4669      listener.onDataMove(from, to);
4670    })
4671  }
4672}
4673
4674class MyDataSource extends BasicDataSource {
4675  private dataArray: string[] = [];
4676
4677  public totalCount(): number {
4678    return this.dataArray.length;
4679  }
4680
4681  public getData(index: number): string {
4682    return this.dataArray[index];
4683  }
4684
4685  public addData(index: number, data: string): void {
4686    this.dataArray.splice(index, 0, data);
4687    this.notifyDataAdd(index);
4688  }
4689
4690  public pushData(data: string): void {
4691    this.dataArray.push(data);
4692    this.notifyDataAdd(this.dataArray.length - 1);
4693  }
4694}
4695
4696@Component
4697struct PageList {
4698  private data: MyDataSource = new MyDataSource();
4699
4700  aboutToAppear() {
4701    for (let i = 0; i <= 100; i++) {
4702      this.data.pushData(`Hello ${i}`)
4703    }
4704  }
4705
4706  build() {
4707    List({ space: 3 }) {
4708      LazyForEach(this.data, (item: string, index: number) => {
4709        ListItem() {
4710          // 通过TrackNode对组件进行封装埋点
4711          TrackNode({track: new Track().tag("xxx"+ item).id(index + 30000)}) {
4712            Row() {
4713              Text(item).fontSize(30)
4714                .onClick(() => {
4715                })
4716            }.margin({ left: 10, right: 10 })
4717          }
4718        }
4719      }, (item: string) => item)
4720    }.cachedCount(5)
4721  }
4722}
4723
4724
4725@Entry
4726@Component
4727struct TrackTest {
4728  pageInfos: NavPathStack = new NavPathStack()
4729  build() {
4730    Row() {
4731      TrackNode({ track: new Track().tag("root").id(10000)}) {
4732        page1()
4733      }
4734    }
4735  }
4736
4737  aboutToAppear(): void {
4738    TrackManager.get().startListenClick(this.getUIContext())
4739  }
4740}
4741```
4742
4743<!--code_no_check-->
4744
4745```ts
4746// ./track.ets
4747import { FrameNode, Rect } from '@kit.ArkUI';
4748
4749@Component
4750export struct TrackNode {
4751  @BuilderParam closer: VoidCallback = this.defaultBuilder
4752  track: Track | null = null
4753  trackShadow: TrackShadow = new TrackShadow()
4754
4755  @Builder defaultBuilder() {
4756  }
4757
4758  build() {
4759    this.closer()
4760  }
4761
4762  aboutToAppear(): void {
4763    // use onDidBuild later
4764  }
4765
4766  aboutToDisappear(): void {
4767    TrackManager.get().removeTrack(this.trackShadow.id)
4768    console.log("Track disappear:" + this.trackShadow.id)
4769  }
4770
4771  onDidBuild(): void {
4772    // 构建埋点的虚拟树,获取的node为当前页面的根节点(用例中为Row)。
4773    let uid = this.getUniqueId()
4774    let node: FrameNode | null = this.getUIContext().getFrameNodeByUniqueId(uid);
4775    console.log("Track onDidBuild node:" + node?.getNodeType())
4776    if (node === null) {
4777      return
4778    }
4779    this.trackShadow.node = node
4780    this.trackShadow.id = node?.getUniqueId()
4781    this.trackShadow.track = this.track;
4782    TrackManager.get().addTrack(this.trackShadow.id, this.trackShadow)
4783    // 通过setOnVisibleAreaApproximateChange监听记录埋点组件的可视区域。
4784    node?.commonEvent.setOnVisibleAreaApproximateChange(
4785      { ratios: [0, 0.1, 0.2, 0.5, 0.8, 1], expectedUpdateInterval: 500 },
4786      (ratioInc: boolean, ratio: number) => {
4787        console.log(`Node ${node?.getUniqueId()}:${node?.getNodeType()} is visibleRatio is ${ratio}`);
4788        this.trackShadow.visibleRatio = ratio
4789      })
4790
4791    let parent: FrameNode | null = node?.getParent()
4792
4793    let attachTrackToParent: (parent: FrameNode | null) => boolean =
4794      (parent: FrameNode | null) => {
4795        while (parent !== null) {
4796          let parentTrack = TrackManager.get().getTrackById(parent.getUniqueId())
4797          if (parentTrack !== undefined) {
4798            parentTrack.childIds.add(this.trackShadow.id)
4799            this.trackShadow.parentId = parentTrack.id
4800            return true;
4801          }
4802          parent = parent.getParent()
4803        }
4804        return false;
4805      }
4806    let attached = attachTrackToParent(parent);
4807
4808    if (!attached) {
4809      node?.commonEvent.setOnAppear(() => {
4810        let attached = attachTrackToParent(parent);
4811        if (attached) {
4812          console.log("Track lazy attached:" + this.trackShadow.id)
4813        }
4814      })
4815    }
4816  }
4817}
4818
4819export class Track {
4820  public areaPercent: number = 0
4821  private trackTag: string = ""
4822  private trackId: number = 0
4823
4824  constructor() {
4825  }
4826
4827  tag(newTag: string): Track {
4828    this.trackTag = newTag;
4829    return this;
4830  }
4831
4832  id(newId: number): Track {
4833    this.trackId = newId;
4834    return this;
4835  }
4836}
4837
4838export class TrackShadow {
4839  public node: FrameNode | null = null
4840  public id: number = -1
4841  public track: Track | null = null
4842  public childIds: Set<number> = new Set()
4843  public parentId: number = -1
4844  public visibleRect: Rect = { left: 0, top: 0, right: 0, bottom: 0 }
4845  public area: number = 0
4846  public visibleRatio: number = 0
4847
4848  // 通过全局dump输出埋点树的信息
4849  dump(depth: number = 0): void {
4850    console.log("Track Dp:" + depth + " id:" + this.id + " areaPer:" + this.track?.areaPercent + " visibleRatio:" + this.visibleRatio)
4851    this.childIds.forEach((value: number) => {
4852      TrackManager.get().getTrackById(value)?.dump(depth + 1)
4853    })
4854  }
4855}
4856
4857export class TrackManager {
4858  static instance: TrackManager
4859  private trackMap: Map<number, TrackShadow> = new Map()
4860  private rootTrack: TrackShadow | null = null
4861
4862  static get(): TrackManager {
4863    if (TrackManager.instance !== undefined) {
4864      return TrackManager.instance
4865    }
4866    TrackManager.instance = new TrackManager()
4867    return TrackManager.instance
4868  }
4869
4870  addTrack(id: number, track: TrackShadow) {
4871    if (this.trackMap.size == 0) {
4872      this.rootTrack = track
4873    }
4874    console.log("Track add id:" + id)
4875    this.trackMap.set(id, track)
4876  }
4877
4878  removeTrack(id: number) {
4879    let current = this.getTrackById(id)
4880    if (current !== undefined) {
4881      this.trackMap.delete(id)
4882      let parent = this.getTrackById(current?.parentId)
4883      parent?.childIds.delete(id)
4884    }
4885  }
4886
4887  getTrackById(id: number): TrackShadow | undefined {
4888    return this.trackMap.get(id)
4889  }
4890
4891  startListenClick(context: UIContext) {
4892    // 通过无感监听获取FrameNode查找埋点信息。
4893    context.getUIObserver().on("willClick", (event: ClickEvent, node?: FrameNode) => {
4894      console.log("Track clicked:" + node)
4895      if (node == undefined) {
4896        return
4897      }
4898      let track = this.getTrackById(node.getUniqueId())
4899      track?.dump(0);
4900    })
4901  }
4902
4903  updateVisibleInfo(track: TrackShadow): void {
4904    // do something
4905  }
4906
4907  dump(): void {
4908    this.rootTrack?.dump(0)
4909  }
4910}
4911```
4912## 手势事件示例
4913```ts
4914import { NodeController, FrameNode } from '@kit.ArkUI';
4915
4916class MyNodeController extends NodeController {
4917  public rootNode: FrameNode | null = null;
4918
4919  makeNode(uiContext: UIContext): FrameNode | null {
4920    this.rootNode = new FrameNode(uiContext);
4921    this.rootNode.commonAttribute.width(100)
4922      .overlay('This is a FrameNode')
4923      .backgroundColor(Color.Pink)
4924      .width('100%')
4925      .height('100%');
4926    this.addGestureEvent(this.rootNode);
4927    return this.rootNode;
4928  }
4929
4930  addGestureEvent(frameNode: FrameNode) {
4931    frameNode.gestureEvent.addGesture(new PanGestureHandler()
4932        .onActionStart((event: GestureEvent) => {
4933            console.log(`Pan start: ${JSON.stringify(event)}`);
4934        })
4935        .onActionUpdate((event: GestureEvent) => {
4936            console.log(`Pan update: ${JSON.stringify(event)}`);
4937        })
4938        .onActionEnd((event: GestureEvent) => {
4939            console.log(`Pan end: ${JSON.stringify(event)}`);
4940        })
4941        .onActionCancel(() => {
4942            console.log('Pan cancel');
4943        })
4944    )
4945    frameNode.gestureEvent.addGesture(new LongPressGestureHandler()
4946        .onAction((event: GestureEvent) => {
4947            console.log(`Long press action: ${JSON.stringify(event)}`);
4948        })
4949        .onActionEnd((event: GestureEvent) => {
4950            console.log(`Long press action end: ${JSON.stringify(event)}`);
4951        })
4952        .onActionCancel(() => {
4953            console.log('Long press cancel');
4954        })
4955    )
4956    frameNode.gestureEvent.addGesture(new TapGestureHandler()
4957        .onAction((event: GestureEvent) => {
4958            console.log(`Tap action: ${JSON.stringify(event)}`);
4959        })
4960    )
4961  }
4962}
4963
4964@Entry
4965@Component
4966struct Index {
4967  private myNodeController: MyNodeController = new MyNodeController();
4968
4969  build() {
4970    Column() {
4971      NodeContainer(this.myNodeController)
4972        .borderWidth(1)
4973        .width(300)
4974        .height(300)
4975    }.width("100%")
4976  }
4977}
4978```
4979## 节点自定义示例
4980
4981```ts
4982import { UIContext, DrawContext, FrameNode, NodeController, LayoutConstraint, Size, Position } from '@kit.ArkUI';
4983import { drawing } from '@kit.ArkGraphics2D';
4984
4985function GetChildLayoutConstraint(constraint: LayoutConstraint, child: FrameNode): LayoutConstraint {
4986  const size = child.getUserConfigSize();
4987  const width = Math.max(
4988    Math.min(constraint.maxSize.width, size.width.value),
4989    constraint.minSize.width
4990    );
4991  const height = Math.max(
4992    Math.min(constraint.maxSize.height, size.height.value),
4993    constraint.minSize.height
4994    );
4995  const finalSize: Size = { width, height };
4996  const res: LayoutConstraint = {
4997    maxSize: finalSize,
4998    minSize: finalSize,
4999    percentReference: finalSize
5000  };
5001
5002  return res;
5003}
5004
5005class MyFrameNode extends FrameNode {
5006  public width: number = 10;
5007  private space: number = 1;
5008
5009  onMeasure(constraint: LayoutConstraint): void {
5010    let sizeRes: Size = { width: 100, height: 100 };
5011    for (let i = 0;i < this.getChildrenCount();i++) {
5012      let child = this.getChild(i);
5013      if (child) {
5014        let childConstraint = GetChildLayoutConstraint(constraint, child);
5015        child.measure(childConstraint);
5016        let size = child.getMeasuredSize();
5017        sizeRes.height += size.height + this.space;
5018        sizeRes.width = Math.max(sizeRes.width, size.width);
5019      }
5020    }
5021    this.setMeasuredSize(sizeRes);
5022  }
5023
5024  onLayout(position: Position): void {
5025    let y = 0;
5026    for (let i = 0;i < this.getChildrenCount();i++) {
5027      let child = this.getChild(i);
5028      if (child) {
5029        child.layout({
5030          x: 20,
5031          y: y
5032        });
5033        y += child.getMeasuredSize().height + this.space;
5034      }
5035    }
5036    this.setLayoutPosition(position);
5037  }
5038
5039  onDraw(context: DrawContext) {
5040    const canvas = context.canvas;
5041    const pen = new drawing.Pen();
5042    pen.setStrokeWidth(5);
5043    pen.setColor({ alpha: 255, red: 255, green: 0, blue: 0 });
5044    canvas.attachPen(pen);
5045    canvas.drawRect({ left: 0, right: this.width, top: 0, bottom: this.width });
5046    canvas.detachPen();
5047  }
5048
5049  addWidth() {
5050    this.width += 10;
5051  }
5052}
5053
5054class MyNodeController extends NodeController {
5055  public rootNode: MyFrameNode | null = null;
5056
5057  makeNode(context: UIContext): FrameNode | null {
5058    this.rootNode = new MyFrameNode(context);
5059    this.rootNode?.commonAttribute?.size({ width: 100, height: 100 }).backgroundColor(Color.Green);
5060    return this.rootNode;
5061  }
5062}
5063
5064@Entry
5065@Component
5066struct Index {
5067  private nodeController: MyNodeController = new MyNodeController();
5068
5069  build() {
5070    Row() {
5071      Column() {
5072        NodeContainer(this.nodeController)
5073          .width('100%')
5074          .height(100)
5075          .backgroundColor('#FFF0F0F0')
5076        Button('Invalidate')
5077          .onClick(() => {
5078            this.nodeController?.rootNode?.addWidth();
5079            this.nodeController?.rootNode?.invalidate();
5080          })
5081        Button('UpdateLayout')
5082          .onClick(() => {
5083            this.nodeController?.rootNode?.setNeedsLayout();
5084          })
5085      }
5086      .width('100%')
5087      .height('100%')
5088    }
5089    .height('100%')
5090  }
5091}
5092```
5093## NodeAdapter使用示例
5094
5095```ts
5096import { FrameNode, NodeController, NodeAdapter, typeNode } from '@kit.ArkUI';
5097
5098class MyNodeAdapter extends NodeAdapter {
5099  uiContext: UIContext
5100  cachePool: Array<FrameNode> = new Array();
5101  changed: boolean = false
5102  reloadTimes: number = 0;
5103  data: Array<string> = new Array();
5104  hostNode?: FrameNode
5105
5106  constructor(uiContext: UIContext, count: number) {
5107    super();
5108    this.uiContext = uiContext;
5109    this.totalNodeCount = count;
5110    this.loadData();
5111  }
5112
5113  reloadData(count: number): void {
5114    this.reloadTimes++;
5115    NodeAdapter.attachNodeAdapter(this, this.hostNode);
5116    this.totalNodeCount = count;
5117    this.loadData();
5118    this.reloadAllItems();
5119  }
5120
5121  refreshData(): void {
5122    let items = this.getAllAvailableItems()
5123    console.log("UINodeAdapter get All items:" + items.length);
5124    this.reloadAllItems();
5125  }
5126
5127  detachData(): void {
5128    NodeAdapter.detachNodeAdapter(this.hostNode);
5129    this.reloadTimes = 0;
5130  }
5131
5132  loadData(): void {
5133    for (let i = 0; i < this.totalNodeCount; i++) {
5134      this.data[i] = "Adapter ListItem " + i + " r:" + this.reloadTimes;
5135    }
5136  }
5137
5138  changeData(from: number, count: number): void {
5139    this.changed = !this.changed;
5140    for (let i = 0; i < count; i++) {
5141      let index = i + from;
5142      this.data[index] = "Adapter ListItem " + (this.changed ? "changed:" : "") + index + " r:" + this.reloadTimes;
5143    }
5144    this.reloadItem(from, count);
5145  }
5146
5147  insertData(from: number, count: number): void {
5148    for (let i = 0; i < count; i++) {
5149      let index = i + from;
5150      this.data.splice(index, 0, "Adapter ListItem " + from + "-" + i);
5151    }
5152    this.insertItem(from, count);
5153    this.totalNodeCount += count;
5154    console.log("UINodeAdapter after insert count:" + this.totalNodeCount);
5155  }
5156
5157  removeData(from: number, count: number): void {
5158    let arr = this.data.splice(from, count);
5159    this.removeItem(from, count);
5160    this.totalNodeCount -= arr.length;
5161    console.log("UINodeAdapter after remove count:" + this.totalNodeCount);
5162  }
5163
5164  moveData(from: number, to: number): void {
5165    let tmp = this.data.splice(from, 1);
5166    this.data.splice(to, 0, tmp[0]);
5167    this.moveItem(from, to);
5168  }
5169
5170  onAttachToNode(target: FrameNode): void {
5171    console.log("UINodeAdapter onAttachToNode id:" + target.getUniqueId());
5172    this.hostNode = target;
5173  }
5174
5175  onDetachFromNode(): void {
5176    console.log("UINodeAdapter onDetachFromNode");
5177  }
5178
5179  onGetChildId(index: number): number {
5180    console.log("UINodeAdapter onGetChildId:" + index);
5181    return index;
5182  }
5183
5184  onCreateChild(index: number): FrameNode {
5185    console.log("UINodeAdapter onCreateChild:" + index);
5186    if (this.cachePool.length > 0) {
5187      let cacheNode = this.cachePool.pop();
5188      if (cacheNode !== undefined) {
5189        console.log("UINodeAdapter onCreateChild reused id:" + cacheNode.getUniqueId());
5190        let text = cacheNode?.getFirstChild();
5191        let textNode = text as typeNode.Text;
5192        textNode?.initialize(this.data[index]).fontSize(20);
5193        return cacheNode;
5194      }
5195    }
5196    console.log("UINodeAdapter onCreateChild createNew");
5197    let itemNode = typeNode.createNode(this.uiContext, "ListItem");
5198    let textNode = typeNode.createNode(this.uiContext, "Text");
5199    textNode.initialize(this.data[index]).fontSize(20);
5200    itemNode.appendChild(textNode);
5201    return itemNode;
5202  }
5203
5204  onDisposeChild(id: number, node: FrameNode): void {
5205    console.log("UINodeAdapter onDisposeChild:" + id);
5206    if (this.cachePool.length < 10) {
5207      if (!this.cachePool.includes(node)) {
5208        console.log("UINodeAdapter caching node id:" + node.getUniqueId());
5209        this.cachePool.push(node);
5210      }
5211    } else {
5212      node.dispose();
5213    }
5214  }
5215
5216  onUpdateChild(id: number, node: FrameNode): void {
5217    let index = id;
5218    let text = node.getFirstChild();
5219    let textNode = text as typeNode.Text;
5220    textNode?.initialize(this.data[index]).fontSize(20);
5221  }
5222}
5223
5224class MyNodeAdapterController extends NodeController {
5225  rootNode: FrameNode | null = null;
5226  nodeAdapter: MyNodeAdapter | null = null;
5227
5228  makeNode(uiContext: UIContext): FrameNode | null {
5229    this.rootNode = new FrameNode(uiContext);
5230    let listNode = typeNode.createNode(uiContext, "List");
5231    listNode.initialize({ space: 3 }).borderWidth(2).borderColor(Color.Black);
5232    this.rootNode.appendChild(listNode);
5233    this.nodeAdapter = new MyNodeAdapter(uiContext, 100);
5234    NodeAdapter.attachNodeAdapter(this.nodeAdapter, listNode);
5235    return this.rootNode;
5236  }
5237}
5238
5239@Entry
5240@Component
5241struct ListNodeTest {
5242  adapterController: MyNodeAdapterController = new MyNodeAdapterController();
5243
5244  build() {
5245    Column() {
5246      Text("ListNode Adapter");
5247      NodeContainer(this.adapterController)
5248        .width(300).height(300)
5249        .borderWidth(1).borderColor(Color.Black);
5250      Row() {
5251        Button("Reload")
5252          .onClick(() => {
5253            this.adapterController.nodeAdapter?.reloadData(50);
5254          })
5255        Button("Change")
5256          .onClick(() => {
5257            this.adapterController.nodeAdapter?.changeData(5, 10)
5258          })
5259        Button("Insert")
5260          .onClick(() => {
5261            this.adapterController.nodeAdapter?.insertData(10, 10);
5262          })
5263      }
5264
5265      Row() {
5266        Button("Remove")
5267          .onClick(() => {
5268            this.adapterController.nodeAdapter?.removeData(10, 10);
5269          })
5270        Button("Move")
5271          .onClick(() => {
5272            this.adapterController.nodeAdapter?.moveData(2, 5);
5273          })
5274        Button("Refresh")
5275          .onClick(() => {
5276            this.adapterController.nodeAdapter?.refreshData();
5277          })
5278        Button("Detach")
5279          .onClick(() => {
5280            this.adapterController.nodeAdapter?.detachData();
5281          })
5282      }
5283    }.borderWidth(1)
5284    .width("100%")
5285  }
5286}
5287
5288```
5289
5290## 节点复用回收使用示例
5291
5292```ts
5293import { NodeController, BuilderNode, FrameNode, UIContext } from '@kit.ArkUI';
5294
5295class Params {
5296  text: string = "this is a text"
5297}
5298
5299@Builder
5300function buttonBuilder(params: Params) {
5301  Column() {
5302    Button(params.text)
5303      .fontSize(20)
5304      .borderRadius(8)
5305      .borderWidth(2)
5306      .backgroundColor(Color.Grey)
5307  }
5308}
5309
5310class MyNodeController extends NodeController {
5311  private buttonNode: BuilderNode<[Params]> | null = null;
5312  private rootNode: FrameNode | null = null;
5313  private wrapBuilder: WrappedBuilder<[Params]> = wrapBuilder(buttonBuilder);
5314
5315  makeNode(uiContext: UIContext): FrameNode {
5316    if (this.rootNode == null) {
5317      this.rootNode = new FrameNode(uiContext);
5318      this.buttonNode = new BuilderNode(uiContext);
5319      this.buttonNode.build(this.wrapBuilder, { text: "This is a Button" });
5320      this.rootNode.appendChild(this.buttonNode.getFrameNode());
5321    }
5322    return this.rootNode;
5323  }
5324
5325  onAttach(): void {
5326    console.log("myButton on attach");
5327  }
5328
5329  onDetach(): void {
5330    console.log("myButton on detach");
5331  }
5332
5333  //  onBind时复用
5334  onBind(containerId: number): void {
5335    // 该方法触发子组件复用,全局复用场景下,复用FrameNode后端资源。
5336    this.rootNode?.reuse();
5337    console.log("myButton reuse");
5338  }
5339
5340  //  onUnbind时回收
5341  onUnbind(containerId: number): void {
5342    // 该方法触发子组件的回收,全局复用场景下,回收FrameNode后端资源用于重新利用。
5343    this.rootNode?.recycle();
5344    console.log("myButton recycle");
5345  }
5346
5347  getButtonNode(): BuilderNode<[Params]> | null {
5348    return this.buttonNode;
5349  }
5350
5351  getFrameNode(): FrameNode | null {
5352    return this.rootNode;
5353  }
5354}
5355
5356@Entry
5357@Component
5358struct Index {
5359  @State buttonShow: boolean = true
5360  @State buttonIndex: number = 0
5361  public buttonController: MyNodeController = new MyNodeController();
5362  private buttonNull: null = null;
5363  private buttonControllerArray: Array<MyNodeController | null> = [this.buttonController, this.buttonNull]
5364
5365  build() {
5366    Column() {
5367      Row() {
5368        Button("Bind/Unbind")
5369          .onClick(() => {
5370            this.buttonIndex++;
5371          }).margin(5)
5372        Button("onAttach/onDetach")
5373          .onClick(() => {
5374            this.buttonShow = !this.buttonShow
5375          }).margin(5)
5376      }
5377      if (this.buttonShow) {
5378        NodeContainer(this.buttonControllerArray[this.buttonIndex % this.buttonControllerArray.length])
5379      }
5380    }
5381    .padding({ left: 35, right: 35 })
5382    .width("100%")
5383    .height("100%")
5384  }
5385}
5386
5387```
5388