• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# RenderNode
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @xiang-shouxing-->
5<!--Designer: @xiang-shouxing-->
6<!--Tester: @sally__-->
7<!--Adviser: @HelloCrease-->
8
9提供自绘制渲染节点RenderNode,支持开发者通过C API进行开发,完成自定义绘制需求。
10
11> **说明:**
12>
13> 本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
14>
15>
16> 不建议对BuilderNode中的RenderNode进行修改操作。
17
18## 导入模块
19
20```ts
21import { RenderNode } from '@kit.ArkUI';
22```
23
24## RenderNode
25
26### constructor
27
28constructor()
29
30RenderNode的构造函数。
31
32**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
33
34**系统能力:** SystemCapability.ArkUI.ArkUI.Full
35
36**示例:**
37
38```ts
39import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
40
41const renderNode = new RenderNode();
42renderNode.frame = { x: 0, y: 0, width: 100, height: 100 };
43renderNode.backgroundColor = 0xffff0000;
44
45class MyNodeController extends NodeController {
46  private rootNode: FrameNode | null = null;
47
48  makeNode(uiContext: UIContext): FrameNode | null {
49    this.rootNode = new FrameNode(uiContext);
50
51    const rootRenderNode = this.rootNode.getRenderNode();
52    if (rootRenderNode !== null) {
53      rootRenderNode.appendChild(renderNode);
54    }
55
56    return this.rootNode;
57  }
58}
59
60@Entry
61@Component
62struct Index {
63  private myNodeController: MyNodeController = new MyNodeController();
64
65  build() {
66    Row() {
67      NodeContainer(this.myNodeController)
68    }
69  }
70}
71```
72
73### appendChild
74
75appendChild(node: RenderNode): void
76
77在RenderNode最后一个子节点后添加新的子节点。
78
79**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
80
81**系统能力:** SystemCapability.ArkUI.ArkUI.Full
82
83**参数:**
84
85| 参数名 | 类型                      | 必填 | 说明                   |
86| ------ | ------------------------- | ---- | ---------------------- |
87| node   | [RenderNode](#rendernode-1) | 是   | 需要添加的RenderNode。 |
88
89**示例:**
90
91```ts
92import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
93
94const renderNode = new RenderNode();
95renderNode.frame = { x: 0, y: 0, width: 100, height: 100 };
96renderNode.backgroundColor = 0xffff0000;
97const child = new RenderNode();
98child.frame = { x: 10, y: 10, width: 50, height: 50 };
99child.backgroundColor = 0xff00ff00;
100renderNode.appendChild(child);
101
102class MyNodeController extends NodeController {
103  private rootNode: FrameNode | null = null;
104
105  makeNode(uiContext: UIContext): FrameNode | null {
106    this.rootNode = new FrameNode(uiContext);
107
108    const rootRenderNode = this.rootNode.getRenderNode();
109    if (rootRenderNode !== null) {
110      rootRenderNode.appendChild(renderNode);
111    }
112
113    return this.rootNode;
114  }
115}
116
117@Entry
118@Component
119struct Index {
120  private myNodeController: MyNodeController = new MyNodeController();
121
122  build() {
123    Row() {
124      NodeContainer(this.myNodeController)
125    }
126  }
127}
128```
129
130### insertChildAfter
131
132insertChildAfter(child: RenderNode, sibling: RenderNode | null): void
133
134在RenderNode指定子节点之后添加新的子节点。
135
136**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
137
138**系统能力:** SystemCapability.ArkUI.ArkUI.Full
139
140**参数:**
141
142| 参数名  | 类型                                        | 必填 | 说明                                                                         |
143| ------- | ------------------------------------------- | ---- | ---------------------------------------------------------------------------- |
144| child   | [RenderNode](#rendernode-1)                   | 是   | 需要添加的子节点。                                                           |
145| sibling | [RenderNode](#rendernode-1)&nbsp;\|&nbsp;null | 是   | 新节点将插入到该节点之后。若该参数设置为空,则新节点将插入到首个子节点之前。 |
146
147**示例:**
148
149```ts
150import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
151
152const renderNode = new RenderNode();
153renderNode.frame = { x: 0, y: 0, width: 200, height: 350 };
154renderNode.backgroundColor = 0xffff0000;
155for (let i = 0; i < 5; i++) {
156  const node = new RenderNode();
157  node.frame = { x: 10, y: 10 + 60 * i, width: 50, height: 50 };
158  node.backgroundColor = 0xff00ff00;
159  renderNode.appendChild(node);
160}
161
162const child = new RenderNode();
163child.frame = { x: 70, y: 70, width: 50, height: 50 };
164child.backgroundColor = 0xffffff00;
165const sibling = renderNode.getChild(1);
166renderNode.insertChildAfter(child, sibling);
167
168class MyNodeController extends NodeController {
169  private rootNode: FrameNode | null = null;
170
171  makeNode(uiContext: UIContext): FrameNode | null {
172    this.rootNode = new FrameNode(uiContext);
173
174    const rootRenderNode = this.rootNode.getRenderNode();
175    if (rootRenderNode !== null) {
176      rootRenderNode.appendChild(renderNode);
177    }
178
179    return this.rootNode;
180  }
181}
182
183@Entry
184@Component
185struct Index {
186  private myNodeController: MyNodeController = new MyNodeController();
187
188  build() {
189    Row() {
190      NodeContainer(this.myNodeController)
191    }
192  }
193}
194```
195
196### removeChild
197
198removeChild(node: RenderNode): void
199
200从RenderNode中删除指定的子节点。
201
202**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
203
204**系统能力:** SystemCapability.ArkUI.ArkUI.Full
205
206**参数:**
207
208| 参数名 | 类型                      | 必填 | 说明               |
209| ------ | ------------------------- | ---- | ------------------ |
210| node   | [RenderNode](#rendernode-1) | 是   | 需要删除的子节点。 |
211
212**示例:**
213```ts
214import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
215
216const renderNode = new RenderNode();
217renderNode.frame = { x: 0, y: 0, width: 200, height: 350 };
218renderNode.backgroundColor = 0xffff0000;
219for (let i = 0; i < 5; i++) {
220  const node = new RenderNode();
221  node.frame = { x: 10, y: 10 + 60 * i, width: 50, height: 50 };
222  node.backgroundColor = 0xff00ff00;
223  renderNode.appendChild(node);
224}
225
226const node = renderNode.getChild(1);
227renderNode.removeChild(node);
228
229class MyNodeController extends NodeController {
230  private rootNode: FrameNode | null = null;
231
232  makeNode(uiContext: UIContext): FrameNode | null {
233    this.rootNode = new FrameNode(uiContext);
234
235    const rootRenderNode = this.rootNode.getRenderNode();
236    if (rootRenderNode !== null) {
237      rootRenderNode.appendChild(renderNode);
238    }
239
240    return this.rootNode;
241  }
242}
243
244@Entry
245@Component
246struct Index {
247  private myNodeController: MyNodeController = new MyNodeController();
248
249  build() {
250    Row() {
251      NodeContainer(this.myNodeController)
252    }
253  }
254}
255```
256### clearChildren
257
258clearChildren(): void
259
260清除当前RenderNode的所有子节点。
261
262**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
263
264**系统能力:** SystemCapability.ArkUI.ArkUI.Full
265
266**示例:**
267
268```ts
269import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
270
271const renderNode = new RenderNode();
272renderNode.size = { width: 200, height: 300 };
273for (let i = 0; i < 10; i++) {
274  let childNode = new RenderNode();
275  childNode.size = { width: i * 10, height: i * 10 };
276  childNode.position = { x: i * 10, y: i * 10 };
277  childNode.backgroundColor = 0xFF0000FF - 0X11 * i;
278  renderNode.appendChild(childNode);
279}
280
281class MyNodeController extends NodeController {
282  private rootNode: FrameNode | null = null;
283
284  makeNode(uiContext: UIContext): FrameNode | null {
285    this.rootNode = new FrameNode(uiContext);
286
287    const rootRenderNode = this.rootNode.getRenderNode();
288    if (rootRenderNode !== null) {
289      rootRenderNode.appendChild(renderNode);
290    }
291
292    return this.rootNode;
293  }
294}
295
296@Entry
297@Component
298struct Index {
299  private myNodeController: MyNodeController = new MyNodeController();
300
301  build() {
302    Column() {
303      NodeContainer(this.myNodeController)
304        .borderWidth(1)
305        .width(200)
306        .height(300)
307      Button("clearChildren")
308        .onClick(() => {
309          renderNode.clearChildren();
310        })
311    }.width("100%")
312  }
313}
314```
315
316### getChild
317
318getChild(index: number): RenderNode | null
319
320获取当前节点指定位置的子节点。
321
322**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
323
324**系统能力:** SystemCapability.ArkUI.ArkUI.Full
325
326**参数:**
327
328| 参数名  | 类型    | 必填 | 说明               |
329| ------- | ------- | ---- | ------------------ |
330| index | number | 是   | 需要查询的子节点的序列号。 |
331
332**返回值:**
333
334| 类型                              | 说明                                                       |
335| --------------------------------- | ---------------------------------------------------------- |
336| [RenderNode](#rendernode-1) \| null | 子节点。若该RenderNode不包含所查询的子节点,则返回空对象null。 |
337
338**示例:**
339
340```ts
341import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
342
343const renderNode = new RenderNode();
344renderNode.size = { width: 200, height: 300 };
345for (let i = 0; i < 10; i++) {
346  let childNode = new RenderNode();
347  childNode.size = { width: i * 10, height: i * 10 };
348  childNode.position = { x: i * 10, y: i * 10 };
349  childNode.backgroundColor = 0xFF0000FF - 0X11 * i;
350  renderNode.appendChild(childNode);
351}
352
353class MyNodeController extends NodeController {
354  private rootNode: FrameNode | null = null;
355
356  makeNode(uiContext: UIContext): FrameNode | null {
357    this.rootNode = new FrameNode(uiContext);
358
359    const rootRenderNode = this.rootNode.getRenderNode();
360    if (rootRenderNode !== null) {
361      rootRenderNode.appendChild(renderNode);
362    }
363
364    return this.rootNode;
365  }
366}
367
368@Entry
369@Component
370struct Index {
371  private myNodeController: MyNodeController = new MyNodeController();
372
373  build() {
374    Column() {
375      NodeContainer(this.myNodeController)
376        .borderWidth(1)
377        .width(200)
378        .height(300)
379      Button("getChild")
380        .onClick(() => {
381          for (let i = 0; i < 11; i++) {
382            let childNode: RenderNode | null = renderNode.getChild(i);
383            if (childNode == null) {
384              console.error(`the ${i} of renderNode's childNode is null`);
385            } else {
386              console.info(`the ${i} of renderNode's childNode has a size of {${childNode.size.width},${childNode.size.height}}`);
387            }
388          }
389
390        })
391    }.width("100%")
392  }
393}
394```
395
396### getFirstChild
397
398getFirstChild(): RenderNode | null
399
400获取当前RenderNode的第一个子节点。
401
402**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
403
404**系统能力:** SystemCapability.ArkUI.ArkUI.Full
405
406**返回值:**
407
408| 类型                              | 说明                                                       |
409| --------------------------------- | ---------------------------------------------------------- |
410| [RenderNode](#rendernode-1) \| null | 首个子节点。若该RenderNode不包含子节点,则返回空对象null。 |
411
412**示例:**
413
414```ts
415import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
416
417const renderNode = new RenderNode();
418renderNode.frame = { x: 0, y: 0, width: 200, height: 350 };
419renderNode.backgroundColor = 0xffff0000;
420for (let i = 0; i < 5; i++) {
421  const node = new RenderNode();
422  node.frame = { x: 10, y: 10 + 60 * i, width: 50, height: 50 };
423  node.backgroundColor = 0xff00ff00;
424  renderNode.appendChild(node);
425}
426
427class MyNodeController extends NodeController {
428  private rootNode: FrameNode | null = null;
429
430  makeNode(uiContext: UIContext): FrameNode | null {
431    this.rootNode = new FrameNode(uiContext);
432
433    const rootRenderNode = this.rootNode.getRenderNode();
434    if (rootRenderNode !== null) {
435      rootRenderNode.appendChild(renderNode);
436    }
437
438    return this.rootNode;
439  }
440}
441
442@Entry
443@Component
444struct Index {
445  private myNodeController: MyNodeController = new MyNodeController();
446
447  build() {
448    Row() {
449      NodeContainer(this.myNodeController)
450        .width(200)
451        .height(350)
452      Button('getFirstChild')
453        .onClick(() => {
454          const firstChild = renderNode.getFirstChild();
455          if (firstChild === null) {
456            console.error('the fist child is null');
457          } else {
458            console.info(`the position of fist child is x: ${firstChild.position.x}, y: ${firstChild.position.y}`);
459          }
460        })
461    }
462  }
463}
464```
465
466### getNextSibling
467
468getNextSibling(): RenderNode | null
469
470获取当前RenderNode的下一个同级节点。
471
472**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
473
474**系统能力:** SystemCapability.ArkUI.ArkUI.Full
475
476**返回值:**
477
478| 类型                              | 说明                                                                                   |
479| --------------------------------- | -------------------------------------------------------------------------------------- |
480| [RenderNode](#rendernode-1) \| null | 当前RenderNode的下一个同级节点。若该RenderNode不包含下一个同级节点,则返回空对象null。 |
481
482**示例:**
483```ts
484import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
485
486const renderNode = new RenderNode();
487renderNode.frame = { x: 0, y: 0, width: 200, height: 350 };
488renderNode.backgroundColor = 0xffff0000;
489for (let i = 0; i < 5; i++) {
490  const node = new RenderNode();
491  node.frame = { x: 10, y: 10 + 60 * i, width: 50, height: 50 };
492  node.backgroundColor = 0xff00ff00;
493  renderNode.appendChild(node);
494}
495
496class MyNodeController extends NodeController {
497  private rootNode: FrameNode | null = null;
498
499  makeNode(uiContext: UIContext): FrameNode | null {
500    this.rootNode = new FrameNode(uiContext);
501
502    const rootRenderNode = this.rootNode.getRenderNode();
503    if (rootRenderNode !== null) {
504      rootRenderNode.appendChild(renderNode);
505    }
506
507    return this.rootNode;
508  }
509}
510
511@Entry
512@Component
513struct Index {
514  private myNodeController: MyNodeController = new MyNodeController();
515
516  build() {
517    Row() {
518      NodeContainer(this.myNodeController)
519        .width(200)
520        .height(350)
521      Button('getNextSibling')
522        .onClick(() => {
523          const child = renderNode.getChild(1);
524          const nextSibling = child!.getNextSibling()
525          if (nextSibling === null || child === null) {
526            console.info('the child or nextChild is null');
527          } else {
528            console.info(`the position of child is x: ${child.position.x}, y: ${child.position.y}, ` +
529              `the position of nextSibling is x: ${nextSibling.position.x}, y: ${nextSibling.position.y}`);
530          }
531        })
532    }
533  }
534}
535```
536
537### getPreviousSibling
538
539getPreviousSibling(): RenderNode | null
540
541获取当前RenderNode的上一个同级节点。
542
543**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
544
545**系统能力:** SystemCapability.ArkUI.ArkUI.Full
546
547**返回值:**
548
549| 类型                              | 说明                                                                                   |
550| --------------------------------- | -------------------------------------------------------------------------------------- |
551| [RenderNode](#rendernode-1) \| null | 当前RenderNode的上一个同级节点。若该RenderNode不包含上一个同级节点,则返回空对象null。 |
552
553**示例:**
554```ts
555import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
556
557const renderNode = new RenderNode();
558renderNode.frame = { x: 0, y: 0, width: 200, height: 350 };
559renderNode.backgroundColor = 0xffff0000;
560for (let i = 0; i < 5; i++) {
561  const node = new RenderNode();
562  node.frame = { x: 10, y: 10 + 60 * i, width: 50, height: 50 };
563  node.backgroundColor = 0xff00ff00;
564  renderNode.appendChild(node);
565}
566
567class MyNodeController extends NodeController {
568  private rootNode: FrameNode | null = null;
569
570  makeNode(uiContext: UIContext): FrameNode | null {
571    this.rootNode = new FrameNode(uiContext);
572
573    const rootRenderNode = this.rootNode.getRenderNode();
574    if (rootRenderNode !== null) {
575      rootRenderNode.appendChild(renderNode);
576    }
577
578    return this.rootNode;
579  }
580}
581
582@Entry
583@Component
584struct Index {
585  private myNodeController: MyNodeController = new MyNodeController();
586
587  build() {
588    Row() {
589      NodeContainer(this.myNodeController)
590        .width(200)
591        .height(350)
592      Button('getPreviousSibling')
593        .onClick(() => {
594          const child = renderNode.getChild(1);
595          const previousSibling = child!.getPreviousSibling()
596          if (child === null || previousSibling === null) {
597            console.error('the child or previousChild is null');
598          } else {
599            console.info(`the position of child is x: ${child.position.x}, y: ${child.position.y}, ` +
600              `the position of previousSibling is x: ${previousSibling.position.x}, y: ${previousSibling.position.y}`);
601          }
602        })
603    }
604  }
605}
606```
607
608### backgroundColor
609
610set backgroundColor(color: number)
611
612设置当前RenderNode的背景颜色。
613
614**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
615
616**系统能力:** SystemCapability.ArkUI.ArkUI.Full
617
618**参数:**
619
620| 参数名 | 类型   | 必填 | 说明                   |
621| ------ | ------ | ---- | ---------------------- |
622| color  | number | 是   | 背景颜色值,ARGB格式,示例:0xE5E5E5。 |
623
624get backgroundColor(): number
625
626获取当前RenderNode的背景颜色。
627
628**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
629
630**系统能力:** SystemCapability.ArkUI.ArkUI.Full
631
632**返回值:**
633
634| 类型   | 说明                                           |
635| ------ | ---------------------------------------------- |
636| number | 当前RenderNode的背景颜色,默认值为0X00000000。 |
637
638**示例:**
639```ts
640import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
641
642const renderNode = new RenderNode();
643renderNode.frame = { x: 0, y: 0, width: 100, height: 100 };
644renderNode.backgroundColor = 0XFF00FF00;
645const backgroundColor = renderNode.backgroundColor;
646
647class MyNodeController extends NodeController {
648  private rootNode: FrameNode | null = null;
649
650  makeNode(uiContext: UIContext): FrameNode | null {
651    this.rootNode = new FrameNode(uiContext);
652
653    const rootRenderNode = this.rootNode.getRenderNode();
654    if (rootRenderNode !== null) {
655      rootRenderNode.appendChild(renderNode);
656    }
657
658    return this.rootNode;
659  }
660}
661
662@Entry
663@Component
664struct Index {
665  private myNodeController: MyNodeController = new MyNodeController();
666  build() {
667    Row() {
668      NodeContainer(this.myNodeController)
669    }
670  }
671}
672```
673
674### clipToFrame
675
676set clipToFrame(useClip: boolean)
677
678设置是否对当前RenderNode剪裁。若设置为true,则超出该RenderNode大小的部分将会被截断。
679
680**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
681
682**系统能力:** SystemCapability.ArkUI.ArkUI.Full
683
684**参数:**
685
686| 参数名  | 类型    | 必填 | 说明               |
687| ------- | ------- | ---- | ------------------ |
688| useClip | boolean | 是   | 设置是否进行剪裁。<br/>true表示对当前RenderNode剪裁,false表示不对当前RenderNode剪裁。 |
689
690get clipToFrame(): boolean
691
692获取当前RenderNode是否需要进行剪裁。
693
694**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
695
696**系统能力:** SystemCapability.ArkUI.ArkUI.Full
697
698**返回值:**
699
700| 类型    | 说明                                                |
701| ------- | --------------------------------------------------- |
702| boolean | 获取当前RenderNode是否需要进行剪裁,默认值为true。<br/>true表示对当前RenderNode剪裁,false表示不对当前RenderNode剪裁。 |
703
704**示例:**
705```ts
706import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
707
708const renderNode = new RenderNode();
709renderNode.frame = { x: 0, y: 0, width: 100, height: 100 };
710renderNode.backgroundColor = 0xffff0000;
711renderNode.clipToFrame = true;
712const clipToFrame = renderNode.clipToFrame;
713
714const childNode = new RenderNode();
715childNode.frame = { x: 10, y: 10, width: 150, height: 50 };
716childNode.backgroundColor = 0xffffff00;
717renderNode.appendChild(childNode);
718
719class MyNodeController extends NodeController {
720  private rootNode: FrameNode | null = null;
721
722  makeNode(uiContext: UIContext): FrameNode | null {
723    this.rootNode = new FrameNode(uiContext);
724
725    const rootRenderNode = this.rootNode.getRenderNode();
726    if (rootRenderNode !== null) {
727      rootRenderNode.appendChild(renderNode);
728    }
729
730    return this.rootNode;
731  }
732}
733
734@Entry
735@Component
736struct Index {
737  private myNodeController: MyNodeController = new MyNodeController();
738
739  build() {
740    Row() {
741      NodeContainer(this.myNodeController)
742    }
743  }
744}
745```
746
747### opacity
748
749set opacity(value: number)
750
751设置当前RenderNode的不透明度。若输入的数值小于0,会被视为0。若输入的数值大于1,会被视为1。
752
753**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
754
755**系统能力:** SystemCapability.ArkUI.ArkUI.Full
756
757**参数:**
758
759| 参数名 | 类型   | 必填 | 说明                                   |
760| ------ | ------ | ---- | -------------------------------------- |
761| value  | number | 是   | 将要设置的不透明度,数据范围为[0, 1],值越大透明度越低。 |
762
763get opacity(): number
764
765获取当前RenderNode的不透明度。
766
767**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
768
769**系统能力:** SystemCapability.ArkUI.ArkUI.Full
770
771**返回值:**
772
773| 类型   | 说明                                      |
774| ------ | ----------------------------------------- |
775| number | 获取当前RenderNode的不透明度,默认值为1,不透明。 |
776
777**示例:**
778```ts
779import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
780
781const renderNode = new RenderNode();
782renderNode.frame = { x: 0, y: 0, width: 100, height: 100 };
783renderNode.backgroundColor = 0xffff0000;
784renderNode.opacity = 0.5;
785const opacity = renderNode.opacity;
786
787class MyNodeController extends NodeController {
788  private rootNode: FrameNode | null = null;
789
790  makeNode(uiContext: UIContext): FrameNode | null {
791    this.rootNode = new FrameNode(uiContext);
792
793    const rootRenderNode = this.rootNode.getRenderNode();
794    if (rootRenderNode !== null) {
795      rootRenderNode.appendChild(renderNode);
796    }
797
798    return this.rootNode;
799  }
800}
801
802@Entry
803@Component
804struct Index {
805  private myNodeController: MyNodeController = new MyNodeController();
806
807  build() {
808    Row() {
809      NodeContainer(this.myNodeController)
810    }
811  }
812}
813```
814
815### size
816
817set size(size: Size)
818
819设置当前RenderNode的大小。
820
821**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
822
823**系统能力:** SystemCapability.ArkUI.ArkUI.Full
824
825**参数:**
826
827| 参数名 | 类型                                     | 必填 | 说明                         |
828| ------ | ---------------------------------------- | ---- | ---------------------------- |
829| size   | [Size](./js-apis-arkui-graphics.md#size) | 是   | 将要设置的RenderNode的大小。 |
830
831get size(): Size
832
833获取当前RenderNode的大小。
834
835**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
836
837**系统能力:** SystemCapability.ArkUI.ArkUI.Full
838
839**返回值:**
840
841| 类型                                     | 说明                                            |
842| ---------------------------------------- | ----------------------------------------------- |
843| [Size](./js-apis-arkui-graphics.md#size) | 获取当前RenderNode的大小,默认值宽度和高度为0。 |
844
845**示例:**
846```ts
847import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
848
849const renderNode = new RenderNode();
850renderNode.backgroundColor = 0xffff0000;
851renderNode.size = { width: 100, height: 100 };
852const size = renderNode.size;
853
854class MyNodeController extends NodeController {
855  private rootNode: FrameNode | null = null;
856
857  makeNode(uiContext: UIContext): FrameNode | null {
858    this.rootNode = new FrameNode(uiContext);
859
860    const rootRenderNode = this.rootNode.getRenderNode();
861    if (rootRenderNode !== null) {
862      rootRenderNode.appendChild(renderNode);
863    }
864
865    return this.rootNode;
866  }
867}
868
869@Entry
870@Component
871struct Index {
872  private myNodeController: MyNodeController = new MyNodeController();
873
874  build() {
875    Row() {
876      NodeContainer(this.myNodeController)
877    }
878  }
879}
880```
881
882### position
883
884set position(position: Position)
885
886设置当前RenderNode的位置。
887
888**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
889
890**系统能力:** SystemCapability.ArkUI.ArkUI.Full
891
892**参数:**
893
894| 参数名   | 类型                                             | 必填 | 说明                         |
895| -------- | ------------------------------------------------ | ---- | ---------------------------- |
896| position | [Position](./js-apis-arkui-graphics.md#position) | 是   | 将要设置的RenderNode的位置。 |
897
898get position(): Position
899
900获取当前RenderNode的位置。
901
902**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
903
904**系统能力:** SystemCapability.ArkUI.ArkUI.Full
905
906**返回值:**
907
908| 类型                                             | 说明                                                 |
909| ------------------------------------------------ | ---------------------------------------------------- |
910| [Position](./js-apis-arkui-graphics.md#position) | 获取当前RenderNode的位置,默认位置为{ x: 0, y: 0 }。 |
911
912**示例:**
913```ts
914import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
915
916const renderNode = new RenderNode();
917renderNode.backgroundColor = 0xffff0000;
918renderNode.size = { width: 100, height: 100 };
919renderNode.position = { x: 10, y: 10 };
920const position = renderNode.position;
921
922class MyNodeController extends NodeController {
923  private rootNode: FrameNode | null = null;
924
925  makeNode(uiContext: UIContext): FrameNode | null {
926    this.rootNode = new FrameNode(uiContext);
927
928    const rootRenderNode = this.rootNode.getRenderNode();
929    if (rootRenderNode !== null) {
930      rootRenderNode.appendChild(renderNode);
931    }
932
933    return this.rootNode;
934  }
935}
936
937@Entry
938@Component
939struct Index {
940  private myNodeController: MyNodeController = new MyNodeController();
941
942  build() {
943    Row() {
944      NodeContainer(this.myNodeController)
945    }
946  }
947}
948```
949
950### frame
951
952set frame(frame: Frame)
953
954设置当前RenderNode的大小和位置。当和[position](#position)、[size](#size)同时使用时,以后设置的为准。
955
956**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
957
958**系统能力:** SystemCapability.ArkUI.ArkUI.Full
959
960**参数:**
961
962| 参数名 | 类型                                       | 必填 | 说明                             |
963| ------ | ------------------------------------------ | ---- | -------------------------------- |
964| frame  | [Frame](./js-apis-arkui-graphics.md#frame) | 是   | 将要设置的RenderNode的大小和位置。 |
965
966get frame(): Frame
967
968获取当前RenderNode的大小和位置。
969
970**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
971
972**系统能力:** SystemCapability.ArkUI.ArkUI.Full
973
974**返回值:**
975
976| 类型            | 说明                                                                          |
977| --------------- | ----------------------------------------------------------------------------- |
978| [Frame](#frame) | 获取当前RenderNode的大小和位置,默认值为{ x: 0, y: 0, width: 0, height: 0 }。 |
979
980**示例:**
981```ts
982import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
983
984const renderNode = new RenderNode();
985renderNode.backgroundColor = 0xffff0000;
986renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
987const frame = renderNode.frame;
988
989class MyNodeController extends NodeController {
990  private rootNode: FrameNode | null = null;
991
992  makeNode(uiContext: UIContext): FrameNode | null {
993    this.rootNode = new FrameNode(uiContext);
994
995    const rootRenderNode = this.rootNode.getRenderNode();
996    if (rootRenderNode !== null) {
997      rootRenderNode.appendChild(renderNode);
998    }
999
1000    return this.rootNode;
1001  }
1002}
1003
1004@Entry
1005@Component
1006struct Index {
1007  private myNodeController: MyNodeController = new MyNodeController();
1008
1009  build() {
1010    Row() {
1011      NodeContainer(this.myNodeController)
1012    }
1013  }
1014}
1015```
1016
1017### pivot
1018
1019set pivot(pivot: Pivot)
1020
1021设置当前RenderNode的轴心,影响RenderNode的缩放和旋转效果。
1022
1023**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1024
1025**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1026
1027**参数:**
1028
1029| 参数名 | 类型                                       | 必填 | 说明                         |
1030| ------ | ------------------------------------------ | ---- | ---------------------------- |
1031| pivot  | [Pivot](./js-apis-arkui-graphics.md#pivot) | 是   | 将要设置的RenderNode的轴心。 |
1032
1033get pivot(): Pivot
1034
1035获取当前RenderNode的轴心。
1036
1037**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1038
1039**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1040
1041**返回值:**
1042
1043| 类型                                       | 说明                                                  |
1044| ------------------------------------------ | ----------------------------------------------------- |
1045| [Pivot](./js-apis-arkui-graphics.md#pivot) | 获取当前RenderNode的轴心,默认值为{ x: 0.5, y: 0.5}。 |
1046
1047**示例:**
1048```ts
1049import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1050
1051const renderNode = new RenderNode();
1052renderNode.backgroundColor = 0xffff0000;
1053renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
1054renderNode.pivot = { x: 0.5, y: 0.6 };
1055const pivot = renderNode.pivot;
1056
1057renderNode.rotation = { x: 15, y: 0, z: 0 };
1058
1059class MyNodeController extends NodeController {
1060  private rootNode: FrameNode | null = null;
1061
1062  makeNode(uiContext: UIContext): FrameNode | null {
1063    this.rootNode = new FrameNode(uiContext);
1064
1065    const rootRenderNode = this.rootNode.getRenderNode();
1066    if (rootRenderNode !== null) {
1067      rootRenderNode.appendChild(renderNode);
1068    }
1069
1070    return this.rootNode;
1071  }
1072}
1073
1074@Entry
1075@Component
1076struct Index {
1077  private myNodeController: MyNodeController = new MyNodeController();
1078
1079  build() {
1080    Row() {
1081      NodeContainer(this.myNodeController)
1082    }
1083  }
1084}
1085```
1086
1087### scale
1088
1089set scale(scale: Scale)
1090
1091设置当前RenderNode的比例。
1092
1093**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1094
1095**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1096
1097**参数:**
1098
1099| 参数名 | 类型                                       | 必填 | 说明                             |
1100| ------ | ------------------------------------------ | ---- | -------------------------------- |
1101| scale  | [Scale](./js-apis-arkui-graphics.md#scale) | 是   | 将要设置的RenderNode的缩放比例。 |
1102
1103get scale(): Scale
1104
1105获取当前RenderNode的比例。
1106
1107**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1108
1109**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1110
1111**返回值:**
1112
1113| 类型                                       | 说明                                               |
1114| ------------------------------------------ | -------------------------------------------------- |
1115| [Scale](./js-apis-arkui-graphics.md#scale) | 获取当前RenderNode的比例,默认值为{ x: 1, y: 1 }。 |
1116
1117**示例:**
1118```ts
1119import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1120
1121const renderNode = new RenderNode();
1122renderNode.backgroundColor = 0xffff0000;
1123renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
1124renderNode.scale = { x: 0.5, y: 1 };
1125const scale = renderNode.scale;
1126
1127class MyNodeController extends NodeController {
1128  private rootNode: FrameNode | null = null;
1129
1130  makeNode(uiContext: UIContext): FrameNode | null {
1131    this.rootNode = new FrameNode(uiContext);
1132
1133    const rootRenderNode = this.rootNode.getRenderNode();
1134    if (rootRenderNode !== null) {
1135      rootRenderNode.appendChild(renderNode);
1136    }
1137
1138    return this.rootNode;
1139  }
1140}
1141
1142@Entry
1143@Component
1144struct Index {
1145  private myNodeController: MyNodeController = new MyNodeController();
1146
1147  build() {
1148    Row() {
1149      NodeContainer(this.myNodeController)
1150    }
1151  }
1152}
1153```
1154
1155### translation
1156
1157set translation(translation: Translation)
1158
1159设置当前RenderNode的平移量。
1160
1161**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1162
1163**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1164
1165**参数:**
1166
1167| 参数名      | 类型                                                   | 必填 | 说明                           |
1168| ----------- | ------------------------------------------------------ | ---- | ------------------------------ |
1169| translation | [Translation](./js-apis-arkui-graphics.md#translation) | 是   | 将要设置的RenderNode的平移量。 |
1170
1171get translation(): Translation
1172
1173获取当前RenderNode的平移量。
1174
1175**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1176
1177**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1178
1179**返回值:**
1180
1181| 类型                                                   | 说明                                                 |
1182| ------------------------------------------------------ | ---------------------------------------------------- |
1183| [Translation](./js-apis-arkui-graphics.md#translation) | 获取当前RenderNode的平移量,默认值为{ x: 0, y: 0 }。 |
1184
1185**示例:**
1186```ts
1187import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1188
1189const renderNode = new RenderNode();
1190renderNode.backgroundColor = 0xffff0000;
1191renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
1192renderNode.translation = { x: 100, y: 0 };
1193const translation = renderNode.translation;
1194
1195class MyNodeController extends NodeController {
1196  private rootNode: FrameNode | null = null;
1197
1198  makeNode(uiContext: UIContext): FrameNode | null {
1199    this.rootNode = new FrameNode(uiContext);
1200
1201    const rootRenderNode = this.rootNode.getRenderNode();
1202    if (rootRenderNode !== null) {
1203      rootRenderNode.appendChild(renderNode);
1204    }
1205
1206    return this.rootNode;
1207  }
1208}
1209
1210@Entry
1211@Component
1212struct Index {
1213  private myNodeController: MyNodeController = new MyNodeController();
1214
1215  build() {
1216    Row() {
1217      NodeContainer(this.myNodeController)
1218    }
1219  }
1220}
1221```
1222
1223### rotation
1224
1225set rotation(rotation: Rotation)
1226
1227设置当前RenderNode的旋转角度。
1228
1229**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1230
1231**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1232
1233**参数:**
1234
1235| 参数名   | 类型                                             | 必填 | 说明                             |
1236| -------- | ------------------------------------------------ | ---- | -------------------------------- |
1237| rotation | [Rotation](./js-apis-arkui-graphics.md#rotation) | 是   | 将要设置的RenderNode的旋转角度。 |
1238
1239get rotation(): Rotation
1240
1241获取当前RenderNode的旋转角度。
1242
1243**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1244
1245**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1246
1247**返回值:**
1248
1249| 类型                                             | 说明                                                    |
1250| ------------------------------------------------ | ------------------------------------------------------- |
1251| [Rotation](./js-apis-arkui-graphics.md#rotation) | 当前RenderNode的旋转角度。默认值为{ x: 0, y: 0, z: 0}。 |
1252
1253**示例:**
1254```ts
1255import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1256
1257const renderNode = new RenderNode();
1258renderNode.backgroundColor = 0xffff0000;
1259renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
1260renderNode.rotation = { x: 45, y: 0, z: 0 };
1261const rotation = renderNode.rotation;
1262
1263class MyNodeController extends NodeController {
1264  private rootNode: FrameNode | null = null;
1265
1266  makeNode(uiContext: UIContext): FrameNode | null {
1267    this.rootNode = new FrameNode(uiContext);
1268
1269    const rootRenderNode = this.rootNode.getRenderNode();
1270    if (rootRenderNode !== null) {
1271      rootRenderNode.appendChild(renderNode);
1272    }
1273
1274    return this.rootNode;
1275  }
1276}
1277
1278@Entry
1279@Component
1280struct Index {
1281  private myNodeController: MyNodeController = new MyNodeController();
1282
1283  build() {
1284    Row() {
1285      NodeContainer(this.myNodeController)
1286    }
1287  }
1288}
1289```
1290
1291### transform
1292
1293set transform(transform: Matrix4)
1294
1295设置当前RenderNode的变换矩阵。
1296
1297**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1298
1299**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1300
1301**参数:**
1302
1303| 参数名    | 类型                                           | 必填 | 说明                             |
1304| --------- | ---------------------------------------------- | ---- | -------------------------------- |
1305| transform | [Matrix4](./js-apis-arkui-graphics.md#matrix4) | 是   | 将要设置的RenderNode的变换矩阵。 |
1306
1307get transform(): Matrix4
1308
1309获取当前RenderNode的变换矩阵。默认值为:
1310```ts
1311[
1312  1, 0, 0, 0,
1313  0, 1, 0, 0,
1314  0, 0, 1, 0,
1315  0, 0, 0, 1
1316]
1317```
1318
1319**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1320
1321**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1322
1323**返回值:**
1324
1325| 类型                                           | 说明                       |
1326| ---------------------------------------------- | -------------------------- |
1327| [Matrix4](./js-apis-arkui-graphics.md#matrix4) | 当前RenderNode的变换矩阵。 |
1328
1329**示例:**
1330```ts
1331import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1332
1333const renderNode = new RenderNode();
1334renderNode.backgroundColor = 0xffff0000;
1335renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
1336renderNode.transform = [
1337  1, 0, 0, 0,
1338  0, 2, 0, 0,
1339  0, 0, 1, 0,
1340  0, 0, 0, 1
1341];
1342const transform = renderNode.transform;
1343
1344class MyNodeController extends NodeController {
1345  private rootNode: FrameNode | null = null;
1346
1347  makeNode(uiContext: UIContext): FrameNode | null {
1348    this.rootNode = new FrameNode(uiContext);
1349
1350    const rootRenderNode = this.rootNode.getRenderNode();
1351    if (rootRenderNode !== null) {
1352      rootRenderNode.appendChild(renderNode);
1353    }
1354
1355    return this.rootNode;
1356  }
1357}
1358
1359@Entry
1360@Component
1361struct Index {
1362  private myNodeController: MyNodeController = new MyNodeController();
1363
1364  build() {
1365    Row() {
1366      NodeContainer(this.myNodeController)
1367    }
1368  }
1369}
1370```
1371
1372### shadowColor
1373
1374set shadowColor(color: number)
1375
1376设置当前RenderNode的阴影颜色,ARGB格式。若设置了[shadowAlpha](#shadowalpha),则不透明度以shadowAlpha为准。
1377
1378**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1379
1380**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1381
1382**参数:**
1383
1384| 参数名 | 类型   | 必填 | 说明                                       |
1385| ------ | ------ | ---- | ------------------------------------------ |
1386| color  | number | 是   | 将要设置的RenderNode的阴影颜色,ARGB格式。<br/>取值范围是符合ARGB格式的颜色。 |
1387
1388get shadowColor(): number
1389
1390获取当前RenderNode的阴影颜色。
1391
1392**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1393
1394**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1395
1396**返回值:**
1397
1398| 类型   | 说明                                                     |
1399| ------ | -------------------------------------------------------- |
1400| number | 当前RenderNode的阴影颜色,ARGB格式,默认值为0X00000000。 |
1401
1402**示例:**
1403```ts
1404import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1405
1406const renderNode = new RenderNode();
1407renderNode.backgroundColor = 0xffff0000;
1408renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
1409renderNode.shadowElevation = 10;
1410renderNode.shadowColor = 0XFF00FF00;
1411const shadowColor = renderNode.shadowColor;
1412
1413class MyNodeController extends NodeController {
1414  private rootNode: FrameNode | null = null;
1415
1416  makeNode(uiContext: UIContext): FrameNode | null {
1417    this.rootNode = new FrameNode(uiContext);
1418
1419    const rootRenderNode = this.rootNode.getRenderNode();
1420    if (rootRenderNode !== null) {
1421      rootRenderNode.appendChild(renderNode);
1422    }
1423
1424    return this.rootNode;
1425  }
1426}
1427
1428@Entry
1429@Component
1430struct Index {
1431  private myNodeController: MyNodeController = new MyNodeController();
1432
1433  build() {
1434    Row() {
1435      NodeContainer(this.myNodeController)
1436    }
1437  }
1438}
1439```
1440
1441### shadowOffset
1442
1443set shadowOffset(offset: Offset)
1444
1445设置当前RenderNode的阴影偏移。
1446
1447**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1448
1449**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1450
1451**参数:**
1452
1453| 参数名 | 类型                                         | 必填 | 说明                             |
1454| ------ | -------------------------------------------- | ---- | -------------------------------- |
1455| offset | [Offset](./js-apis-arkui-graphics.md#offset) | 是   | 将要设置的RenderNode的阴影偏移。 |
1456
1457get shadowOffset(): Offset
1458
1459获取当前RenderNode的阴影偏移。
1460
1461**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1462
1463**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1464
1465**返回值:**
1466
1467| 类型                                         | 说明                                               |
1468| -------------------------------------------- | -------------------------------------------------- |
1469| [Offset](./js-apis-arkui-graphics.md#offset) | 当前RenderNode的阴影偏移,默认值为{ x: 0, y: 0 }。 |
1470
1471**示例:**
1472
1473```ts
1474import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1475
1476const renderNode = new RenderNode();
1477renderNode.backgroundColor = 0xffff0000;
1478renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
1479renderNode.shadowElevation = 10;
1480renderNode.shadowColor = 0XFF00FF00;
1481renderNode.shadowOffset = { x: 10, y: 10 };
1482const shadowOffset = renderNode.shadowOffset;
1483
1484class MyNodeController extends NodeController {
1485  private rootNode: FrameNode | null = null;
1486
1487  makeNode(uiContext: UIContext): FrameNode | null {
1488    this.rootNode = new FrameNode(uiContext);
1489
1490    const rootRenderNode = this.rootNode.getRenderNode();
1491    if (rootRenderNode !== null) {
1492      rootRenderNode.appendChild(renderNode);
1493    }
1494
1495    return this.rootNode;
1496  }
1497}
1498
1499@Entry
1500@Component
1501struct Index {
1502  private myNodeController: MyNodeController = new MyNodeController();
1503
1504  build() {
1505    Row() {
1506      NodeContainer(this.myNodeController)
1507    }
1508  }
1509}
1510```
1511
1512### label<sup>12+</sup>
1513
1514set label(label: string)
1515
1516设置当前RenderNode的标签。若当前节点是通过new创建的RenderNode,则设置的标签信息会在节点Inspector信息的属性中。
1517
1518**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1519
1520**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1521
1522**参数:**
1523
1524| 参数名 | 类型   | 必填 | 说明                                      |
1525| ------ | ------ | ---- | ----------------------------------------- |
1526| label  | string | 是   | 将要设置的RenderNode的标签。 |
1527
1528get label(): string
1529
1530获取当前RenderNode的标签。
1531
1532**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1533
1534**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1535
1536**返回值:**
1537
1538| 类型   | 说明                                           |
1539| ------ | ---------------------------------------------- |
1540| string | 当前RenderNode的标签,默认值为""。 |
1541
1542**示例:**
1543
1544```ts
1545import {  RenderNode, FrameNode, NodeController, UIContext } from '@kit.ArkUI';
1546
1547class MyNodeController extends NodeController {
1548  private rootNode: FrameNode | null = null;
1549
1550  makeNode(uiContext: UIContext): FrameNode | null {
1551    this.rootNode = new FrameNode(uiContext);
1552    const renderNode: RenderNode | null = this.rootNode.getRenderNode();
1553    if (renderNode !== null) {
1554      const renderChildNode: RenderNode = new RenderNode();
1555      renderChildNode.frame = { x: 0, y: 0, width: 100, height: 100 };
1556      renderChildNode.backgroundColor = 0xffff0000;
1557      renderChildNode.label = 'customRenderChildNode';
1558      console.info('label:', renderChildNode.label);
1559      renderNode.appendChild(renderChildNode);
1560    }
1561
1562    return this.rootNode;
1563  }
1564}
1565
1566@Entry
1567@Component
1568struct Index {
1569  private myNodeController: MyNodeController = new MyNodeController();
1570
1571  build() {
1572    Column() {
1573      NodeContainer(this.myNodeController)
1574        .width(300)
1575        .height(700)
1576        .backgroundColor(Color.Gray)
1577    }
1578  }
1579}
1580```
1581### shadowAlpha
1582
1583set shadowAlpha(alpha: number)
1584
1585设置当前RenderNode的阴影颜色的Alpha值。
1586
1587**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1588
1589**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1590
1591**参数:**
1592
1593| 参数名 | 类型   | 必填 | 说明                                      |
1594| ------ | ------ | ---- | ----------------------------------------- |
1595| alpha  | number | 是   | 将要设置的RenderNode的阴影颜色的Alpha值。<br/> 取值范围是alpha值。 |
1596
1597get shadowAlpha(): number
1598
1599获取当前RenderNode的阴影颜色的Alpha值。
1600
1601**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1602
1603**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1604
1605**返回值:**
1606
1607| 类型   | 说明                                           |
1608| ------ | ---------------------------------------------- |
1609| number | 当前RenderNode的阴影颜色的Alpha值,默认值为0。 |
1610
1611**示例:**
1612
1613```ts
1614import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1615
1616const renderNode = new RenderNode();
1617renderNode.backgroundColor = 0xffff0000;
1618renderNode.frame = { x: 10, y: 10, width: 100, height: 100 };
1619renderNode.shadowElevation = 10;
1620renderNode.shadowColor = 0XFF00FF00;
1621renderNode.shadowOffset = { x: 10, y: 10 };
1622renderNode.shadowAlpha = 0.1;
1623const shadowAlpha = renderNode.shadowAlpha;
1624
1625class MyNodeController extends NodeController {
1626  private rootNode: FrameNode | null = null;
1627
1628  makeNode(uiContext: UIContext): FrameNode | null {
1629    this.rootNode = new FrameNode(uiContext);
1630
1631    const rootRenderNode = this.rootNode.getRenderNode();
1632    if (rootRenderNode !== null) {
1633      rootRenderNode.appendChild(renderNode);
1634    }
1635
1636    return this.rootNode;
1637  }
1638}
1639
1640@Entry
1641@Component
1642struct Index {
1643  private myNodeController: MyNodeController = new MyNodeController();
1644
1645  build() {
1646    Row() {
1647      NodeContainer(this.myNodeController)
1648    }
1649  }
1650}
1651```
1652
1653### shadowElevation
1654
1655set shadowElevation(elevation: number)
1656
1657设置当前RenderNode的阴影的光照高度。
1658
1659**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1660
1661**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1662
1663**参数:**
1664
1665| 参数名    | 类型   | 必填 | 说明                             |
1666| --------- | ------ | ---- | -------------------------------- |
1667| elevation | number | 是   | 将要设置的RenderNode的光照高度。<br/> 取值范围:[0, +∞) |
1668
1669get shadowElevation(): number
1670
1671获取当前RenderNode的阴影的光照高度。
1672
1673**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1674
1675**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1676
1677**返回值:**
1678
1679| 类型   | 说明                                  |
1680| ------ | ------------------------------------- |
1681| number | 当前RenderNode的阴影高度,默认值为0。 <br/> 取值范围:[0, +∞) |
1682
1683**示例:**
1684
1685```ts
1686import {  RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1687
1688const renderNode = new RenderNode();
1689renderNode.backgroundColor = 0xffff0000;
1690renderNode.frame = { x: 0, y: 0, width: 100, height: 100 };
1691renderNode.shadowOffset = { x: 10, y: 10 };
1692renderNode.shadowAlpha = 0.7;
1693renderNode.shadowElevation = 30;
1694const shadowElevation = renderNode.shadowElevation;
1695
1696class MyNodeController extends NodeController {
1697  private rootNode: FrameNode | null = null;
1698
1699  makeNode(uiContext: UIContext): FrameNode | null {
1700    this.rootNode = new FrameNode(uiContext);
1701
1702    const rootRenderNode = this.rootNode.getRenderNode();
1703    if (rootRenderNode !== null) {
1704      rootRenderNode.appendChild(renderNode);
1705    }
1706
1707    return this.rootNode;
1708  }
1709}
1710
1711@Entry
1712@Component
1713struct Index {
1714  private myNodeController: MyNodeController = new MyNodeController();
1715
1716  build() {
1717    Row() {
1718      NodeContainer(this.myNodeController)
1719    }
1720  }
1721}
1722```
1723
1724![shadowElevation](./figures/ShadowElevation.jpg)
1725
1726### shadowRadius
1727
1728set shadowRadius(radius: number)
1729
1730设置当前RenderNode的阴影模糊半径。
1731
1732**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1733
1734**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1735
1736**参数:**
1737
1738| 参数名 | 类型   | 必填 | 说明                                 |
1739| ------ | ------ | ---- | ------------------------------------ |
1740| radius | number | 是   | 将要设置的RenderNode的阴影模糊半径。<br/> 取值范围:[0, +∞) |
1741
1742get shadowRadius(): number
1743
1744获取当前RenderNode的阴影模糊半径。
1745
1746**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1747
1748**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1749
1750**返回值:**
1751
1752| 类型   | 说明                                      |
1753| ------ | ----------------------------------------- |
1754| number | 当前RenderNode的阴影模糊半径,默认值为0。<br/> 取值范围:[0, +∞) |
1755
1756**示例:**
1757
1758```ts
1759import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
1760
1761const renderNode = new RenderNode();
1762renderNode.backgroundColor = 0xff0000ff;
1763renderNode.frame = {
1764  x: 100,
1765  y: 100,
1766  width: 100,
1767  height: 100
1768};
1769renderNode.shadowOffset = { x: 10, y: 10 };
1770renderNode.shadowAlpha = 0.7;
1771renderNode.shadowRadius = 30;
1772const shadowRadius = renderNode.shadowRadius;
1773console.info(`FrameNode ${shadowRadius}`);
1774
1775class MyNodeController extends NodeController {
1776  private rootNode: FrameNode | null = null;
1777
1778  makeNode(uiContext: UIContext): FrameNode | null {
1779    this.rootNode = new FrameNode(uiContext);
1780
1781    const rootRenderNode = this.rootNode.getRenderNode();
1782    if (rootRenderNode !== null) {
1783      rootRenderNode.appendChild(renderNode);
1784    }
1785
1786    return this.rootNode;
1787  }
1788}
1789
1790@Entry
1791@Component
1792struct Index {
1793  private myNodeController: MyNodeController = new MyNodeController();
1794
1795  build() {
1796    Row() {
1797      NodeContainer(this.myNodeController)
1798    }
1799  }
1800}
1801```
1802
1803![shadowRadius](./figures/ShadowRadius.jpg)
1804
1805### draw
1806
1807draw(context: DrawContext): void
1808
1809绘制方法,需要开发者进行实现。该方法会在RenderNode进行绘制时被调用。
1810
1811> **说明:**
1812>
1813> RenderNode初始化时,会调用两次draw方法。第一次调用是在首次创建FrameNode时触发Render流程,第二次调用是在首次设置modifier时触发绘制。后续绘制流程皆由modifier触发。
1814
1815**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1816
1817**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1818
1819**参数:**
1820
1821| 参数名  | 类型                                                   | 必填 | 说明             |
1822| ------- | ------------------------------------------------------ | ---- | ---------------- |
1823| context | [DrawContext](./js-apis-arkui-graphics.md#drawcontext) | 是   | 图形绘制上下文。 |
1824
1825**示例:**
1826
1827ArkTS侧代码:
1828
1829```ts
1830// Index.ets
1831import bridge from "libentry.so"; // 该 so 由开发者通过 NAPI 编写并生成
1832import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI';
1833
1834class MyRenderNode extends RenderNode {
1835  uiContext: UIContext;
1836
1837  constructor(uiContext: UIContext) {
1838    super();
1839    this.uiContext = uiContext;
1840  }
1841
1842  draw(context: DrawContext) {
1843    // 需要将 context 中的宽度和高度从vp转换为px
1844    bridge.nativeOnDraw(0, context, this.uiContext.vp2px(context.size.height), this.uiContext.vp2px(context.size.width));
1845  }
1846}
1847
1848class MyNodeController extends NodeController {
1849  private rootNode: FrameNode | null = null;
1850
1851  makeNode(uiContext: UIContext): FrameNode | null {
1852    this.rootNode = new FrameNode(uiContext);
1853
1854    const rootRenderNode = this.rootNode.getRenderNode();
1855    if (rootRenderNode !== null) {
1856      const renderNode = new MyRenderNode(uiContext);
1857      renderNode.size = { width: 100, height: 100 }
1858      rootRenderNode.appendChild(renderNode);
1859    }
1860
1861    return this.rootNode;
1862  }
1863}
1864
1865@Entry
1866@Component
1867struct Index {
1868  private myNodeController: MyNodeController = new MyNodeController();
1869  build() {
1870    Row() {
1871      NodeContainer(this.myNodeController)
1872    }
1873  }
1874}
1875```
1876
1877C++侧可通过NAPI来获取Canvas,并进行后续的自定义绘制操作。
1878
1879```c++
1880// native_bridge.cpp
1881#include "napi/native_api.h"
1882#include <native_drawing/drawing_canvas.h>
1883#include <native_drawing/drawing_color.h>
1884#include <native_drawing/drawing_path.h>
1885#include <native_drawing/drawing_pen.h>
1886
1887static napi_value OnDraw(napi_env env, napi_callback_info info)
1888{
1889    size_t argc = 4;
1890    napi_value args[4] = { nullptr };
1891    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
1892
1893    int32_t id;
1894    napi_get_value_int32(env, args[0], &id);
1895
1896    // 获取 Canvas 指针
1897    void* temp = nullptr;
1898    napi_unwrap(env, args[1], &temp);
1899    OH_Drawing_Canvas *canvas = reinterpret_cast<OH_Drawing_Canvas*>(temp);
1900
1901    // 获取 Canvas 宽度
1902    int32_t width;
1903    napi_get_value_int32(env, args[2], &width);
1904
1905    // 获取 Canvas 高度
1906    int32_t height;
1907    napi_get_value_int32(env, args[3], &height);
1908
1909    // 传入canvas、height、width等信息至绘制函数中进行自定义绘制
1910    auto path = OH_Drawing_PathCreate();
1911    OH_Drawing_PathMoveTo(path, width / 4, height / 4);
1912    OH_Drawing_PathLineTo(path, width * 3 / 4, height / 4);
1913    OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4);
1914    OH_Drawing_PathLineTo(path, width / 4, height * 3 / 4);
1915    OH_Drawing_PathLineTo(path, width / 4, height / 4);
1916    OH_Drawing_PathClose(path);
1917
1918    auto pen = OH_Drawing_PenCreate();
1919    OH_Drawing_PenSetWidth(pen, 10);
1920    OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));
1921    OH_Drawing_CanvasAttachPen(canvas, pen);
1922
1923    OH_Drawing_CanvasDrawPath(canvas, path);
1924
1925    return nullptr;
1926}
1927
1928EXTERN_C_START
1929static napi_value Init(napi_env env, napi_value exports)
1930{
1931    napi_property_descriptor desc[] = {
1932        { "nativeOnDraw", nullptr, OnDraw, nullptr, nullptr, nullptr, napi_default, nullptr }
1933    };
1934    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
1935    return exports;
1936}
1937EXTERN_C_END
1938
1939static napi_module demoModule = {
1940    .nm_version =1,
1941    .nm_flags = 0,
1942    .nm_filename = nullptr,
1943    .nm_register_func = Init,
1944    .nm_modname = "entry",
1945    .nm_priv = ((void*)0),
1946    .reserved = { 0 },
1947};
1948
1949extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
1950{
1951    napi_module_register(&demoModule);
1952}
1953```
1954
1955修改工程中的`src/main/cpp/CMakeLists.txt`文件,添加如下内容:
1956
1957<!--code_no_check-->
1958
1959```cmake
1960# the minimum version of CMake.
1961cmake_minimum_required(VERSION 3.4.1)
1962project(NapiTest)
1963
1964set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
1965
1966include_directories(${NATIVERENDER_ROOT_PATH}
1967                    ${NATIVERENDER_ROOT_PATH}/include)
1968
1969add_library(entry SHARED native_bridge.cpp)
1970target_link_libraries(entry PUBLIC libace_napi.z.so)
1971target_link_libraries(entry PUBLIC libace_ndk.z.so)
1972target_link_libraries(entry PUBLIC libnative_drawing.so)
1973```
1974
1975同时在工程中的`src/main/cpp/types/libentry/index.d.ts`文件中,添加自定义绘制函数在ArkTs侧的定义,如:
1976
1977<!--code_no_check-->
1978
1979```ts
1980import { DrawContext } from '@kit.ArkUI';
1981
1982export const nativeOnDraw: (id: number, context: DrawContext, width: number, height: number) => number;
1983```
1984
1985### invalidate
1986
1987invalidate(): void
1988
1989该方法会触发RenderNode的重新渲染。
1990
1991**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1992
1993**系统能力:** SystemCapability.ArkUI.ArkUI.Full
1994
1995**示例:**
1996
1997```ts
1998import bridge from "libentry.so"; // 该 so 由开发者通过 NAPI 编写并生成
1999import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI';
2000
2001class MyRenderNode extends RenderNode {
2002  uiContext: UIContext;
2003
2004  constructor(uiContext: UIContext) {
2005    super();
2006    this.uiContext = uiContext;
2007  }
2008
2009  draw(context: DrawContext) {
2010    // 需要将 context 中的宽度和高度从vp转换为px
2011    bridge.nativeOnDraw(0, context, this.uiContext.vp2px(context.size.height), this.uiContext.vp2px(context.size.width));
2012  }
2013}
2014
2015class MyNodeController extends NodeController {
2016  private rootNode: FrameNode | null = null;
2017  newNode: MyRenderNode | null = null;
2018
2019  makeNode(uiContext: UIContext): FrameNode | null {
2020    this.rootNode = new FrameNode(uiContext);
2021    const renderNode = this.rootNode.getRenderNode();
2022    if (renderNode === null) {
2023      return this.rootNode;
2024    }
2025    this.newNode = new MyRenderNode(uiContext);
2026    this.newNode.size = { width: 100, height: 100 };
2027    renderNode.appendChild(this.newNode);
2028    return this.rootNode;
2029  }
2030}
2031
2032@Entry
2033@Component
2034struct Index {
2035  private myNodeController: MyNodeController = new MyNodeController();
2036
2037  build() {
2038    Column() {
2039      Column() {
2040        NodeContainer(this.myNodeController)
2041          .width('100%')
2042        Button('Invalidate')
2043          .onClick(() => {
2044            this.myNodeController.newNode?.invalidate()
2045          })
2046      }
2047      .width('100%')
2048      .height('100%')
2049    }
2050    .height('100%')
2051  }
2052}
2053```
2054
2055`libentry.so`的构建方式见draw方法的示例。
2056
2057### borderStyle<sup>12+</sup>
2058
2059set borderStyle(style: Edges\<BorderStyle>)
2060
2061设置当前RenderNode的边框样式。
2062
2063**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2064
2065**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2066
2067**参数:**
2068
2069| 参数名 | 类型                                                                                                   | 必填 | 说明                   |
2070| ------ | ------------------------------------------------------------------------------------------------------ | ---- | ---------------------- |
2071| style  | [Edges](./js-apis-arkui-graphics.md#edgest12)<[BorderStyle](./arkui-ts/ts-appendix-enums.md#borderstyle)> | 是   | RenderNode的边框样式。 |
2072
2073get borderStyle(): Edges\<BorderStyle>
2074
2075获取当前RenderNode的边框样式。
2076
2077**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2078
2079**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2080
2081**返回值:**
2082
2083| 类型                                                                                                   | 说明                   |
2084| ------------------------------------------------------------------------------------------------------ | ---------------------- |
2085| [Edges](./js-apis-arkui-graphics.md#edgest12)<[BorderStyle](./arkui-ts/ts-appendix-enums.md#borderstyle)> | RenderNode的边框样式。 |
2086
2087**示例:**
2088```ts
2089import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2090
2091const renderNode = new RenderNode();
2092renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2093renderNode.backgroundColor = 0XFF00FF00;
2094renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 };
2095renderNode.borderStyle = {
2096  left: BorderStyle.Solid,
2097  top: BorderStyle.Dotted,
2098  right: BorderStyle.Dashed,
2099  bottom: BorderStyle.Solid
2100}
2101const borderStyle = renderNode.borderStyle;
2102
2103
2104class MyNodeController extends NodeController {
2105  private rootNode: FrameNode | null = null;
2106
2107  makeNode(uiContext: UIContext): FrameNode | null {
2108    this.rootNode = new FrameNode(uiContext);
2109
2110    const rootRenderNode = this.rootNode.getRenderNode();
2111    if (rootRenderNode !== null) {
2112      rootRenderNode.appendChild(renderNode);
2113    }
2114
2115    return this.rootNode;
2116  }
2117}
2118
2119@Entry
2120@Component
2121struct Index {
2122  private myNodeController: MyNodeController = new MyNodeController();
2123
2124  build() {
2125    Row() {
2126      NodeContainer(this.myNodeController)
2127    }
2128  }
2129}
2130```
2131
2132### borderWidth<sup>12+</sup>
2133
2134set borderWidth(width: Edges\<number>)
2135
2136设置当前RenderNode的边框宽度。
2137
2138**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2139
2140**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2141
2142**参数:**
2143
2144| 参数名 | 类型                                                | 必填 | 说明                   |
2145| ------ | --------------------------------------------------- | ---- | ---------------------- |
2146| width  | [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | 是   | RenderNode的边框宽度,单位为vp。 |
2147
2148get borderWidth(): Edges\<number>
2149
2150获取当前RenderNode的边框宽度。
2151
2152**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2153
2154**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2155
2156**返回值:**
2157
2158| 类型                                                | 说明                   |
2159| --------------------------------------------------- | ---------------------- |
2160| [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | RenderNode的边框宽度,默认所有边框宽度为0vp。 |
2161
2162**示例:**
2163
2164```ts
2165import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2166
2167const renderNode = new RenderNode();
2168renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2169renderNode.backgroundColor = 0XFF00FF00;
2170renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 };
2171const borderWidth = renderNode.borderWidth;
2172
2173
2174class MyNodeController extends NodeController {
2175  private rootNode: FrameNode | null = null;
2176
2177  makeNode(uiContext: UIContext): FrameNode | null {
2178    this.rootNode = new FrameNode(uiContext);
2179
2180    const rootRenderNode = this.rootNode.getRenderNode();
2181    if (rootRenderNode !== null) {
2182      rootRenderNode.appendChild(renderNode);
2183    }
2184
2185    return this.rootNode;
2186  }
2187}
2188
2189@Entry
2190@Component
2191struct Index {
2192  private myNodeController: MyNodeController = new MyNodeController();
2193
2194  build() {
2195    Row() {
2196      NodeContainer(this.myNodeController)
2197    }
2198  }
2199}
2200```
2201
2202### borderColor<sup>12+</sup>
2203
2204set borderColor(color: Edges\<number>)
2205
2206设置当前RenderNode的边框颜色。
2207
2208**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2209
2210**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2211
2212**参数:**
2213
2214| 参数名 | 类型                                                | 必填 | 说明                   |
2215| ------ | --------------------------------------------------- | ---- | ---------------------- |
2216| color  | [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | 是   | RenderNode的边框颜色。 |
2217
2218get borderColor(): Edges\<number>
2219
2220获取当前RenderNode的边框颜色。
2221
2222**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2223
2224**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2225
2226**返回值:**
2227
2228| 类型                                                | 说明                   |
2229| --------------------------------------------------- | ---------------------- |
2230| [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | RenderNode的边框颜色,默认所有边框颜色为0XFF000000。 |
2231
2232**示例:**
2233
2234```ts
2235import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2236
2237const renderNode = new RenderNode();
2238renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2239renderNode.backgroundColor = 0XFF00FF00;
2240renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 };
2241renderNode.borderColor = { left: 0xFF0000FF, top: 0xFF0000FF, right: 0xFF0000FF, bottom: 0xFF0000FF };
2242const borderColor = renderNode.borderColor;
2243
2244
2245class MyNodeController extends NodeController {
2246  private rootNode: FrameNode | null = null;
2247
2248  makeNode(uiContext: UIContext): FrameNode | null {
2249    this.rootNode = new FrameNode(uiContext);
2250
2251    const rootRenderNode = this.rootNode.getRenderNode();
2252    if (rootRenderNode !== null) {
2253      rootRenderNode.appendChild(renderNode);
2254    }
2255
2256    return this.rootNode;
2257  }
2258}
2259
2260@Entry
2261@Component
2262struct Index {
2263  private myNodeController: MyNodeController = new MyNodeController();
2264
2265  build() {
2266    Row() {
2267      NodeContainer(this.myNodeController)
2268    }
2269  }
2270}
2271```
2272
2273### borderRadius<sup>12+</sup>
2274
2275set borderRadius(radius: BorderRadiuses)
2276
2277设置当前RenderNode的边框圆角。
2278
2279**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2280
2281**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2282
2283**参数:**
2284
2285| 参数名 | 类型                                                         | 必填 | 说明                   |
2286| ------ | ------------------------------------------------------------ | ---- | ---------------------- |
2287| radius | [BorderRadiuses](./js-apis-arkui-graphics.md#borderradiuses12) | 是   | RenderNode的边框圆角,单位为vp。 |
2288
2289
2290get borderRadius(): BorderRadiuses
2291
2292获取当前RenderNode的边框圆角。
2293
2294**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2295
2296**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2297
2298**返回值:**
2299
2300| 类型                                                         | 说明                   |
2301| ------------------------------------------------------------ | ---------------------- |
2302| [BorderRadiuses](./js-apis-arkui-graphics.md#borderradiuses12) | RenderNode的边框圆角,默认所有边框圆角为0vp。 |
2303
2304**示例:**
2305
2306```ts
2307import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2308
2309const renderNode = new RenderNode();
2310renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2311renderNode.backgroundColor = 0XFF00FF00;
2312renderNode.borderRadius = { topLeft: 32, topRight: 32, bottomLeft: 32, bottomRight: 32 };
2313const borderRadius = renderNode.borderRadius;
2314
2315
2316class MyNodeController extends NodeController {
2317  private rootNode: FrameNode | null = null;
2318
2319  makeNode(uiContext: UIContext): FrameNode | null {
2320    this.rootNode = new FrameNode(uiContext);
2321
2322    const rootRenderNode = this.rootNode.getRenderNode();
2323    if (rootRenderNode !== null) {
2324      rootRenderNode.appendChild(renderNode);
2325    }
2326
2327    return this.rootNode;
2328  }
2329}
2330
2331@Entry
2332@Component
2333struct Index {
2334  private myNodeController: MyNodeController = new MyNodeController();
2335
2336  build() {
2337    Row() {
2338      NodeContainer(this.myNodeController)
2339    }
2340  }
2341}
2342```
2343
2344### shapeMask<sup>12+</sup>
2345
2346set shapeMask(shapeMask: ShapeMask)
2347
2348设置当前RenderNode的遮罩。
2349
2350**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2351
2352**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2353
2354**参数:**
2355
2356| 参数名    | 类型                                               | 必填 | 说明               |
2357| --------- | -------------------------------------------------- | ---- | ------------------ |
2358| shapeMask | [ShapeMask](./js-apis-arkui-graphics.md#shapemask12) | 是   | RenderNode的遮罩。 |
2359
2360get shapeMask(): ShapeMask
2361
2362获取当前RenderNode的遮罩。
2363
2364**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2365
2366**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2367
2368**返回值:**
2369
2370| 类型                                               | 说明                   |
2371| -------------------------------------------------- | ---------------------- |
2372| [ShapeMask](./js-apis-arkui-graphics.md#shapemask12) | RenderNode的边框遮罩。 |
2373
2374**示例:**
2375
2376```ts
2377import { RenderNode, FrameNode, NodeController, ShapeMask } from '@kit.ArkUI';
2378
2379const mask = new ShapeMask();
2380mask.setRectShape({ left: 0, right: 150, top: 0, bottom: 150 });
2381mask.fillColor = 0X55FF0000;
2382mask.strokeColor = 0XFFFF0000;
2383mask.strokeWidth = 24;
2384
2385const renderNode = new RenderNode();
2386renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2387renderNode.backgroundColor = 0XFF00FF00;
2388renderNode.shapeMask = mask;
2389const shapeMask = renderNode.shapeMask;
2390
2391
2392class MyNodeController extends NodeController {
2393  private rootNode: FrameNode | null = null;
2394
2395  makeNode(uiContext: UIContext): FrameNode | null {
2396    this.rootNode = new FrameNode(uiContext);
2397
2398    const rootRenderNode = this.rootNode.getRenderNode();
2399    if (rootRenderNode !== null) {
2400      rootRenderNode.appendChild(renderNode);
2401    }
2402
2403    return this.rootNode;
2404  }
2405}
2406
2407@Entry
2408@Component
2409struct Index {
2410  private myNodeController: MyNodeController = new MyNodeController();
2411
2412  build() {
2413    Row() {
2414      NodeContainer(this.myNodeController)
2415    }
2416  }
2417}
2418```
2419
2420### shapeClip<sup>12+</sup>
2421
2422set shapeClip(shapeClip: ShapeClip)
2423
2424设置当前RenderNode的裁剪形状。
2425
2426**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2427
2428**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2429
2430**参数:**
2431
2432| 参数名    | 类型                                               | 必填 | 说明               |
2433| --------- | -------------------------------------------------- | ---- | ------------------ |
2434| shapeClip | [ShapeClip](./js-apis-arkui-graphics.md#shapeclip12) | 是   | RenderNode的裁剪形状。 |
2435
2436get shapeClip(): ShapeClip
2437
2438获取当前RenderNode的裁剪形状。
2439
2440**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2441
2442**系统能力:** SystemCapability.ArkUI.ArkUI.clip
2443
2444**返回值:**
2445
2446| 类型                                               | 说明                   |
2447| -------------------------------------------------- | ---------------------- |
2448| [ShapeClip](./js-apis-arkui-graphics.md#shapeclip12) | RenderNode的裁剪形状。 |
2449
2450**示例:**
2451
2452```ts
2453import { RenderNode, FrameNode, NodeController, ShapeClip } from '@kit.ArkUI';
2454
2455const clip = new ShapeClip();
2456clip.setCommandPath({ commands: "M100 0 L0 100 L50 200 L150 200 L200 100 Z" });
2457
2458const renderNode = new RenderNode();
2459renderNode.frame = {
2460  x: 0,
2461  y: 0,
2462  width: 150,
2463  height: 150
2464};
2465renderNode.backgroundColor = 0XFF00FF00;
2466renderNode.shapeClip = clip;
2467const shapeClip = renderNode.shapeClip;
2468
2469class MyNodeController extends NodeController {
2470  private rootNode: FrameNode | null = null;
2471
2472  makeNode(uiContext: UIContext): FrameNode | null {
2473    this.rootNode = new FrameNode(uiContext);
2474
2475    const rootRenderNode = this.rootNode.getRenderNode();
2476    if (rootRenderNode !== null) {
2477      rootRenderNode.appendChild(renderNode);
2478    }
2479
2480    return this.rootNode;
2481  }
2482}
2483
2484@Entry
2485@Component
2486struct Index {
2487  private myNodeController: MyNodeController = new MyNodeController();
2488
2489  build() {
2490    Column() {
2491      NodeContainer(this.myNodeController)
2492        .borderWidth(1)
2493      Button("setRectShape")
2494        .onClick(() => {
2495          shapeClip.setRectShape({
2496            left: 0,
2497            right: 150,
2498            top: 0,
2499            bottom: 150
2500          });
2501          renderNode.shapeClip = shapeClip;
2502        })
2503      Button("setRoundRectShape")
2504        .onClick(() => {
2505          renderNode.shapeClip.setRoundRectShape({
2506            rect: {
2507              left: 0,
2508              top: 0,
2509              right: this.getUIContext().vp2px(150),
2510              bottom: this.getUIContext().vp2px(150)
2511            },
2512            corners: {
2513              topLeft: { x: 32, y: 32 },
2514              topRight: { x: 32, y: 32 },
2515              bottomLeft: { x: 32, y: 32 },
2516              bottomRight: { x: 32, y: 32 }
2517            }
2518          });
2519        })
2520      Button("setCircleShape")
2521        .onClick(() => {
2522          renderNode.shapeClip.setCircleShape({ centerY: 75, centerX: 75, radius: 75 });
2523
2524        })
2525      Button("setOvalShape")
2526        .onClick(() => {
2527          renderNode.shapeClip.setOvalShape({
2528            left: 0,
2529            right: this.getUIContext().vp2px(150),
2530            top: 0,
2531            bottom: this.getUIContext().vp2px(100)
2532          });
2533        })
2534      Button("setCommandPath")
2535        .onClick(() => {
2536          renderNode.shapeClip.setCommandPath({ commands: "M100 0 L0 100 L50 200 L150 200 L200 100 Z" });
2537        })
2538    }
2539  }
2540}
2541```
2542
2543### dispose<sup>12+</sup>
2544
2545dispose(): void
2546
2547立即释放当前RenderNode。
2548
2549**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2550
2551**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2552
2553**示例:**
2554
2555```ts
2556import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2557
2558const renderNode = new RenderNode();
2559renderNode.frame = { x: 0, y: 100, width: 100, height: 100 };
2560renderNode.backgroundColor = 0xffff0000;
2561
2562class MyNodeController extends NodeController {
2563  private rootNode: FrameNode | null = null;
2564
2565  makeNode(uiContext: UIContext): FrameNode | null {
2566    this.rootNode = new FrameNode(uiContext);
2567
2568    const rootRenderNode = this.rootNode!.getRenderNode();
2569    if (rootRenderNode !== null) {
2570      rootRenderNode.size = { width: 200, height: 200 };
2571      rootRenderNode.backgroundColor = 0xff00ff00;
2572      rootRenderNode.appendChild(renderNode);
2573    }
2574
2575    return this.rootNode;
2576  }
2577
2578  disposeRenderNode() {
2579    const rootRenderNode = this.rootNode!.getRenderNode();
2580    if (rootRenderNode !== null) {
2581      rootRenderNode.removeChild(renderNode);
2582    }
2583    renderNode.dispose();
2584  }
2585}
2586
2587@Entry
2588@Component
2589struct Index {
2590  private myNodeController: MyNodeController = new MyNodeController();
2591
2592  build() {
2593    Column({ space: 4 }) {
2594      NodeContainer(this.myNodeController)
2595      Button('RenderNode dispose')
2596        .onClick(() => {
2597          this.myNodeController.disposeRenderNode();
2598        })
2599        .width('100%')
2600    }
2601  }
2602}
2603```
2604
2605### markNodeGroup<sup>12+</sup>
2606
2607set markNodeGroup(isNodeGroup: boolean)
2608
2609标记是否优先绘制节点及其子节点。若设置为true,则透明度等属性将在节点绘制完毕后再进行合成。设置效果如下:
2610
2611![markNodeGroup](./figures/renderNode-markNodeGroup.png)
2612
2613**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2614
2615**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2616
2617**参数:**
2618
2619| 参数名    | 类型                                               | 必填 | 说明               |
2620| --------- | -------------------------------------------------- | ---- | ------------------ |
2621| isNodeGroup | boolean | 是   | 设置是否优先绘制节点及其子节点。<br/>true表示优先绘制节点及其子节点,false表示不是优先绘制节点及其子节点。 |
2622
2623get markNodeGroup(): boolean
2624
2625获取当前节点是否标记了优先绘制。
2626
2627**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2628
2629**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2630
2631**返回值:**
2632
2633| 类型    | 说明                                        |
2634| ------- | ------------------------------------------- |
2635| boolean | 当前节点是否标记了优先绘制。<br/>true表示当前节点标记了优先绘制,false表示当前节点没有标记优先绘制。<br/>默认值:false |
2636
2637**示例:**
2638
2639```ts
2640import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI';
2641import { drawing } from '@kit.ArkGraphics2D';
2642
2643class MyRenderNode extends RenderNode {
2644  draw(context: DrawContext) {
2645    const canvas = context.canvas;
2646    const brush = new drawing.Brush();
2647    brush.setColor({ alpha: 255, red: 255, green: 0, blue: 0 });
2648    canvas.attachBrush(brush);
2649    canvas.drawRect({ left: 0, right: 200, top: 0, bottom: 200 });
2650    canvas.detachBrush();
2651
2652    brush.setColor({ alpha: 255, red: 0, green: 255, blue: 0 });
2653    canvas.attachBrush(brush);
2654    canvas.drawRect({ left: 100, right: 300, top: 100, bottom: 300 });
2655    canvas.detachBrush();
2656  }
2657}
2658
2659const renderNode = new MyRenderNode();
2660renderNode.frame = { x: 100, y: 100, width: 200, height: 200 };
2661renderNode.backgroundColor = 0xff0000ff;
2662renderNode.markNodeGroup = true;
2663renderNode.opacity = 0.5;
2664
2665const isNodeGroup = renderNode.markNodeGroup;
2666
2667class MyNodeController extends NodeController {
2668  private rootNode: FrameNode | null = null;
2669
2670  makeNode(uiContext: UIContext): FrameNode | null {
2671    this.rootNode = new FrameNode(uiContext);
2672
2673    const rootRenderNode = this.rootNode.getRenderNode();
2674    if (rootRenderNode !== null) {
2675      rootRenderNode.appendChild(renderNode);
2676    }
2677
2678    return this.rootNode;
2679  }
2680}
2681
2682@Entry
2683@Component
2684struct Index {
2685  private myNodeController: MyNodeController = new MyNodeController();
2686
2687  build() {
2688    Row() {
2689      NodeContainer(this.myNodeController)
2690    }
2691  }
2692}
2693```
2694
2695### lengthMetricsUnit<sup>12+</sup>
2696
2697set lengthMetricsUnit(unit: LengthMetricsUnit)
2698
2699设置RenderNode各个属性使用的单位。
2700
2701**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2702
2703**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2704
2705**参数:**
2706
2707| 参数名 | 类型                                                                 | 必填 | 说明                               |
2708| ------ | -------------------------------------------------------------------- | ---- | ---------------------------------- |
2709| unit   | [LengthMetricsUnit](./js-apis-arkui-graphics.md#lengthmetricsunit12) | 是   | 设置RenderNode各个属性使用的单位。 |
2710
2711get lengthMetricsUnit(): LengthMetricsUnit
2712
2713获取RenderNode各个属性使用的单位。
2714
2715**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2716
2717**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2718
2719**返回值:**
2720
2721| 类型    | 说明                                        |
2722| ------- | ------------------------------------------- |
2723| [LengthMetricsUnit](./js-apis-arkui-graphics.md#lengthmetricsunit12) | 获取RenderNode各个属性使用的单位,默认值为LengthMetricsUnit.DEFAULT。 |
2724
2725**示例:**
2726
2727```ts
2728import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI';
2729import { drawing } from '@kit.ArkGraphics2D';
2730import { LengthMetricsUnit } from '@ohos.arkui.node';
2731
2732class BaseRenderNode extends RenderNode {
2733  constructor() {
2734    super();
2735    this.lengthMetricsUnit = LengthMetricsUnit.PX;
2736  }
2737}
2738
2739class MyRenderNode extends BaseRenderNode {
2740  draw(context: DrawContext) {
2741    const canvas = context.canvas;
2742    const brush = new drawing.Brush();
2743    brush.setColor({ alpha: 255, red: 255, green: 0, blue: 0 });
2744    canvas.attachBrush(brush);
2745    canvas.drawRect({ left: 0, right: 200, top: 0, bottom: 200 });
2746    canvas.detachBrush();
2747  }
2748}
2749
2750const renderNode = new MyRenderNode();
2751renderNode.frame = { x: 100, y: 100, width: 200, height: 200 };
2752renderNode.backgroundColor = 0xff0000ff;
2753renderNode.rotation = { x: 0, y: 0, z: 45 };
2754
2755class MyNodeController extends NodeController {
2756  private rootNode: FrameNode | null = null;
2757
2758  makeNode(uiContext: UIContext): FrameNode | null {
2759    this.rootNode = new FrameNode(uiContext);
2760    const rootRenderNode = this.rootNode.getRenderNode();
2761    if (rootRenderNode !== null) {
2762      rootRenderNode.appendChild(renderNode);
2763    }
2764    return this.rootNode;
2765  }
2766}
2767
2768@Entry
2769@Component
2770struct Index {
2771  private myNodeController: MyNodeController = new MyNodeController();
2772
2773  build() {
2774    Row() {
2775      NodeContainer(this.myNodeController)
2776    }
2777  }
2778}
2779```
2780
2781### isDisposed<sup>20+</sup>
2782
2783isDisposed(): boolean
2784
2785查询当前RenderNode对象是否已解除与后端实体节点的引用关系。前端节点均绑定有相应的后端实体节点,当节点调用dispose接口解除绑定后,再次调用接口可能会出现crash、返回默认值的情况。由于业务需求,可能存在节点在dispose后仍被调用接口的情况。为此,提供此接口以供开发者在操作节点前检查其有效性,避免潜在风险。
2786
2787**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
2788
2789**系统能力:** SystemCapability.ArkUI.ArkUI.Full
2790
2791**返回值:**
2792
2793| 类型    | 说明               |
2794| ------- | ------------------ |
2795| boolean | 后端实体节点是否解除引用。true为节点已与后端实体节点解除引用,false为节点未与后端实体节点解除引用。
2796
2797**示例:**
2798
2799```ts
2800import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2801
2802const renderNode = new RenderNode();
2803renderNode.frame = { x: 100, y: 100, width: 100, height: 100 };
2804renderNode.backgroundColor = 0xff2787d9;
2805
2806class MyNodeController extends NodeController {
2807  private rootNode: FrameNode | null = null;
2808
2809  makeNode(uiContext: UIContext): FrameNode | null {
2810    this.rootNode = new FrameNode(uiContext);
2811
2812    const rootRenderNode = this.rootNode!.getRenderNode();
2813    if (rootRenderNode !== null) {
2814      rootRenderNode.size = { width: 300, height: 300 };
2815      rootRenderNode.backgroundColor = 0xffd5d5d5;
2816      rootRenderNode.appendChild(renderNode);
2817    }
2818
2819    return this.rootNode;
2820  }
2821
2822  disposeRenderNode() {
2823    const rootRenderNode = this.rootNode!.getRenderNode();
2824    if (rootRenderNode !== null) {
2825      rootRenderNode.removeChild(renderNode);
2826    }
2827    renderNode.dispose();
2828  }
2829
2830  isDisposed() : string {
2831    if (renderNode !== null) {
2832      if (renderNode.isDisposed()) {
2833        return 'renderNode isDisposed is true';
2834      }
2835      else {
2836        return 'renderNode isDisposed is false';
2837      }
2838    }
2839    return 'renderNode is null';
2840  }
2841}
2842
2843@Entry
2844@Component
2845struct Index {
2846  @State text: string = ''
2847  private myNodeController: MyNodeController = new MyNodeController();
2848
2849  build() {
2850    Column({ space: 4 }) {
2851      NodeContainer(this.myNodeController)
2852      Button('RenderNode dispose')
2853        .onClick(() => {
2854          this.myNodeController.disposeRenderNode();
2855          this.text = '';
2856        })
2857        .width(200)
2858        .height(50)
2859      Button('RenderNode isDisposed')
2860        .onClick(() => {
2861          this.text = this.myNodeController.isDisposed();
2862        })
2863        .width(200)
2864        .height(50)
2865      Text(this.text)
2866        .fontSize(25)
2867    }
2868    .width('100%')
2869    .height('100%')
2870  }
2871}
2872```
2873
2874![](figures/RenderNode_isDisposed.gif)