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