• 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## Modules to Import
12
13```ts
14import { RenderNode } from "@ohos.arkui.node";
15```
16
17## RenderNode
18
19### constructor
20
21constructor()
22
23Constructor used to create a RenderNode.
24
25**System capability**: SystemCapability.ArkUI.ArkUI.Full
26
27**Example**
28
29```ts
30import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node";
31
32const renderNode = new RenderNode();
33
34class MyNodeController extends NodeController {
35  private rootNode: FrameNode | null = null;
36
37  makeNode(uiContext: UIContext): FrameNode | null {
38    this.rootNode = new FrameNode(uiContext);
39
40    const rootRenderNode = this.rootNode.getRenderNode();
41    if (rootRenderNode !== null) {
42      rootRenderNode.appendChild(renderNode);
43    }
44
45    return this.rootNode;
46  }
47}
48
49@Entry
50@Component
51struct Index {
52  private myNodeController: MyNodeController = new MyNodeController();
53  build() {
54    Row() {
55      NodeContainer(this.myNodeController)
56    }
57  }
58}
59```
60
61### appendChild
62
63appendChild(node: RenderNode): void
64
65Appends a child node to this RenderNode.
66
67**System capability**: SystemCapability.ArkUI.ArkUI.Full
68
69**Parameters**
70
71| Name| Type                     | Mandatory| Description                  |
72| ------ | ------------------------- | ---- | ---------------------- |
73| node   | [RenderNode](#rendernode) | Yes  | Child node to append.|
74
75**Example**
76
77```ts
78import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
79
80const renderNode = new RenderNode();
81const child = new RenderNode();
82renderNode.appendChild(child);
83
84class MyNodeController extends NodeController {
85  private rootNode: FrameNode | null = null;
86
87  makeNode(uiContext: UIContext): FrameNode | null {
88    this.rootNode = new FrameNode(uiContext);
89
90    const rootRenderNode = this.rootNode.getRenderNode();
91    if (rootRenderNode !== null) {
92      rootRenderNode.appendChild(renderNode);
93    }
94
95    return this.rootNode;
96  }
97}
98
99@Entry
100@Component
101struct Index {
102  private myNodeController: MyNodeController = new MyNodeController();
103  build() {
104    Row() {
105      NodeContainer(this.myNodeController)
106    }
107  }
108}
109```
110
111### insertChildAfter
112
113insertChildAfter(child: RenderNode, sibling: RenderNode | null): void
114
115Inserts a child node after the specified child node of this RenderNode.
116
117**System capability**: SystemCapability.ArkUI.ArkUI.Full
118
119**Parameters**
120
121| Name | Type                                       | Mandatory| Description                                                        |
122| ------- | ------------------------------------------- | ---- | ------------------------------------------------------------ |
123| child   | [RenderNode](#rendernode)                   | Yes  | Child node to add.                                          |
124| 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.|
125
126**Example**
127
128```ts
129import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
130
131const renderNode = new RenderNode();
132for (let i = 0; i < 10; i++) {
133  renderNode.appendChild(new RenderNode());
134}
135
136const child = new RenderNode();
137const sibling = renderNode.getChild(1);
138renderNode.insertChildAfter(child, sibling);
139
140class MyNodeController extends NodeController {
141  private rootNode: FrameNode | null = null;
142
143  makeNode(uiContext: UIContext): FrameNode | null {
144    this.rootNode = new FrameNode(uiContext);
145
146    const rootRenderNode = this.rootNode.getRenderNode();
147    if (rootRenderNode !== null) {
148      rootRenderNode.appendChild(renderNode);
149    }
150
151    return this.rootNode;
152  }
153}
154
155@Entry
156@Component
157struct Index {
158  private myNodeController: MyNodeController = new MyNodeController();
159  build() {
160    Row() {
161      NodeContainer(this.myNodeController)
162    }
163  }
164}
165```
166
167### removeChild
168
169removeChild(node: RenderNode): void
170
171Deletes the specified child node from this RenderNode.
172
173**System capability**: SystemCapability.ArkUI.ArkUI.Full
174
175**Parameters**
176
177| Name| Type                     | Mandatory| Description              |
178| ------ | ------------------------- | ---- | ------------------ |
179| node   | [RenderNode](#rendernode) | Yes  | Child node to delete.|
180
181**Example**
182```ts
183import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
184
185const renderNode = new RenderNode();
186for (let i = 0; i < 10; i++) {
187  renderNode.appendChild(new RenderNode());
188}
189
190const node = renderNode.getChild(1);
191renderNode.removeChild(node);
192
193class MyNodeController extends NodeController {
194  private rootNode: FrameNode | null = null;
195
196  makeNode(uiContext: UIContext): FrameNode | null {
197    this.rootNode = new FrameNode(uiContext);
198
199    const rootRenderNode = this.rootNode.getRenderNode();
200    if (rootRenderNode !== null) {
201      rootRenderNode.appendChild(renderNode);
202    }
203
204    return this.rootNode;
205  }
206}
207
208@Entry
209@Component
210struct Index {
211  private myNodeController: MyNodeController = new MyNodeController();
212  build() {
213    Row() {
214      NodeContainer(this.myNodeController)
215    }
216  }
217}
218```
219### clearChildren
220
221clearChildren(): void
222
223Clears all child nodes of this RenderNode.
224
225**System capability**: SystemCapability.ArkUI.ArkUI.Full
226
227**Example**
228
229```ts
230import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
231
232const renderNode = new RenderNode();
233for (let i = 0; i < 10; i++) {
234  let childNode = new RenderNode();
235  childNode.size = {width: i*10 ,height : i*10};
236  childNode.position = {x: i*10 ,y : i*10};
237  childNode.backgroundColor = 0xFF0000FF - 0X11 * i;
238  renderNode.appendChild(childNode);
239}
240
241class MyNodeController extends NodeController {
242  private rootNode: FrameNode | null = null;
243
244  makeNode(uiContext: UIContext): FrameNode | null {
245    this.rootNode = new FrameNode(uiContext);
246
247    const rootRenderNode = this.rootNode.getRenderNode();
248    if (rootRenderNode !== null) {
249      rootRenderNode.appendChild(renderNode);
250    }
251
252    return this.rootNode;
253  }
254}
255
256@Entry
257@Component
258struct Index {
259  private myNodeController: MyNodeController = new MyNodeController();
260  build() {
261    Column() {
262      NodeContainer(this.myNodeController)
263        .borderWidth(1)
264        .width(200)
265        .height(300)
266      Button("clearChildren")
267        .onClick(()=>{
268          renderNode.clearChildren();
269        })
270    }.width("100%")
271  }
272}
273```
274
275### getChild
276
277getChild(index: number): RenderNode | null
278
279Obtains the child node in the specified position of this RenderNode.
280
281**System capability**: SystemCapability.ArkUI.ArkUI.Full
282
283**Parameters**
284
285| Name | Type   | Mandatory| Description              |
286| ------- | ------- | ---- | ------------------ |
287| index | number | Yes  | Index of the child node to obtain.|
288
289**Return value**
290
291| Type                             | Description                                                      |
292| --------------------------------- | ---------------------------------------------------------- |
293| [RenderNode](#rendernode) \| null | Child node obtained. If the RenderNode does not contain the specified child node, null is returned.|
294
295**Example**
296
297```ts
298import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
299
300const renderNode = new RenderNode();
301for (let i = 0; i < 10; i++) {
302  let childNode = new RenderNode();
303  childNode.size = {width: i*10 ,height : i*10};
304  childNode.position = {x: i*10 ,y : i*10};
305  childNode.backgroundColor = 0xFF0000FF - 0X11 * i;
306  renderNode.appendChild(childNode);
307}
308
309class MyNodeController extends NodeController {
310  private rootNode: FrameNode | null = null;
311
312  makeNode(uiContext: UIContext): FrameNode | null {
313    this.rootNode = new FrameNode(uiContext);
314
315    const rootRenderNode = this.rootNode.getRenderNode();
316    if (rootRenderNode !== null) {
317      rootRenderNode.appendChild(renderNode);
318    }
319
320    return this.rootNode;
321  }
322}
323
324@Entry
325@Component
326struct Index {
327  private myNodeController: MyNodeController = new MyNodeController();
328  build() {
329    Column() {
330      NodeContainer(this.myNodeController)
331        .borderWidth(1)
332        .width(200)
333        .height(300)
334      Button("getChild")
335        .onClick(()=>{
336          for (let i = 0; i < 11; i++) {
337            let childNode : RenderNode | null = renderNode.getChild(i);
338            if(childNode == null){
339              console.log(`the ${i} of renderNode's childNode is null`);
340            } else {
341              console.log(`the ${i} of renderNode's childNode has a size of {${childNode.size.width},${childNode.size.height}}`);
342            }
343          }
344
345        })
346    }.width("100%")
347  }
348}
349```
350
351### getFirstChild
352
353getFirstChild(): RenderNode | null
354
355Obtains the first child node of this RenderNode.
356
357**System capability**: SystemCapability.ArkUI.ArkUI.Full
358
359**Return value**
360
361| Type                             | Description                                                      |
362| --------------------------------- | ---------------------------------------------------------- |
363| [RenderNode](#rendernode) \| null | First child node. If the RenderNode does not contain any child node, null is returned.|
364
365**Example**
366
367```ts
368import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
369
370const renderNode = new RenderNode();
371for (let i = 0; i < 10; i++) {
372  renderNode.appendChild(new RenderNode());
373}
374const firstChild = renderNode.getFirstChild();
375
376class MyNodeController extends NodeController {
377  private rootNode: FrameNode | null = null;
378
379  makeNode(uiContext: UIContext): FrameNode | null {
380    this.rootNode = new FrameNode(uiContext);
381
382    const rootRenderNode = this.rootNode.getRenderNode();
383    if (rootRenderNode !== null) {
384      rootRenderNode.appendChild(renderNode);
385    }
386
387    return this.rootNode;
388  }
389}
390
391@Entry
392@Component
393struct Index {
394  private myNodeController: MyNodeController = new MyNodeController();
395  build() {
396    Row() {
397      NodeContainer(this.myNodeController)
398    }
399  }
400}
401```
402
403### getNextSibling
404
405getNextSibling(): RenderNode | null
406
407Obtains the next sibling node of this RenderNode.
408
409**System capability**: SystemCapability.ArkUI.ArkUI.Full
410
411**Return value**
412
413| Type                             | Description                                                                                  |
414| --------------------------------- | -------------------------------------------------------------------------------------- |
415| [RenderNode](#rendernode) \| null | Next sibling node of the current RenderNode. If the RenderNode does not have the next sibling node, null is returned.|
416
417**Example**
418```ts
419import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
420
421const renderNode = new RenderNode();
422for (let i = 0; i < 10; i++) {
423  renderNode.appendChild(new RenderNode());
424}
425const child = renderNode.getChild(1);
426if (child !== null) {
427  const nextSibling = child.getNextSibling();
428}
429
430class MyNodeController extends NodeController {
431  private rootNode: FrameNode | null = null;
432
433  makeNode(uiContext: UIContext): FrameNode | null {
434    this.rootNode = new FrameNode(uiContext);
435
436    const rootRenderNode = this.rootNode.getRenderNode();
437    if (rootRenderNode !== null) {
438      rootRenderNode.appendChild(renderNode);
439    }
440
441    return this.rootNode;
442  }
443}
444
445@Entry
446@Component
447struct Index {
448  private myNodeController: MyNodeController = new MyNodeController();
449  build() {
450    Row() {
451      NodeContainer(this.myNodeController)
452    }
453  }
454}
455```
456
457### getPreviousSibling
458
459getPreviousSibling(): RenderNode | null
460
461Obtains the previous sibling node of this RenderNode.
462
463**System capability**: SystemCapability.ArkUI.ArkUI.Full
464
465**Return value**
466
467| Type                             | Description                                                                                  |
468| --------------------------------- | -------------------------------------------------------------------------------------- |
469| [RenderNode](#rendernode) \| null | Previous sibling node of the current RenderNode. If the RenderNode does not have the previous sibling node, null is returned.|
470
471**Example**
472```ts
473import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
474
475const renderNode = new RenderNode();
476for (let i = 0; i < 10; i++) {
477  renderNode.appendChild(new RenderNode());
478}
479const child = renderNode.getChild(1);
480if (child !== null) {
481  const nextSibling = child.getPreviousSibling();
482}
483
484class MyNodeController extends NodeController {
485  private rootNode: FrameNode | null = null;
486
487  makeNode(uiContext: UIContext): FrameNode | null {
488    this.rootNode = new FrameNode(uiContext);
489
490    const rootRenderNode = this.rootNode.getRenderNode();
491    if (rootRenderNode !== null) {
492      rootRenderNode.appendChild(renderNode);
493    }
494
495    return this.rootNode;
496  }
497}
498
499@Entry
500@Component
501struct Index {
502  private myNodeController: MyNodeController = new MyNodeController();
503  build() {
504    Row() {
505      NodeContainer(this.myNodeController)
506    }
507  }
508}
509```
510
511### backgroundColor
512
513set backgroundColor(color: number)
514
515Sets the background color for this RenderNode.
516
517**System capability**: SystemCapability.ArkUI.ArkUI.Full
518
519**Parameters**
520
521| Name| Type  | Mandatory| Description                  |
522| ------ | ------ | ---- | ---------------------- |
523| color  | number | Yes  | Background color value, in ARGB format.|
524
525**Example**
526```ts
527import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
528
529const renderNode = new RenderNode();
530renderNode.backgroundColor = 0XFF00FF00;
531
532class MyNodeController extends NodeController {
533  private rootNode: FrameNode | null = null;
534
535  makeNode(uiContext: UIContext): FrameNode | null {
536    this.rootNode = new FrameNode(uiContext);
537
538    const rootRenderNode = this.rootNode.getRenderNode();
539    if (rootRenderNode !== null) {
540      rootRenderNode.appendChild(renderNode);
541    }
542
543    return this.rootNode;
544  }
545}
546
547@Entry
548@Component
549struct Index {
550  private myNodeController: MyNodeController = new MyNodeController();
551  build() {
552    Row() {
553      NodeContainer(this.myNodeController)
554    }
555  }
556}
557```
558
559get backgroundColor(): number
560
561Obtains the background color of this RenderNode.
562
563**System capability**: SystemCapability.ArkUI.ArkUI.Full
564
565**Return value**
566
567| Type  | Description                                          |
568| ------ | ---------------------------------------------- |
569| number | Background color of the current RenderNode. The default value is **0X00000000**.|
570
571**Example**
572```ts
573import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
574
575const renderNode = new RenderNode();
576const backgroundColor = renderNode.backgroundColor;
577
578class MyNodeController extends NodeController {
579  private rootNode: FrameNode | null = null;
580
581  makeNode(uiContext: UIContext): FrameNode | null {
582    this.rootNode = new FrameNode(uiContext);
583
584    const rootRenderNode = this.rootNode.getRenderNode();
585    if (rootRenderNode !== null) {
586      rootRenderNode.appendChild(renderNode);
587    }
588
589    return this.rootNode;
590  }
591}
592
593@Entry
594@Component
595struct Index {
596  private myNodeController: MyNodeController = new MyNodeController();
597  build() {
598    Row() {
599      NodeContainer(this.myNodeController)
600    }
601  }
602}
603```
604
605### clipToFrame
606
607set clipToFrame(useClip: boolean)
608
609Sets whether to clip this RenderNode. The value **true** means to clip the RenderNode to its set size.
610
611**System capability**: SystemCapability.ArkUI.ArkUI.Full
612
613**Parameters**
614
615| Name | Type   | Mandatory| Description              |
616| ------- | ------- | ---- | ------------------ |
617| useClip | boolean | Yes  | Whether to clip the RenderNode.|
618
619**Example**
620```ts
621import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
622
623const renderNode = new RenderNode();
624renderNode.clipToFrame = true;
625
626class MyNodeController extends NodeController {
627  private rootNode: FrameNode | null = null;
628
629  makeNode(uiContext: UIContext): FrameNode | null {
630    this.rootNode = new FrameNode(uiContext);
631
632    const rootRenderNode = this.rootNode.getRenderNode();
633    if (rootRenderNode !== null) {
634      rootRenderNode.appendChild(renderNode);
635    }
636
637    return this.rootNode;
638  }
639}
640
641@Entry
642@Component
643struct Index {
644  private myNodeController: MyNodeController = new MyNodeController();
645  build() {
646    Row() {
647      NodeContainer(this.myNodeController)
648    }
649  }
650}
651```
652
653get clipToFrame(): boolean
654
655Obtains whether this RenderNode needs to be clipped.
656
657**System capability**: SystemCapability.ArkUI.ArkUI.Full
658
659**Return value**
660
661| Type   | Description                                               |
662| ------- | --------------------------------------------------- |
663| boolean | Whether the current RenderNode needs to be clipped. The default value is **false**.|
664
665**Example**
666```ts
667import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
668
669const renderNode = new RenderNode();
670const clipToFrame = renderNode.clipToFrame;
671
672class MyNodeController extends NodeController {
673  private rootNode: FrameNode | null = null;
674
675  makeNode(uiContext: UIContext): FrameNode | null {
676    this.rootNode = new FrameNode(uiContext);
677
678    const rootRenderNode = this.rootNode.getRenderNode();
679    if (rootRenderNode !== null) {
680      rootRenderNode.appendChild(renderNode);
681    }
682
683    return this.rootNode;
684  }
685}
686
687@Entry
688@Component
689struct Index {
690  private myNodeController: MyNodeController = new MyNodeController();
691  build() {
692    Row() {
693      NodeContainer(this.myNodeController)
694    }
695  }
696}
697```
698
699### opacity
700
701set opacity(value: number)
702
703Sets the opacity for this RenderNode.
704
705**System capability**: SystemCapability.ArkUI.ArkUI.Full
706
707**Parameters**
708
709| Name| Type  | Mandatory| Description                                  |
710| ------ | ------ | ---- | -------------------------------------- |
711| value  | number | Yes  | Opacity to set.\<br>Value range: [0, 1]|
712
713**Example**
714```ts
715import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
716
717const renderNode = new RenderNode();
718renderNode.opacity = 0.5;
719
720class MyNodeController extends NodeController {
721  private rootNode: FrameNode | null = null;
722
723  makeNode(uiContext: UIContext): FrameNode | null {
724    this.rootNode = new FrameNode(uiContext);
725
726    const rootRenderNode = this.rootNode.getRenderNode();
727    if (rootRenderNode !== null) {
728      rootRenderNode.appendChild(renderNode);
729    }
730
731    return this.rootNode;
732  }
733}
734
735@Entry
736@Component
737struct Index {
738  private myNodeController: MyNodeController = new MyNodeController();
739  build() {
740    Row() {
741      NodeContainer(this.myNodeController)
742    }
743  }
744}
745```
746
747get opacity(): number
748
749Obtains the opacity of this RenderNode.
750
751**System capability**: SystemCapability.ArkUI.ArkUI.Full
752
753**Return value**
754
755| Type  | Description                                     |
756| ------ | ----------------------------------------- |
757| number | Opacity of the current RenderNode. The default value is **1**.|
758
759**Example**
760```ts
761import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
762
763const renderNode = new RenderNode();
764const opacity = renderNode.opacity;
765
766class MyNodeController extends NodeController {
767  private rootNode: FrameNode | null = null;
768
769  makeNode(uiContext: UIContext): FrameNode | null {
770    this.rootNode = new FrameNode(uiContext);
771
772    const rootRenderNode = this.rootNode.getRenderNode();
773    if (rootRenderNode !== null) {
774      rootRenderNode.appendChild(renderNode);
775    }
776
777    return this.rootNode;
778  }
779}
780
781@Entry
782@Component
783struct Index {
784  private myNodeController: MyNodeController = new MyNodeController();
785  build() {
786    Row() {
787      NodeContainer(this.myNodeController)
788    }
789  }
790}
791```
792
793### size
794
795set size(size: Size)
796
797Sets the size for this RenderNode.
798
799**System capability**: SystemCapability.ArkUI.ArkUI.Full
800
801**Parameters**
802
803| Name| Type                                    | Mandatory| Description                        |
804| ------ | ---------------------------------------- | ---- | ---------------------------- |
805| size   | [Size](./js-apis-arkui-graphics.md#size) | Yes  | Size to set.|
806
807**Example**
808```ts
809import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
810
811const renderNode = new RenderNode();
812renderNode.size = { width: 100, height: 100 };
813
814class MyNodeController extends NodeController {
815  private rootNode: FrameNode | null = null;
816
817  makeNode(uiContext: UIContext): FrameNode | null {
818    this.rootNode = new FrameNode(uiContext);
819
820    const rootRenderNode = this.rootNode.getRenderNode();
821    if (rootRenderNode !== null) {
822      rootRenderNode.appendChild(renderNode);
823    }
824
825    return this.rootNode;
826  }
827}
828
829@Entry
830@Component
831struct Index {
832  private myNodeController: MyNodeController = new MyNodeController();
833  build() {
834    Row() {
835      NodeContainer(this.myNodeController)
836    }
837  }
838}
839```
840
841get size(): Size
842
843Obtains the size of this RenderNode.
844
845**System capability**: SystemCapability.ArkUI.ArkUI.Full
846
847**Return value**
848
849| Name                                    | Description                                           |
850| ---------------------------------------- | ----------------------------------------------- |
851| [Size](./js-apis-arkui-graphics.md#size) | Size of the current RenderNode. The default width and height are **0**.|
852
853**Example**
854```ts
855import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
856
857const renderNode = new RenderNode();
858const size = renderNode.size;
859
860class MyNodeController extends NodeController {
861  private rootNode: FrameNode | null = null;
862
863  makeNode(uiContext: UIContext): FrameNode | null {
864    this.rootNode = new FrameNode(uiContext);
865
866    const rootRenderNode = this.rootNode.getRenderNode();
867    if (rootRenderNode !== null) {
868      rootRenderNode.appendChild(renderNode);
869    }
870
871    return this.rootNode;
872  }
873}
874
875@Entry
876@Component
877struct Index {
878  private myNodeController: MyNodeController = new MyNodeController();
879  build() {
880    Row() {
881      NodeContainer(this.myNodeController)
882    }
883  }
884}
885```
886
887### position
888
889set position(position: Position)
890
891Sets the position for this RenderNode.
892
893**System capability**: SystemCapability.ArkUI.ArkUI.Full
894
895**Parameters**
896
897| Name  | Type                                            | Mandatory| Description                        |
898| -------- | ------------------------------------------------ | ---- | ---------------------------- |
899| position | [Position](./js-apis-arkui-graphics.md#position) | Yes  | Position to set.|
900
901**Example**
902```ts
903import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
904
905const renderNode = new RenderNode();
906renderNode.position = { x: 100, y: 100 };
907
908class MyNodeController extends NodeController {
909  private rootNode: FrameNode | null = null;
910
911  makeNode(uiContext: UIContext): FrameNode | null {
912    this.rootNode = new FrameNode(uiContext);
913
914    const rootRenderNode = this.rootNode.getRenderNode();
915    if (rootRenderNode !== null) {
916      rootRenderNode.appendChild(renderNode);
917    }
918
919    return this.rootNode;
920  }
921}
922
923@Entry
924@Component
925struct Index {
926  private myNodeController: MyNodeController = new MyNodeController();
927  build() {
928    Row() {
929      NodeContainer(this.myNodeController)
930    }
931  }
932}
933```
934
935get position(): Position
936
937Obtains the position of this RenderNode.
938
939**System capability**: SystemCapability.ArkUI.ArkUI.Full
940
941**Return value**
942
943| Type                                            | Description                                                |
944| ------------------------------------------------ | ---------------------------------------------------- |
945| [Position](./js-apis-arkui-graphics.md#position) | Position of the current RenderNode. The default value is **{ x: 0, y: 0 }**.|
946
947**Example**
948```ts
949import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
950
951const renderNode = new RenderNode();
952const position = renderNode.position;
953
954class MyNodeController extends NodeController {
955  private rootNode: FrameNode | null = null;
956
957  makeNode(uiContext: UIContext): FrameNode | null {
958    this.rootNode = new FrameNode(uiContext);
959
960    const rootRenderNode = this.rootNode.getRenderNode();
961    if (rootRenderNode !== null) {
962      rootRenderNode.appendChild(renderNode);
963    }
964
965    return this.rootNode;
966  }
967}
968
969@Entry
970@Component
971struct Index {
972  private myNodeController: MyNodeController = new MyNodeController();
973  build() {
974    Row() {
975      NodeContainer(this.myNodeController)
976    }
977  }
978}
979```
980
981### frame
982
983set frame(frame: Frame)
984
985Sets 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 prevails.
986
987**System capability**: SystemCapability.ArkUI.ArkUI.Full
988
989**Parameters**
990
991| Name| Type                                      | Mandatory| Description                            |
992| ------ | ------------------------------------------ | ---- | -------------------------------- |
993| frame  | [Frame](./js-apis-arkui-graphics.md#frame) | Yes  | Size and position to set.|
994
995**Example**
996```ts
997import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
998
999const renderNode = new RenderNode();
1000renderNode.frame = { x: 50, y: 50, width: 100, height: 100 };
1001
1002class MyNodeController extends NodeController {
1003  private rootNode: FrameNode | null = null;
1004
1005  makeNode(uiContext: UIContext): FrameNode | null {
1006    this.rootNode = new FrameNode(uiContext);
1007
1008    const rootRenderNode = this.rootNode.getRenderNode();
1009    if (rootRenderNode !== null) {
1010      rootRenderNode.appendChild(renderNode);
1011    }
1012
1013    return this.rootNode;
1014  }
1015}
1016
1017@Entry
1018@Component
1019struct Index {
1020  private myNodeController: MyNodeController = new MyNodeController();
1021  build() {
1022    Row() {
1023      NodeContainer(this.myNodeController)
1024    }
1025  }
1026}
1027```
1028
1029get frame(): Frame
1030
1031Obtains the size and position of this RenderNode.
1032
1033**System capability**: SystemCapability.ArkUI.ArkUI.Full
1034
1035**Return value**
1036
1037| Type           | Description                                                        |
1038| --------------- | ------------------------------------------------------------ |
1039| [Frame](#frame) | Size and position of the current RenderNode. The default value is **{ x: 0, y: 0, width: 0, height: 0 }**.|
1040
1041**Example**
1042```ts
1043import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1044
1045const renderNode = new RenderNode();
1046const frame = renderNode.frame;
1047
1048class MyNodeController extends NodeController {
1049  private rootNode: FrameNode | null = null;
1050
1051  makeNode(uiContext: UIContext): FrameNode | null {
1052    this.rootNode = new FrameNode(uiContext);
1053
1054    const rootRenderNode = this.rootNode.getRenderNode();
1055    if (rootRenderNode !== null) {
1056      rootRenderNode.appendChild(renderNode);
1057    }
1058
1059    return this.rootNode;
1060  }
1061}
1062
1063@Entry
1064@Component
1065struct Index {
1066  private myNodeController: MyNodeController = new MyNodeController();
1067  build() {
1068    Row() {
1069      NodeContainer(this.myNodeController)
1070    }
1071  }
1072}
1073```
1074
1075### pivot
1076
1077set pivot(pivot: Pivot)
1078
1079Sets the pivot for this RenderNode, which affects the scaling and rotation effects of the RenderNode.
1080
1081**System capability**: SystemCapability.ArkUI.ArkUI.Full
1082
1083**Parameters**
1084
1085| Name| Type                                      | Mandatory| Description                        |
1086| ------ | ------------------------------------------ | ---- | ---------------------------- |
1087| pivot  | [Pivot](./js-apis-arkui-graphics.md#pivot) | Yes  | Pivot to set.|
1088
1089**Example**
1090```ts
1091import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1092
1093const renderNode = new RenderNode();
1094renderNode.pivot = { x: 0.5, y: 0.6 };
1095
1096class MyNodeController extends NodeController {
1097  private rootNode: FrameNode | null = null;
1098
1099  makeNode(uiContext: UIContext): FrameNode | null {
1100    this.rootNode = new FrameNode(uiContext);
1101
1102    const rootRenderNode = this.rootNode.getRenderNode();
1103    if (rootRenderNode !== null) {
1104      rootRenderNode.appendChild(renderNode);
1105    }
1106
1107    return this.rootNode;
1108  }
1109}
1110
1111@Entry
1112@Component
1113struct Index {
1114  private myNodeController: MyNodeController = new MyNodeController();
1115  build() {
1116    Row() {
1117      NodeContainer(this.myNodeController)
1118    }
1119  }
1120}
1121```
1122
1123get pivot(): Pivot
1124
1125Obtains the pivot of this RenderNode.
1126
1127**System capability**: SystemCapability.ArkUI.ArkUI.Full
1128
1129**Return value**
1130
1131| Type                                      | Description                                                     |
1132| ------------------------------------------ | --------------------------------------------------------- |
1133| [Pivot](./js-apis-arkui-graphics.md#pivot) | Pivot of the current RenderNode. The default value is **{ x: 0.5, y: 0.5}**.|
1134
1135**Example**
1136```ts
1137import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1138
1139const renderNode = new RenderNode();
1140const pivot = renderNode.pivot;
1141
1142class MyNodeController extends NodeController {
1143  private rootNode: FrameNode | null = null;
1144
1145  makeNode(uiContext: UIContext): FrameNode | null {
1146    this.rootNode = new FrameNode(uiContext);
1147
1148    const rootRenderNode = this.rootNode.getRenderNode();
1149    if (rootRenderNode !== null) {
1150      rootRenderNode.appendChild(renderNode);
1151    }
1152
1153    return this.rootNode;
1154  }
1155}
1156
1157@Entry
1158@Component
1159struct Index {
1160  private myNodeController: MyNodeController = new MyNodeController();
1161  build() {
1162    Row() {
1163      NodeContainer(this.myNodeController)
1164    }
1165  }
1166}
1167```
1168
1169### scale
1170
1171set scale(scale: Scale)
1172
1173Sets the scale factor for this RenderNode.
1174
1175**System capability**: SystemCapability.ArkUI.ArkUI.Full
1176
1177**Parameters**
1178
1179| Name| Type                                      | Mandatory| Description                            |
1180| ------ | ------------------------------------------ | ---- | -------------------------------- |
1181| scale  | [Scale](./js-apis-arkui-graphics.md#scale) | Yes  | Scale factor to set.|
1182
1183**Example**
1184```ts
1185import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1186
1187const renderNode = new RenderNode();
1188renderNode.scale = { x: 0.5, y: 1 };
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  build() {
1210    Row() {
1211      NodeContainer(this.myNodeController)
1212    }
1213  }
1214}
1215```
1216
1217get scale(): Scale
1218
1219Obtains the scale factor of this RenderNode.
1220
1221**System capability**: SystemCapability.ArkUI.ArkUI.Full
1222
1223**Return value**
1224
1225| Type                                      | Description                                              |
1226| ------------------------------------------ | -------------------------------------------------- |
1227| [Scale](./js-apis-arkui-graphics.md#scale) | Scale factor of the current RenderNode. The default value is **{ x: 1, y: 1 }**.|
1228
1229**Example**
1230```ts
1231import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1232
1233const renderNode = new RenderNode();
1234const scale = renderNode.scale;
1235
1236class MyNodeController extends NodeController {
1237  private rootNode: FrameNode | null = null;
1238
1239  makeNode(uiContext: UIContext): FrameNode | null {
1240    this.rootNode = new FrameNode(uiContext);
1241
1242    const rootRenderNode = this.rootNode.getRenderNode();
1243    if (rootRenderNode !== null) {
1244      rootRenderNode.appendChild(renderNode);
1245    }
1246
1247    return this.rootNode;
1248  }
1249}
1250
1251@Entry
1252@Component
1253struct Index {
1254  private myNodeController: MyNodeController = new MyNodeController();
1255  build() {
1256    Row() {
1257      NodeContainer(this.myNodeController)
1258    }
1259  }
1260}
1261```
1262
1263### translation
1264
1265set translation(translation: Translation)
1266
1267Sets the translation amount for this RenderNode.
1268
1269**System capability**: SystemCapability.ArkUI.ArkUI.Full
1270
1271**Parameters**
1272
1273| Name     | Type                                                  | Mandatory| Description                          |
1274| ----------- | ------------------------------------------------------ | ---- | ------------------------------ |
1275| translation | [Translation](./js-apis-arkui-graphics.md#translation) | Yes  | Translation amount to set.|
1276
1277**Example**
1278```ts
1279import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1280
1281const renderNode = new RenderNode();
1282renderNode.translation = { x: 0, y: 1 };
1283
1284class MyNodeController extends NodeController {
1285  private rootNode: FrameNode | null = null;
1286
1287  makeNode(uiContext: UIContext): FrameNode | null {
1288    this.rootNode = new FrameNode(uiContext);
1289
1290    const rootRenderNode = this.rootNode.getRenderNode();
1291    if (rootRenderNode !== null) {
1292      rootRenderNode.appendChild(renderNode);
1293    }
1294
1295    return this.rootNode;
1296  }
1297}
1298
1299@Entry
1300@Component
1301struct Index {
1302  private myNodeController: MyNodeController = new MyNodeController();
1303  build() {
1304    Row() {
1305      NodeContainer(this.myNodeController)
1306    }
1307  }
1308}
1309```
1310
1311get translation(): Translation
1312
1313Obtains the translation amount of this RenderNode.
1314
1315**System capability**: SystemCapability.ArkUI.ArkUI.Full
1316
1317**Return value**
1318
1319| Type                                                  | Description                                                |
1320| ------------------------------------------------------ | ---------------------------------------------------- |
1321| [Translation](./js-apis-arkui-graphics.md#translation) | Translation amount of the current RenderNode. The default value is **{ x: 0, y: 0 }**.|
1322
1323**Example**
1324```ts
1325import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1326
1327const renderNode = new RenderNode();
1328const translation = renderNode.translation;
1329
1330class MyNodeController extends NodeController {
1331  private rootNode: FrameNode | null = null;
1332
1333  makeNode(uiContext: UIContext): FrameNode | null {
1334    this.rootNode = new FrameNode(uiContext);
1335
1336    const rootRenderNode = this.rootNode.getRenderNode();
1337    if (rootRenderNode !== null) {
1338      rootRenderNode.appendChild(renderNode);
1339    }
1340
1341    return this.rootNode;
1342  }
1343}
1344
1345@Entry
1346@Component
1347struct Index {
1348  private myNodeController: MyNodeController = new MyNodeController();
1349  build() {
1350    Row() {
1351      NodeContainer(this.myNodeController)
1352    }
1353  }
1354}
1355```
1356
1357### rotation
1358
1359set rotation(rotation: Rotation)
1360
1361Sets the rotation angle for this RenderNode.
1362
1363**System capability**: SystemCapability.ArkUI.ArkUI.Full
1364
1365**Parameters**
1366
1367| Name  | Type                                            | Mandatory| Description                            |
1368| -------- | ------------------------------------------------ | ---- | -------------------------------- |
1369| rotation | [Rotation](./js-apis-arkui-graphics.md#rotation) | Yes  | Rotation angle to set.|
1370
1371**Example**
1372```ts
1373import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1374
1375const renderNode = new RenderNode();
1376renderNode.rotation = { x: 10, y: 45, z: 0 };
1377
1378class MyNodeController extends NodeController {
1379  private rootNode: FrameNode | null = null;
1380
1381  makeNode(uiContext: UIContext): FrameNode | null {
1382    this.rootNode = new FrameNode(uiContext);
1383
1384    const rootRenderNode = this.rootNode.getRenderNode();
1385    if (rootRenderNode !== null) {
1386      rootRenderNode.appendChild(renderNode);
1387    }
1388
1389    return this.rootNode;
1390  }
1391}
1392
1393@Entry
1394@Component
1395struct Index {
1396  private myNodeController: MyNodeController = new MyNodeController();
1397  build() {
1398    Row() {
1399      NodeContainer(this.myNodeController)
1400    }
1401  }
1402}
1403```
1404
1405get rotation(): Rotation
1406
1407Obtains the rotation angle of this RenderNode.
1408
1409**System capability**: SystemCapability.ArkUI.ArkUI.Full
1410
1411**Return value**
1412
1413| Type                                            | Description                                                   |
1414| ------------------------------------------------ | ------------------------------------------------------- |
1415| [Rotation](./js-apis-arkui-graphics.md#rotation) | Rotation angle of the current RenderNode. The default value is **{ x: 0, y: 0, z: 0}**.|
1416
1417**Example**
1418```ts
1419import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1420
1421const renderNode = new RenderNode();
1422const rotation = renderNode.rotation;
1423
1424class MyNodeController extends NodeController {
1425  private rootNode: FrameNode | null = null;
1426
1427  makeNode(uiContext: UIContext): FrameNode | null {
1428    this.rootNode = new FrameNode(uiContext);
1429
1430    const rootRenderNode = this.rootNode.getRenderNode();
1431    if (rootRenderNode !== null) {
1432      rootRenderNode.appendChild(renderNode);
1433    }
1434
1435    return this.rootNode;
1436  }
1437}
1438
1439@Entry
1440@Component
1441struct Index {
1442  private myNodeController: MyNodeController = new MyNodeController();
1443  build() {
1444    Row() {
1445      NodeContainer(this.myNodeController)
1446    }
1447  }
1448}
1449```
1450
1451### transform
1452
1453set transform(transform: Matrix4)
1454
1455Sets the transformation information for this RenderNode.
1456
1457**System capability**: SystemCapability.ArkUI.ArkUI.Full
1458
1459**Parameters**
1460
1461| Name   | Type                                          | Mandatory| Description                            |
1462| --------- | ---------------------------------------------- | ---- | -------------------------------- |
1463| transform | [Matrix4](./js-apis-arkui-graphics.md#matrix4) | Yes  | Transformation information to set.|
1464
1465**Example**
1466```ts
1467import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1468
1469const renderNode = new RenderNode();
1470renderNode.transform = [
1471  1, 0, 45, 0,
1472  0, 1,  0, 0,
1473  0, 0,  1, 0,
1474  0, 0,  0, 1
1475];
1476
1477class MyNodeController extends NodeController {
1478  private rootNode: FrameNode | null = null;
1479
1480  makeNode(uiContext: UIContext): FrameNode | null {
1481    this.rootNode = new FrameNode(uiContext);
1482
1483    const rootRenderNode = this.rootNode.getRenderNode();
1484    if (rootRenderNode !== null) {
1485      rootRenderNode.appendChild(renderNode);
1486    }
1487
1488    return this.rootNode;
1489  }
1490}
1491
1492@Entry
1493@Component
1494struct Index {
1495  private myNodeController: MyNodeController = new MyNodeController();
1496  build() {
1497    Row() {
1498      NodeContainer(this.myNodeController)
1499    }
1500  }
1501}
1502```
1503
1504get transform(): Matrix4
1505
1506Obtains the transformation information of this RenderNode. The default value is as follows:
1507```ts
1508[
1509  1, 0, 0, 0,
1510  0, 1, 0, 0,
1511  0, 0, 1, 0,
1512  0, 0, 0, 1
1513]
1514```
1515
1516**System capability**: SystemCapability.ArkUI.ArkUI.Full
1517
1518**Return value**
1519
1520| Type                                          | Description                      |
1521| ---------------------------------------------- | -------------------------- |
1522| [Matrix4](./js-apis-arkui-graphics.md#matrix4) | Transformation information of the current RenderNode.|
1523
1524**Example**
1525```ts
1526import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1527
1528const renderNode = new RenderNode();
1529const transform = renderNode.transform;
1530
1531class MyNodeController extends NodeController {
1532  private rootNode: FrameNode | null = null;
1533
1534  makeNode(uiContext: UIContext): FrameNode | null {
1535    this.rootNode = new FrameNode(uiContext);
1536
1537    const rootRenderNode = this.rootNode.getRenderNode();
1538    if (rootRenderNode !== null) {
1539      rootRenderNode.appendChild(renderNode);
1540    }
1541
1542    return this.rootNode;
1543  }
1544}
1545
1546@Entry
1547@Component
1548struct Index {
1549  private myNodeController: MyNodeController = new MyNodeController();
1550  build() {
1551    Row() {
1552      NodeContainer(this.myNodeController)
1553    }
1554  }
1555}
1556```
1557
1558### shadowColor
1559
1560set shadowColor(color: number)
1561
1562Sets the shadow color for this RenderNode, in ARGB format. If [shadowAlpha](#shadowalpha) is set, the opacity is subject to **shadowAlpha**.
1563
1564**System capability**: SystemCapability.ArkUI.ArkUI.Full
1565
1566**Parameters**
1567
1568| Name| Type  | Mandatory| Description                                      |
1569| ------ | ------ | ---- | ------------------------------------------ |
1570| color  | number | Yes  | Shadow color to set, in ARGB format.|
1571
1572**Example**
1573```ts
1574import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1575
1576const renderNode = new RenderNode();
1577renderNode.shadowColor = 0XFF00FF00;
1578
1579class MyNodeController extends NodeController {
1580  private rootNode: FrameNode | null = null;
1581
1582  makeNode(uiContext: UIContext): FrameNode | null {
1583    this.rootNode = new FrameNode(uiContext);
1584
1585    const rootRenderNode = this.rootNode.getRenderNode();
1586    if (rootRenderNode !== null) {
1587      rootRenderNode.appendChild(renderNode);
1588    }
1589
1590    return this.rootNode;
1591  }
1592}
1593
1594@Entry
1595@Component
1596struct Index {
1597  private myNodeController: MyNodeController = new MyNodeController();
1598  build() {
1599    Row() {
1600      NodeContainer(this.myNodeController)
1601    }
1602  }
1603}
1604```
1605
1606get shadowColor(): number
1607
1608Obtains the shadow color of this RenderNode.
1609
1610**System capability**: SystemCapability.ArkUI.ArkUI.Full
1611
1612**Return value**
1613
1614| Type  | Description                                                    |
1615| ------ | -------------------------------------------------------- |
1616| number | Shadow color of the current RenderNode, in ARGB format. The default value is **0X00000000**.|
1617
1618**Example**
1619```ts
1620import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1621
1622const renderNode = new RenderNode();
1623const shadowColor = renderNode.shadowColor;
1624
1625class MyNodeController extends NodeController {
1626  private rootNode: FrameNode | null = null;
1627
1628  makeNode(uiContext: UIContext): FrameNode | null {
1629    this.rootNode = new FrameNode(uiContext);
1630
1631    const rootRenderNode = this.rootNode.getRenderNode();
1632    if (rootRenderNode !== null) {
1633      rootRenderNode.appendChild(renderNode);
1634    }
1635
1636    return this.rootNode;
1637  }
1638}
1639
1640@Entry
1641@Component
1642struct Index {
1643  private myNodeController: MyNodeController = new MyNodeController();
1644  build() {
1645    Row() {
1646      NodeContainer(this.myNodeController)
1647    }
1648  }
1649}
1650```
1651
1652### shadowOffset
1653
1654set shadowOffset(offset: Offset)
1655
1656Sets the shadow offset for this RenderNode.
1657
1658**System capability**: SystemCapability.ArkUI.ArkUI.Full
1659
1660**Parameters**
1661
1662| Name| Type                                        | Mandatory| Description                            |
1663| ------ | -------------------------------------------- | ---- | -------------------------------- |
1664| offset | [Offset](./js-apis-arkui-graphics.md#offset) | Yes  | Shadow offset to set.|
1665
1666**Example**
1667
1668```ts
1669import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1670
1671const renderNode = new RenderNode();
1672renderNode.shadowOffset = { x: 10, y: 10 };
1673
1674class MyNodeController extends NodeController {
1675  private rootNode: FrameNode | null = null;
1676
1677  makeNode(uiContext: UIContext): FrameNode | null {
1678    this.rootNode = new FrameNode(uiContext);
1679
1680    const rootRenderNode = this.rootNode.getRenderNode();
1681    if (rootRenderNode !== null) {
1682      rootRenderNode.appendChild(renderNode);
1683    }
1684
1685    return this.rootNode;
1686  }
1687}
1688
1689@Entry
1690@Component
1691struct Index {
1692  private myNodeController: MyNodeController = new MyNodeController();
1693  build() {
1694    Row() {
1695      NodeContainer(this.myNodeController)
1696    }
1697  }
1698}
1699```
1700
1701get shadowOffset(): Offset
1702
1703Obtains the shadow offset of this RenderNode.
1704
1705**System capability**: SystemCapability.ArkUI.ArkUI.Full
1706
1707**Return value**
1708
1709| Type                                        | Description                                              |
1710| -------------------------------------------- | -------------------------------------------------- |
1711| [Offset](./js-apis-arkui-graphics.md#offset) | Shadow offset of the current RenderNode. The default value is **{ x: 0, y: 0 }**.|
1712
1713**Example**
1714
1715```ts
1716import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1717
1718const renderNode = new RenderNode();
1719const shadowOffset = renderNode.shadowOffset;
1720
1721class MyNodeController extends NodeController {
1722  private rootNode: FrameNode | null = null;
1723
1724  makeNode(uiContext: UIContext): FrameNode | null {
1725    this.rootNode = new FrameNode(uiContext);
1726
1727    const rootRenderNode = this.rootNode.getRenderNode();
1728    if (rootRenderNode !== null) {
1729      rootRenderNode.appendChild(renderNode);
1730    }
1731
1732    return this.rootNode;
1733  }
1734}
1735
1736@Entry
1737@Component
1738struct Index {
1739  private myNodeController: MyNodeController = new MyNodeController();
1740  build() {
1741    Row() {
1742      NodeContainer(this.myNodeController)
1743    }
1744  }
1745}
1746```
1747
1748### shadowAlpha
1749
1750set shadowAlpha(alpha: number)
1751
1752Sets the alpha value of the shadow color for this RenderNode.
1753
1754**System capability**: SystemCapability.ArkUI.ArkUI.Full
1755
1756**Parameters**
1757
1758| Name| Type  | Mandatory| Description                                     |
1759| ------ | ------ | ---- | ----------------------------------------- |
1760| alpha  | number | Yes  | Alpha value of the shadow color to set.|
1761
1762**Example**
1763
1764```ts
1765import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1766
1767const renderNode = new RenderNode();
1768renderNode.shadowAlpha = 0.5;
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  build() {
1790    Row() {
1791      NodeContainer(this.myNodeController)
1792    }
1793  }
1794}
1795```
1796
1797get shadowAlpha(): number
1798
1799Obtains the alpha value of the shadow color of this RenderNode.
1800
1801**System capability**: SystemCapability.ArkUI.ArkUI.Full
1802
1803**Return value**
1804
1805| Type  | Description                                          |
1806| ------ | ---------------------------------------------- |
1807| number | Alpha value of the shadow color of the current RenderNode. The default value is **0**.|
1808
1809```ts
1810import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1811
1812const renderNode = new RenderNode();
1813const shadowAlpha = renderNode.shadowAlpha;
1814
1815class MyNodeController extends NodeController {
1816  private rootNode: FrameNode | null = null;
1817
1818  makeNode(uiContext: UIContext): FrameNode | null {
1819    this.rootNode = new FrameNode(uiContext);
1820
1821    const rootRenderNode = this.rootNode.getRenderNode();
1822    if (rootRenderNode !== null) {
1823      rootRenderNode.appendChild(renderNode);
1824    }
1825
1826    return this.rootNode;
1827  }
1828}
1829
1830@Entry
1831@Component
1832struct Index {
1833  private myNodeController: MyNodeController = new MyNodeController();
1834  build() {
1835    Row() {
1836      NodeContainer(this.myNodeController)
1837    }
1838  }
1839}
1840```
1841
1842### shadowElevation
1843
1844set shadowElevation(elevation: number)
1845
1846Sets the shadow elevation for this RenderNode.
1847
1848**System capability**: SystemCapability.ArkUI.ArkUI.Full
1849
1850**Parameters**
1851
1852| Name   | Type  | Mandatory| Description                            |
1853| --------- | ------ | ---- | -------------------------------- |
1854| elevation | number | Yes  | Shadow elevation to set.|
1855
1856**Example**
1857
1858```ts
1859import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1860
1861const renderNode = new RenderNode();
1862renderNode.frame = { x: 0, y: 0, width: 100, height: 100 };
1863renderNode.shadowOffset = { x: 10, y: 10 };
1864renderNode.shadowAlpha = 0.7;
1865renderNode.shadowElevation = 30;
1866
1867class MyNodeController extends NodeController {
1868  private rootNode: FrameNode | null = null;
1869
1870  makeNode(uiContext: UIContext): FrameNode | null {
1871    this.rootNode = new FrameNode(uiContext);
1872
1873    const rootRenderNode = this.rootNode.getRenderNode();
1874    if (rootRenderNode !== null) {
1875      rootRenderNode.appendChild(renderNode);
1876    }
1877
1878    return this.rootNode;
1879  }
1880}
1881
1882@Entry
1883@Component
1884struct Index {
1885  private myNodeController: MyNodeController = new MyNodeController();
1886  build() {
1887    Row() {
1888      NodeContainer(this.myNodeController)
1889    }
1890  }
1891}
1892```
1893
1894![shadowElevation](./figures/ShadowElevation.jpg)
1895
1896get shadowElevation(): number
1897
1898Obtains the shadow elevation of this RenderNode.
1899
1900**System capability**: SystemCapability.ArkUI.ArkUI.Full
1901
1902**Return value**
1903
1904| Type  | Description                                 |
1905| ------ | ------------------------------------- |
1906| number | Shadow elevation of the current RenderNode. The default value is **0**.|
1907
1908```ts
1909import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1910
1911const renderNode = new RenderNode();
1912const shadowElevation = renderNode.shadowElevation;
1913
1914class MyNodeController extends NodeController {
1915  private rootNode: FrameNode | null = null;
1916
1917  makeNode(uiContext: UIContext): FrameNode | null {
1918    this.rootNode = new FrameNode(uiContext);
1919
1920    const rootRenderNode = this.rootNode.getRenderNode();
1921    if (rootRenderNode !== null) {
1922      rootRenderNode.appendChild(renderNode);
1923    }
1924
1925    return this.rootNode;
1926  }
1927}
1928
1929@Entry
1930@Component
1931struct Index {
1932  private myNodeController: MyNodeController = new MyNodeController();
1933  build() {
1934    Row() {
1935      NodeContainer(this.myNodeController)
1936    }
1937  }
1938}
1939```
1940
1941### shadowRadius
1942
1943set shadowRadius(radius: number)
1944
1945Sets the shadow blur radius for this RenderNode.
1946
1947**System capability**: SystemCapability.ArkUI.ArkUI.Full
1948
1949**Parameters**
1950
1951| Name| Type  | Mandatory| Description                                |
1952| ------ | ------ | ---- | ------------------------------------ |
1953| radius | number | Yes  | Shadow blur radius to set.|
1954
1955**Example**
1956
1957```ts
1958import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
1959
1960const renderNode = new RenderNode();
1961renderNode.frame = { x: 0, y: 0, width: 100, height: 100 };
1962renderNode.shadowOffset = { x: 10, y: 10 };
1963renderNode.shadowAlpha = 0.7;
1964renderNode.shadowRadius = 30;
1965
1966class MyNodeController extends NodeController {
1967  private rootNode: FrameNode | null = null;
1968
1969  makeNode(uiContext: UIContext): FrameNode | null {
1970    this.rootNode = new FrameNode(uiContext);
1971
1972    const rootRenderNode = this.rootNode.getRenderNode();
1973    if (rootRenderNode !== null) {
1974      rootRenderNode.appendChild(renderNode);
1975    }
1976
1977    return this.rootNode;
1978  }
1979}
1980
1981@Entry
1982@Component
1983struct Index {
1984  private myNodeController: MyNodeController = new MyNodeController();
1985  build() {
1986    Row() {
1987      NodeContainer(this.myNodeController)
1988    }
1989  }
1990}
1991```
1992
1993![shadowRadius](./figures/ShadowRadius.jpg)
1994
1995get shadowRadius(): number
1996
1997Obtains the shadow blur radius of this RenderNode.
1998
1999**System capability**: SystemCapability.ArkUI.ArkUI.Full
2000
2001**Return value**
2002
2003| Type  | Description                                     |
2004| ------ | ----------------------------------------- |
2005| number | Shadow blur radius of the current RenderNode. The default value is **0**.|
2006
2007```ts
2008import { RenderNode, FrameNode, NodeController } from "@ohos.arkui.node"
2009
2010const renderNode = new RenderNode();
2011const shadowRadius = renderNode.shadowRadius;
2012
2013class MyNodeController extends NodeController {
2014  private rootNode: FrameNode | null = null;
2015
2016  makeNode(uiContext: UIContext): FrameNode | null {
2017    this.rootNode = new FrameNode(uiContext);
2018
2019    const rootRenderNode = this.rootNode.getRenderNode();
2020    if (rootRenderNode !== null) {
2021      rootRenderNode.appendChild(renderNode);
2022    }
2023
2024    return this.rootNode;
2025  }
2026}
2027
2028@Entry
2029@Component
2030struct Index {
2031  private myNodeController: MyNodeController = new MyNodeController();
2032  build() {
2033    Row() {
2034      NodeContainer(this.myNodeController)
2035    }
2036  }
2037}
2038```
2039
2040### draw
2041
2042draw(context: DrawContext): void
2043
2044Performs drawing. You need to implement this API. It is called when the RenderNode performs drawing.
2045
2046**System capability**: SystemCapability.ArkUI.ArkUI.Full
2047
2048**Parameters**
2049
2050| Name | Type                                                  | Mandatory| Description            |
2051| ------- | ------------------------------------------------------ | ---- | ---------------- |
2052| context | [DrawContext](./js-apis-arkui-graphics.md#drawcontext) | Yes  | Graphics drawing context.|
2053
2054**Example**
2055
2056Code in ArkTS:
2057
2058```ts
2059// Index.ets
2060import bridge from "libentry.so" // This .so file is compiled and generated by you using the N-API.
2061import { RenderNode, DrawContext, NodeController, FrameNode } from "@ohos.arkui.node"
2062
2063class MyRenderNode extends RenderNode {
2064  draw(context: DrawContext) {
2065    // The width and height in the context need to be converted from vp to px.
2066    bridge.nativeOnDraw(0, context, vp2px(context.size.height), vp2px(context.size.width));
2067  }
2068}
2069
2070class MyNodeController extends NodeController {
2071  private rootNode: FrameNode | null = null;
2072
2073  makeNode(uiContext: UIContext): FrameNode | null {
2074    this.rootNode = new FrameNode(uiContext);
2075
2076    const rootRenderNode = this.rootNode.getRenderNode();
2077    if (rootRenderNode !== null) {
2078      const renderNode = new MyRenderNode();
2079      renderNode.size = { width: 100, height: 100 }
2080      rootRenderNode.appendChild(renderNode);
2081    }
2082
2083    return this.rootNode;
2084  }
2085}
2086
2087@Entry
2088@Component
2089struct Index {
2090  private myNodeController: MyNodeController = new MyNodeController();
2091  build() {
2092    Row() {
2093      NodeContainer(this.myNodeController)
2094    }
2095  }
2096}
2097```
2098
2099The C++ side can obtain the canvas through the N-API and perform subsequent custom drawing operations.
2100
2101```c++
2102// native_bridge.cpp
2103#include "napi/native_api.h"
2104#include <native_drawing/drawing_canvas.h>
2105#include <native_drawing/drawing_color.h>
2106#include <native_drawing/drawing_path.h>
2107#include <native_drawing/drawing_pen.h>
2108
2109static napi_value OnDraw(napi_env env, napi_callback_info info)
2110{
2111    size_t argc = 4;
2112    napi_value args[4] = { nullptr };
2113    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
2114
2115    int32_t id;
2116    napi_get_value_int32(env, args[0], &id);
2117
2118    // Obtain the pointer to the canvas.
2119    void* temp = nullptr;
2120    napi_unwrap(env, args[1], &temp);
2121    OH_Drawing_Canvas *canvas = reinterpret_cast<OH_Drawing_Canvas*>(temp);
2122
2123    // Obtain the canvas width.
2124    int32_t width;
2125    napi_get_value_int32(env, args[2], &width);
2126
2127    // Obtain the canvas height.
2128    int32_t height;
2129    napi_get_value_int32(env, args[3], &height);
2130
2131    // Pass in information such as the canvas, height, and width to the drawing API for customized drawing.
2132    auto path = OH_Drawing_PathCreate();
2133    OH_Drawing_PathMoveTo(path, width / 4, height / 4);
2134    OH_Drawing_PathLineTo(path, width * 3 / 4, height / 4);
2135    OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4);
2136    OH_Drawing_PathLineTo(path, width / 4, height * 3 / 4);
2137    OH_Drawing_PathLineTo(path, width / 4, height / 4);
2138    OH_Drawing_PathClose(path);
2139
2140    auto pen = OH_Drawing_PenCreate();
2141    OH_Drawing_PenSetWidth(pen, 10);
2142    OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));
2143    OH_Drawing_CanvasAttachPen(canvas, pen);
2144
2145    OH_Drawing_CanvasDrawPath(canvas, path);
2146
2147    return nullptr;
2148}
2149
2150EXTERN_C_START
2151static napi_value Init(napi_env env, napi_value exports)
2152{
2153    napi_property_descriptor desc[] = {
2154        { "nativeOnDraw", nullptr, OnDraw, nullptr, nullptr, nullptr, napi_default, nullptr }
2155    };
2156    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
2157    return exports;
2158}
2159EXTERN_C_END
2160
2161static napi_module demoModule = {
2162    .nm_version =1,
2163    .nm_flags = 0,
2164    .nm_filename = nullptr,
2165    .nm_register_func = Init,
2166    .nm_modname = "entry",
2167    .nm_priv = ((void*)0),
2168    .reserved = { 0 },
2169};
2170
2171extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
2172{
2173    napi_module_register(&demoModule);
2174}
2175```
2176
2177Add the following content to the **src/main/cpp/CMakeLists.txt** file of the project:
2178```cmake
2179# the minimum version of CMake.
2180cmake_minimum_required(VERSION 3.4.1)
2181project(NapiTest)
2182
2183set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
2184
2185include_directories(${NATIVERENDER_ROOT_PATH}
2186                    ${NATIVERENDER_ROOT_PATH}/include)
2187
2188add_library(entry SHARED native_bridge.cpp)
2189target_link_libraries(entry PUBLIC libace_napi.z.so)
2190target_link_libraries(entry PUBLIC libace_ndk.z.so)
2191target_link_libraries(entry PUBLIC libnative_drawing.so)
2192```
2193
2194In 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:
2195```ts
2196import { DrawContext } from "@ohos.arkui.node"
2197
2198export const nativeOnDraw: (id: number, context: DrawContext, width: number, height: number) => number;
2199```
2200
2201### invalidate
2202
2203invalidate(): void
2204
2205Triggers the re-rendering of this RenderNode.
2206
2207**System capability**: SystemCapability.ArkUI.ArkUI.Full
2208
2209**Example**
2210
2211```ts
2212import bridge from "libentry.so" // This .so file is compiled and generated by you using the N-API.
2213import { RenderNode, DrawContext, FrameNode, NodeController } from "@ohos.arkui.node"
2214
2215class MyRenderNode extends RenderNode {
2216  draw(context: DrawContext) {
2217    // The width and height in the context need to be converted from vp to px.
2218    bridge.nativeOnDraw(0, context, vp2px(context.size.height), vp2px(context.size.width));
2219  }
2220}
2221
2222const newNode = new MyRenderNode();
2223newNode.size = { width: 100, height: 100 };
2224
2225class MyNodeController extends NodeController {
2226  private rootNode: FrameNode | null = null;
2227
2228  makeNode(uiContext: UIContext): FrameNode | null {
2229    this.rootNode = new FrameNode(uiContext);
2230    const renderNode = this.rootNode.getRenderNode();
2231    if (renderNode === null) {
2232      return this.rootNode;
2233    }
2234    renderNode.appendChild(newNode);
2235    return this.rootNode;
2236  }
2237}
2238
2239@Entry
2240@Component
2241struct Index {
2242  build() {
2243    Column() {
2244      Column() {
2245        NodeContainer(new MyNodeController())
2246          .width('100%')
2247        Button('Invalidate')
2248          .onClick(() => {
2249            newNode.invalidate()
2250          })
2251      }
2252      .width('100%')
2253      .height('100%')
2254    }
2255    .height('100%')
2256  }
2257}
2258```
2259
2260For details about how to build **libentry.so**, see the example of the **draw** API.
2261