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 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 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