• 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> You are not advised to modify 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 fist child is null');
452          } else {
453            console.log(`the position of fist 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.|
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**.|
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.|
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.|
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.|
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**.|
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.|
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**.|
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  draw(context: DrawContext) {
1827    // The width and height in the context need to be converted from vp to px.
1828    bridge.nativeOnDraw(0, context, vp2px(context.size.height), vp2px(context.size.width));
1829  }
1830}
1831
1832class MyNodeController extends NodeController {
1833  private rootNode: FrameNode | null = null;
1834
1835  makeNode(uiContext: UIContext): FrameNode | null {
1836    this.rootNode = new FrameNode(uiContext);
1837
1838    const rootRenderNode = this.rootNode.getRenderNode();
1839    if (rootRenderNode !== null) {
1840      const renderNode = new MyRenderNode();
1841      renderNode.size = { width: 100, height: 100 }
1842      rootRenderNode.appendChild(renderNode);
1843    }
1844
1845    return this.rootNode;
1846  }
1847}
1848
1849@Entry
1850@Component
1851struct Index {
1852  private myNodeController: MyNodeController = new MyNodeController();
1853  build() {
1854    Row() {
1855      NodeContainer(this.myNodeController)
1856    }
1857  }
1858}
1859```
1860
1861The C++ side can obtain the canvas through the Node-API and perform subsequent custom drawing operations.
1862
1863```c++
1864// native_bridge.cpp
1865#include "napi/native_api.h"
1866#include <native_drawing/drawing_canvas.h>
1867#include <native_drawing/drawing_color.h>
1868#include <native_drawing/drawing_path.h>
1869#include <native_drawing/drawing_pen.h>
1870
1871static napi_value OnDraw(napi_env env, napi_callback_info info)
1872{
1873    size_t argc = 4;
1874    napi_value args[4] = { nullptr };
1875    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
1876
1877    int32_t id;
1878    napi_get_value_int32(env, args[0], &id);
1879
1880    // Obtain the pointer to the canvas.
1881    void* temp = nullptr;
1882    napi_unwrap(env, args[1], &temp);
1883    OH_Drawing_Canvas *canvas = reinterpret_cast<OH_Drawing_Canvas*>(temp);
1884
1885    // Obtain the canvas width.
1886    int32_t width;
1887    napi_get_value_int32(env, args[2], &width);
1888
1889    // Obtain the canvas height.
1890    int32_t height;
1891    napi_get_value_int32(env, args[3], &height);
1892
1893    // Pass in information such as the canvas, height, and width to the drawing API for custom drawing.
1894    auto path = OH_Drawing_PathCreate();
1895    OH_Drawing_PathMoveTo(path, width / 4, height / 4);
1896    OH_Drawing_PathLineTo(path, width * 3 / 4, height / 4);
1897    OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4);
1898    OH_Drawing_PathLineTo(path, width / 4, height * 3 / 4);
1899    OH_Drawing_PathLineTo(path, width / 4, height / 4);
1900    OH_Drawing_PathClose(path);
1901
1902    auto pen = OH_Drawing_PenCreate();
1903    OH_Drawing_PenSetWidth(pen, 10);
1904    OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));
1905    OH_Drawing_CanvasAttachPen(canvas, pen);
1906
1907    OH_Drawing_CanvasDrawPath(canvas, path);
1908
1909    return nullptr;
1910}
1911
1912EXTERN_C_START
1913static napi_value Init(napi_env env, napi_value exports)
1914{
1915    napi_property_descriptor desc[] = {
1916        { "nativeOnDraw", nullptr, OnDraw, nullptr, nullptr, nullptr, napi_default, nullptr }
1917    };
1918    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
1919    return exports;
1920}
1921EXTERN_C_END
1922
1923static napi_module demoModule = {
1924    .nm_version =1,
1925    .nm_flags = 0,
1926    .nm_filename = nullptr,
1927    .nm_register_func = Init,
1928    .nm_modname = "entry",
1929    .nm_priv = ((void*)0),
1930    .reserved = { 0 },
1931};
1932
1933extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
1934{
1935    napi_module_register(&demoModule);
1936}
1937```
1938
1939Add the following content to the **src/main/cpp/CMakeLists.txt** file of the project:
1940
1941<!--code_no_check-->
1942
1943```cmake
1944# the minimum version of CMake.
1945cmake_minimum_required(VERSION 3.4.1)
1946project(NapiTest)
1947
1948set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
1949
1950include_directories(${NATIVERENDER_ROOT_PATH}
1951                    ${NATIVERENDER_ROOT_PATH}/include)
1952
1953add_library(entry SHARED native_bridge.cpp)
1954target_link_libraries(entry PUBLIC libace_napi.z.so)
1955target_link_libraries(entry PUBLIC libace_ndk.z.so)
1956target_link_libraries(entry PUBLIC libnative_drawing.so)
1957```
1958
1959In 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:
1960
1961<!--code_no_check-->
1962
1963```ts
1964import { DrawContext } from '@kit.ArkUI';
1965
1966export const nativeOnDraw: (id: number, context: DrawContext, width: number, height: number) => number;
1967```
1968
1969### invalidate
1970
1971invalidate(): void
1972
1973Triggers the re-rendering of this RenderNode.
1974
1975**Atomic service API**: This API can be used in atomic services since API version 12.
1976
1977**System capability**: SystemCapability.ArkUI.ArkUI.Full
1978
1979**Example**
1980
1981```ts
1982import bridge from "libentry.so" // This .so file is compiled and generated by you using the Node-API.
1983import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI';
1984
1985class MyRenderNode extends RenderNode {
1986  draw(context: DrawContext) {
1987    // The width and height in the context need to be converted from vp to px.
1988    bridge.nativeOnDraw(0, context, vp2px(context.size.height), vp2px(context.size.width));
1989  }
1990}
1991
1992const newNode = new MyRenderNode();
1993newNode.size = { width: 100, height: 100 };
1994
1995class MyNodeController extends NodeController {
1996  private rootNode: FrameNode | null = null;
1997
1998  makeNode(uiContext: UIContext): FrameNode | null {
1999    this.rootNode = new FrameNode(uiContext);
2000    const renderNode = this.rootNode.getRenderNode();
2001    if (renderNode === null) {
2002      return this.rootNode;
2003    }
2004    renderNode.appendChild(newNode);
2005    return this.rootNode;
2006  }
2007}
2008
2009@Entry
2010@Component
2011struct Index {
2012  build() {
2013    Column() {
2014      Column() {
2015        NodeContainer(new MyNodeController())
2016          .width('100%')
2017        Button('Invalidate')
2018          .onClick(() => {
2019            newNode.invalidate()
2020          })
2021      }
2022      .width('100%')
2023      .height('100%')
2024    }
2025    .height('100%')
2026  }
2027}
2028```
2029
2030For details about how to build **libentry.so**, see the example of the **draw** API.
2031
2032### borderStyle<sup>12+</sup>
2033
2034set borderStyle(style: Edges\<BorderStyle>)
2035
2036Sets the border style for this RenderNode.
2037
2038**Atomic service API**: This API can be used in atomic services since API version 12.
2039
2040**System capability**: SystemCapability.ArkUI.ArkUI.Full
2041
2042**Parameters**
2043
2044| Name| Type                                                                                                  | Mandatory| Description                  |
2045| ------ | ------------------------------------------------------------------------------------------------------ | ---- | ---------------------- |
2046| style  | [Edges](./js-apis-arkui-graphics.md#edgest12)<[BorderStyle](./arkui-ts/ts-appendix-enums.md#borderstyle)> | Yes  | Border style of the RenderNode.|
2047
2048get borderStyle(): Edges\<BorderStyle>
2049
2050Obtains the border style of this RenderNode.
2051
2052**Atomic service API**: This API can be used in atomic services since API version 12.
2053
2054**System capability**: SystemCapability.ArkUI.ArkUI.Full
2055
2056**Return value**
2057
2058| Type                                                                                                  | Description                  |
2059| ------------------------------------------------------------------------------------------------------ | ---------------------- |
2060| [Edges](./js-apis-arkui-graphics.md#edgest12)<[BorderStyle](./arkui-ts/ts-appendix-enums.md#borderstyle)> | Border style of the RenderNode.|
2061
2062**Example**
2063```ts
2064import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2065
2066const renderNode = new RenderNode();
2067renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2068renderNode.backgroundColor = 0XFF00FF00;
2069renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 };
2070renderNode.borderStyle = {
2071  left: BorderStyle.Solid,
2072  top: BorderStyle.Dotted,
2073  right: BorderStyle.Dashed,
2074  bottom: BorderStyle.Solid
2075}
2076const borderStyle = renderNode.borderStyle;
2077
2078
2079class MyNodeController extends NodeController {
2080  private rootNode: FrameNode | null = null;
2081
2082  makeNode(uiContext: UIContext): FrameNode | null {
2083    this.rootNode = new FrameNode(uiContext);
2084
2085    const rootRenderNode = this.rootNode.getRenderNode();
2086    if (rootRenderNode !== null) {
2087      rootRenderNode.appendChild(renderNode);
2088    }
2089
2090    return this.rootNode;
2091  }
2092}
2093
2094@Entry
2095@Component
2096struct Index {
2097  private myNodeController: MyNodeController = new MyNodeController();
2098
2099  build() {
2100    Row() {
2101      NodeContainer(this.myNodeController)
2102    }
2103  }
2104}
2105```
2106
2107### borderWidth<sup>12+</sup>
2108
2109set borderWidth(width: Edges\<number>)
2110
2111Sets the border width for this RenderNode.
2112
2113**Atomic service API**: This API can be used in atomic services since API version 12.
2114
2115**System capability**: SystemCapability.ArkUI.ArkUI.Full
2116
2117**Parameters**
2118
2119| Name| Type                                               | Mandatory| Description                  |
2120| ------ | --------------------------------------------------- | ---- | ---------------------- |
2121| width  | [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | Yes  | Border width of the RenderNode, in vp.|
2122
2123get borderWidth(): Edges\<number>
2124
2125Obtains the border width of this RenderNode.
2126
2127**Atomic service API**: This API can be used in atomic services since API version 12.
2128
2129**System capability**: SystemCapability.ArkUI.ArkUI.Full
2130
2131**Return value**
2132
2133| Type                                               | Description                  |
2134| --------------------------------------------------- | ---------------------- |
2135| [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | Border width of the RenderNode. The default width of all borders is 0 vp.|
2136
2137**Example**
2138
2139```ts
2140import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2141
2142const renderNode = new RenderNode();
2143renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2144renderNode.backgroundColor = 0XFF00FF00;
2145renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 };
2146const borderWidth = renderNode.borderWidth;
2147
2148
2149class MyNodeController extends NodeController {
2150  private rootNode: FrameNode | null = null;
2151
2152  makeNode(uiContext: UIContext): FrameNode | null {
2153    this.rootNode = new FrameNode(uiContext);
2154
2155    const rootRenderNode = this.rootNode.getRenderNode();
2156    if (rootRenderNode !== null) {
2157      rootRenderNode.appendChild(renderNode);
2158    }
2159
2160    return this.rootNode;
2161  }
2162}
2163
2164@Entry
2165@Component
2166struct Index {
2167  private myNodeController: MyNodeController = new MyNodeController();
2168
2169  build() {
2170    Row() {
2171      NodeContainer(this.myNodeController)
2172    }
2173  }
2174}
2175```
2176
2177### borderColor<sup>12+</sup>
2178
2179set borderColor(color: Edges\<number>)
2180
2181Sets the border color for this RenderNode.
2182
2183**Atomic service API**: This API can be used in atomic services since API version 12.
2184
2185**System capability**: SystemCapability.ArkUI.ArkUI.Full
2186
2187**Parameters**
2188
2189| Name| Type                                               | Mandatory| Description                  |
2190| ------ | --------------------------------------------------- | ---- | ---------------------- |
2191| color  | [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | Yes  | Border color of the RenderNode.|
2192
2193get borderColor(): Edges\<number>
2194
2195Obtains the border color of this RenderNode.
2196
2197**Atomic service API**: This API can be used in atomic services since API version 12.
2198
2199**System capability**: SystemCapability.ArkUI.ArkUI.Full
2200
2201**Return value**
2202
2203| Type                                               | Description                  |
2204| --------------------------------------------------- | ---------------------- |
2205| [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | Border color of the RenderNode. By default, the color of all borders is 0XFF000000.|
2206
2207**Example**
2208
2209```ts
2210import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2211
2212const renderNode = new RenderNode();
2213renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2214renderNode.backgroundColor = 0XFF00FF00;
2215renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 };
2216renderNode.borderColor = { left: 0xFF0000FF, top: 0xFF0000FF, right: 0xFF0000FF, bottom: 0xFF0000FF };
2217const borderColor = renderNode.borderColor;
2218
2219
2220class MyNodeController extends NodeController {
2221  private rootNode: FrameNode | null = null;
2222
2223  makeNode(uiContext: UIContext): FrameNode | null {
2224    this.rootNode = new FrameNode(uiContext);
2225
2226    const rootRenderNode = this.rootNode.getRenderNode();
2227    if (rootRenderNode !== null) {
2228      rootRenderNode.appendChild(renderNode);
2229    }
2230
2231    return this.rootNode;
2232  }
2233}
2234
2235@Entry
2236@Component
2237struct Index {
2238  private myNodeController: MyNodeController = new MyNodeController();
2239
2240  build() {
2241    Row() {
2242      NodeContainer(this.myNodeController)
2243    }
2244  }
2245}
2246```
2247
2248### borderRadius<sup>12+</sup>
2249
2250set borderRadius(radius: BorderRadiuses)
2251
2252Sets the border corner radius for this RenderNode.
2253
2254**Atomic service API**: This API can be used in atomic services since API version 12.
2255
2256**System capability**: SystemCapability.ArkUI.ArkUI.Full
2257
2258**Parameters**
2259
2260| Name| Type                                                        | Mandatory| Description                  |
2261| ------ | ------------------------------------------------------------ | ---- | ---------------------- |
2262| radius | [BorderRadiuses](./js-apis-arkui-graphics.md#borderradiuses12) | Yes  | Border corner radius of the RenderNode, in vp.|
2263
2264
2265get borderRadius(): BorderRadiuses
2266
2267Obtains the border corner radius of this RenderNode.
2268
2269**Atomic service API**: This API can be used in atomic services since API version 12.
2270
2271**System capability**: SystemCapability.ArkUI.ArkUI.Full
2272
2273**Return value**
2274
2275| Type                                                        | Description                  |
2276| ------------------------------------------------------------ | ---------------------- |
2277| [BorderRadiuses](./js-apis-arkui-graphics.md#borderradiuses12) | Border corner radius of the RenderNode. By default, the corner radius of all borders is 0 vp.|
2278
2279**Example**
2280
2281```ts
2282import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2283
2284const renderNode = new RenderNode();
2285renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2286renderNode.backgroundColor = 0XFF00FF00;
2287renderNode.borderRadius = { topLeft: 32, topRight: 32, bottomLeft: 32, bottomRight: 32 };
2288const borderRadius = renderNode.borderRadius;
2289
2290
2291class MyNodeController extends NodeController {
2292  private rootNode: FrameNode | null = null;
2293
2294  makeNode(uiContext: UIContext): FrameNode | null {
2295    this.rootNode = new FrameNode(uiContext);
2296
2297    const rootRenderNode = this.rootNode.getRenderNode();
2298    if (rootRenderNode !== null) {
2299      rootRenderNode.appendChild(renderNode);
2300    }
2301
2302    return this.rootNode;
2303  }
2304}
2305
2306@Entry
2307@Component
2308struct Index {
2309  private myNodeController: MyNodeController = new MyNodeController();
2310
2311  build() {
2312    Row() {
2313      NodeContainer(this.myNodeController)
2314    }
2315  }
2316}
2317```
2318
2319### shapeMask<sup>12+</sup>
2320
2321set shapeMask(shapeMask: ShapeMask)
2322
2323Sets the mask for this RenderNode.
2324
2325**Atomic service API**: This API can be used in atomic services since API version 12.
2326
2327**System capability**: SystemCapability.ArkUI.ArkUI.Full
2328
2329**Parameters**
2330
2331| Name   | Type                                              | Mandatory| Description              |
2332| --------- | -------------------------------------------------- | ---- | ------------------ |
2333| shapeMask | [ShapeMask](./js-apis-arkui-graphics.md#shapemask12) | Yes  | Shape mask of the RenderNode.|
2334
2335get shapeMask(): ShapeMask
2336
2337Obtains the shape mask of this RenderNode.
2338
2339**System capability**: SystemCapability.ArkUI.ArkUI.Full
2340
2341**Return value**
2342
2343| Type                                              | Description                  |
2344| -------------------------------------------------- | ---------------------- |
2345| [ShapeMask](./js-apis-arkui-graphics.md#shapemask12) | Shape mask of the RenderNode.|
2346
2347**Example**
2348
2349```ts
2350import { RenderNode, FrameNode, NodeController, ShapeMask } from '@kit.ArkUI';
2351
2352const mask = new ShapeMask();
2353mask.setRectShape({ left: 0, right: 150, top: 0, bottom: 150 });
2354mask.fillColor = 0X55FF0000;
2355mask.strokeColor = 0XFFFF0000;
2356mask.strokeWidth = 24;
2357
2358const renderNode = new RenderNode();
2359renderNode.frame = { x: 0, y: 0, width: 150, height: 150 };
2360renderNode.backgroundColor = 0XFF00FF00;
2361renderNode.shapeMask = mask;
2362const shapeMask = renderNode.shapeMask;
2363
2364
2365class MyNodeController extends NodeController {
2366  private rootNode: FrameNode | null = null;
2367
2368  makeNode(uiContext: UIContext): FrameNode | null {
2369    this.rootNode = new FrameNode(uiContext);
2370
2371    const rootRenderNode = this.rootNode.getRenderNode();
2372    if (rootRenderNode !== null) {
2373      rootRenderNode.appendChild(renderNode);
2374    }
2375
2376    return this.rootNode;
2377  }
2378}
2379
2380@Entry
2381@Component
2382struct Index {
2383  private myNodeController: MyNodeController = new MyNodeController();
2384
2385  build() {
2386    Row() {
2387      NodeContainer(this.myNodeController)
2388    }
2389  }
2390}
2391```
2392
2393### shapeClip<sup>12+</sup>
2394
2395set shapeClip(shapeClip: ShapeClip)
2396
2397Sets the clipping shape for this RenderNode.
2398
2399**Atomic service API**: This API can be used in atomic services since API version 12.
2400
2401**System capability**: SystemCapability.ArkUI.ArkUI.Full
2402
2403**Parameters**
2404
2405| Name   | Type                                              | Mandatory| Description              |
2406| --------- | -------------------------------------------------- | ---- | ------------------ |
2407| shapeClip | [ShapeClip](./js-apis-arkui-graphics.md#shapeclip12) | Yes  | Clipping shape of the RenderNode.|
2408
2409get shapeClip(): ShapeClip
2410
2411Obtains the clipping shape for this RenderNode.
2412
2413**Atomic service API**: This API can be used in atomic services since API version 12.
2414
2415**System capability**: SystemCapability.ArkUI.ArkUI.Full
2416
2417**Return value**
2418
2419| Type                                              | Description                  |
2420| -------------------------------------------------- | ---------------------- |
2421| [ShapeClip](./js-apis-arkui-graphics.md#shapeclip12) | Clipping shape of the RenderNode.|
2422
2423**Example**
2424
2425```ts
2426import { RenderNode, FrameNode, NodeController, ShapeMask, ShapeClip } from '@kit.ArkUI';
2427
2428const clip = new ShapeClip();
2429clip.setCommandPath({ commands: "M100 0 L0 100 L50 200 L150 200 L200 100 Z" });
2430
2431const renderNode = new RenderNode();
2432renderNode.frame = {
2433  x: 0,
2434  y: 0,
2435  width: 150,
2436  height: 150
2437};
2438renderNode.backgroundColor = 0XFF00FF00;
2439renderNode.shapeClip = clip;
2440const shapeClip = renderNode.shapeClip;
2441
2442class MyNodeController extends NodeController {
2443  private rootNode: FrameNode | null = null;
2444
2445  makeNode(uiContext: UIContext): FrameNode | null {
2446    this.rootNode = new FrameNode(uiContext);
2447
2448    const rootRenderNode = this.rootNode.getRenderNode();
2449    if (rootRenderNode !== null) {
2450      rootRenderNode.appendChild(renderNode);
2451    }
2452
2453    return this.rootNode;
2454  }
2455}
2456
2457@Entry
2458@Component
2459struct Index {
2460  private myNodeController: MyNodeController = new MyNodeController();
2461
2462  build() {
2463    Column() {
2464      NodeContainer(this.myNodeController)
2465        .borderWidth(1)
2466      Button("setRectShape")
2467        .onClick(() => {
2468          shapeClip.setRectShape({
2469            left: 0,
2470            right: 150,
2471            top: 0,
2472            bottom: 150
2473          });
2474          renderNode.shapeClip = shapeClip;
2475        })
2476      Button("setRoundRectShape")
2477        .onClick(() => {
2478          renderNode.shapeClip.setRoundRectShape({
2479            rect: {
2480              left: 0,
2481              top: 0,
2482              right: vp2px(150),
2483              bottom: vp2px(150)
2484            },
2485            corners: {
2486              topLeft: { x: 32, y: 32 },
2487              topRight: { x: 32, y: 32 },
2488              bottomLeft: { x: 32, y: 32 },
2489              bottomRight: { x: 32, y: 32 }
2490            }
2491          });
2492          renderNode.shapeClip = renderNode.shapeClip;
2493        })
2494      Button("setCircleShape")
2495        .onClick(() => {
2496          renderNode.shapeClip.setCircleShape({ centerY: 75, centerX: 75, radius: 75 });
2497          renderNode.shapeClip = renderNode.shapeClip;
2498
2499        })
2500      Button("setOvalShape")
2501        .onClick(() => {
2502          renderNode.shapeClip.setOvalShape({
2503            left: 0,
2504            right: vp2px(150),
2505            top: 0,
2506            bottom: vp2px(100)
2507          });
2508          renderNode.shapeClip = renderNode.shapeClip;
2509        })
2510      Button("setCommandPath")
2511        .onClick(() => {
2512          renderNode.shapeClip.setCommandPath({ commands: "M100 0 L0 100 L50 200 L150 200 L200 100 Z" });
2513          renderNode.shapeClip = renderNode.shapeClip;
2514        })
2515    }
2516  }
2517}
2518```
2519
2520### dispose<sup>12+</sup>
2521
2522dispose(): void
2523
2524Releases this RenderNode immediately.
2525
2526**Atomic service API**: This API can be used in atomic services since API version 12.
2527
2528**System capability**: SystemCapability.ArkUI.ArkUI.Full
2529
2530**Example**
2531
2532```ts
2533import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI';
2534
2535const renderNode = new RenderNode();
2536renderNode.frame = { x: 0, y: 100, width: 100, height: 100 };
2537renderNode.backgroundColor = 0xffff0000;
2538
2539class MyNodeController extends NodeController {
2540  private rootNode: FrameNode | null = null;
2541
2542  makeNode(uiContext: UIContext): FrameNode | null {
2543    this.rootNode = new FrameNode(uiContext);
2544
2545    const rootRenderNode = this.rootNode!.getRenderNode();
2546    if (rootRenderNode !== null) {
2547      rootRenderNode.size = { width: 200, height: 200 };
2548      rootRenderNode.backgroundColor = 0xff00ff00;
2549      rootRenderNode.appendChild(renderNode);
2550    }
2551
2552    return this.rootNode;
2553  }
2554
2555  disposeRenderNode() {
2556    const rootRenderNode = this.rootNode!.getRenderNode();
2557    if (rootRenderNode !== null) {
2558      rootRenderNode.removeChild(renderNode);
2559    }
2560    renderNode.dispose();
2561  }
2562}
2563
2564@Entry
2565@Component
2566struct Index {
2567  private myNodeController: MyNodeController = new MyNodeController();
2568
2569  build() {
2570    Column({ space: 4 }) {
2571      NodeContainer(this.myNodeController)
2572      Button('RenderNode dispose')
2573        .onClick(() => {
2574          this.myNodeController.disposeRenderNode();
2575        })
2576        .width('100%')
2577    }
2578  }
2579}
2580```
2581
2582### markNodeGroup<sup>12+</sup>
2583
2584set markNodeGroup(isNodeGroup: boolean)
2585
2586Sets 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.
2587
2588![markNodeGroup](./figures/renderNode-markNodeGroup.png)
2589
2590**Atomic service API**: This API can be used in atomic services since API version 12.
2591
2592**System capability**: SystemCapability.ArkUI.ArkUI.Full
2593
2594**Parameters**
2595
2596| Name   | Type                                              | Mandatory| Description              |
2597| --------- | -------------------------------------------------- | ---- | ------------------ |
2598| 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.|
2599
2600get markNodeGroup(): boolean
2601
2602Obtains whether to prioritize the drawing of this RenderNode and its childe nodes.
2603
2604**System capability**: SystemCapability.ArkUI.ArkUI.Full
2605
2606**Return value**
2607
2608| Type   | Description                                       |
2609| ------- | ------------------------------------------- |
2610| 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**|
2611
2612**Example**
2613
2614```ts
2615import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI';
2616import { drawing } from '@kit.ArkGraphics2D';
2617
2618class MyRenderNode extends RenderNode {
2619  draw(context: DrawContext) {
2620    const canvas = context.canvas;
2621    const brush = new drawing.Brush();
2622    brush.setColor({ alpha: 255, red: 255, green: 0, blue: 0 });
2623    canvas.attachBrush(brush);
2624    canvas.drawRect({ left: 0, right: 200, top: 0, bottom: 200 });
2625    canvas.detachBrush();
2626
2627    brush.setColor({ alpha: 255, red: 0, green: 255, blue: 0 });
2628    canvas.attachBrush(brush);
2629    canvas.drawRect({ left: 100, right: 300, top: 100, bottom: 300 });
2630    canvas.detachBrush();
2631  }
2632}
2633
2634const renderNode = new MyRenderNode();
2635renderNode.frame = { x: 100, y: 100, width: 200, height: 200 };
2636renderNode.backgroundColor = 0xff0000ff;
2637renderNode.markNodeGroup = true;
2638renderNode.opacity = 0.5;
2639
2640const isNodeGroup = renderNode.markNodeGroup;
2641
2642class MyNodeController extends NodeController {
2643  private rootNode: FrameNode | null = null;
2644
2645  makeNode(uiContext: UIContext): FrameNode | null {
2646    this.rootNode = new FrameNode(uiContext);
2647
2648    const rootRenderNode = this.rootNode.getRenderNode();
2649    if (rootRenderNode !== null) {
2650      rootRenderNode.appendChild(renderNode);
2651    }
2652
2653    return this.rootNode;
2654  }
2655}
2656
2657@Entry
2658@Component
2659struct Index {
2660  private myNodeController: MyNodeController = new MyNodeController();
2661
2662  build() {
2663    Row() {
2664      NodeContainer(this.myNodeController)
2665    }
2666  }
2667}
2668```
2669
2670### lengthMetricsUnit<sup>12+</sup>
2671
2672set lengthMetricsUnit(unit: LengthMetricsUnit)
2673
2674Sets the metric unit used by attributes of this RenderNode.
2675
2676**Atomic service API**: This API can be used in atomic services since API version 12.
2677
2678**System capability**: SystemCapability.ArkUI.ArkUI.Full
2679
2680**Parameters**
2681
2682| Name| Type                                                                | Mandatory| Description                              |
2683| ------ | -------------------------------------------------------------------- | ---- | ---------------------------------- |
2684| unit   | [LengthMetricsUnit](./js-apis-arkui-graphics.md#lengthmetricsunit12) | Yes  | Metric unit used by attributes of the current RenderNode.|
2685
2686get lengthMetricsUnit(): LengthMetricsUnit
2687
2688Obtains the metric unit used by attributes of this RenderNode.
2689
2690**System capability**: SystemCapability.ArkUI.ArkUI.Full
2691
2692**Return value**
2693
2694| Type   | Description                                       |
2695| ------- | ------------------------------------------- |
2696| [LengthMetricsUnit](./js-apis-arkui-graphics.md#lengthmetricsunit12) | Metric unit used by attributes of this RenderNode. The default value is **LengthMetricsUnit.DEFAULT**.|
2697
2698**Example**
2699
2700```ts
2701import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI';
2702import { drawing } from '@kit.ArkGraphics2D';
2703import { LengthMetricsUnit } from '@ohos.arkui.node';
2704
2705class BaseRenderNode extends RenderNode {
2706  constructor() {
2707    super();
2708    this.lengthMetricsUnit = LengthMetricsUnit.PX;
2709  }
2710}
2711
2712class MyRenderNode extends BaseRenderNode {
2713  draw(context: DrawContext) {
2714    const canvas = context.canvas;
2715    const brush = new drawing.Brush();
2716    brush.setColor({ alpha: 255, red: 255, green: 0, blue: 0 });
2717    canvas.attachBrush(brush);
2718    canvas.drawRect({ left: 0, right: 200, top: 0, bottom: 200 });
2719    canvas.detachBrush();
2720  }
2721}
2722
2723const renderNode = new MyRenderNode();
2724renderNode.frame = { x: 100, y: 100, width: 200, height: 200 };
2725renderNode.backgroundColor = 0xff0000ff;
2726renderNode.rotation = { x: 0, y: 0, z: 45 };
2727
2728class MyNodeController extends NodeController {
2729  private rootNode: FrameNode | null = null;
2730
2731  makeNode(uiContext: UIContext): FrameNode | null {
2732    this.rootNode = new FrameNode(uiContext);
2733    const rootRenderNode = this.rootNode.getRenderNode();
2734    if (rootRenderNode !== null) {
2735      rootRenderNode.appendChild(renderNode);
2736    }
2737    return this.rootNode;
2738  }
2739}
2740
2741@Entry
2742@Component
2743struct Index {
2744  private myNodeController: MyNodeController = new MyNodeController();
2745
2746  build() {
2747    Row() {
2748      NodeContainer(this.myNodeController)
2749    }
2750  }
2751}
2752```
2753