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