1# RenderNode 2 3提供自绘制渲染节点RenderNode,支持开发者通过C API进行开发,完成自定义绘制需求。 4 5> **说明:** 6> 7> 本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 8> 9> 当前不支持在预览器中使用RenderNode。 10> 11> 不建议对BuilderNode中的RenderNode进行修改操作。 12 13## 导入模块 14 15```ts 16import { RenderNode } from '@kit.ArkUI'; 17``` 18 19## RenderNode 20 21### constructor 22 23constructor() 24 25RenderNode的构造函数。 26 27**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 28 29**系统能力:** SystemCapability.ArkUI.ArkUI.Full 30 31**示例:** 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 72在RenderNode最后一个子节点后添加新的子节点。 73 74**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 75 76**系统能力:** SystemCapability.ArkUI.ArkUI.Full 77 78**参数:** 79 80| 参数名 | 类型 | 必填 | 说明 | 81| ------ | ------------------------- | ---- | ---------------------- | 82| node | [RenderNode](#rendernode) | 是 | 需要添加的RenderNode。 | 83 84**示例:** 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 129在RenderNode指定子节点之后添加新的子节点。 130 131**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 132 133**系统能力:** SystemCapability.ArkUI.ArkUI.Full 134 135**参数:** 136 137| 参数名 | 类型 | 必填 | 说明 | 138| ------- | ------------------------------------------- | ---- | ---------------------------------------------------------------------------- | 139| child | [RenderNode](#rendernode) | 是 | 需要添加的子节点。 | 140| sibling | [RenderNode](#rendernode) \| null | 是 | 新节点将插入到该节点之后。若该参数设置为空,则新节点将插入到首个子节点之前。 | 141 142**示例:** 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 195从RenderNode中删除指定的子节点。 196 197**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 198 199**系统能力:** SystemCapability.ArkUI.ArkUI.Full 200 201**参数:** 202 203| 参数名 | 类型 | 必填 | 说明 | 204| ------ | ------------------------- | ---- | ------------------ | 205| node | [RenderNode](#rendernode) | 是 | 需要删除的子节点。 | 206 207**示例:** 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 255清除当前RenderNode的所有子节点。 256 257**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 258 259**系统能力:** SystemCapability.ArkUI.ArkUI.Full 260 261**示例:** 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 315获取当前节点指定位置的子节点。 316 317**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 318 319**系统能力:** SystemCapability.ArkUI.ArkUI.Full 320 321**参数:** 322 323| 参数名 | 类型 | 必填 | 说明 | 324| ------- | ------- | ---- | ------------------ | 325| index | number | 是 | 需要查询的子节点的序列号。 | 326 327**返回值:** 328 329| 类型 | 说明 | 330| --------------------------------- | ---------------------------------------------------------- | 331| [RenderNode](#rendernode) \| null | 子节点。若该RenderNode不包含所查询的子节点,则返回空对象null。 | 332 333**示例:** 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 395获取当前RenderNode的第一个子节点。 396 397**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 398 399**系统能力:** SystemCapability.ArkUI.ArkUI.Full 400 401**返回值:** 402 403| 类型 | 说明 | 404| --------------------------------- | ---------------------------------------------------------- | 405| [RenderNode](#rendernode) \| null | 首个子节点。若该RenderNode不包含子节点,则返回空对象null。 | 406 407**示例:** 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 465获取当前RenderNode的下一个同级节点。 466 467**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 468 469**系统能力:** SystemCapability.ArkUI.ArkUI.Full 470 471**返回值:** 472 473| 类型 | 说明 | 474| --------------------------------- | -------------------------------------------------------------------------------------- | 475| [RenderNode](#rendernode) \| null | 当前RenderNode的下一个同级节点。若该RenderNode不包含下一个同级节点,则返回空对象null。 | 476 477**示例:** 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 536获取当前RenderNode的上一个同级节点。 537 538**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 539 540**系统能力:** SystemCapability.ArkUI.ArkUI.Full 541 542**返回值:** 543 544| 类型 | 说明 | 545| --------------------------------- | -------------------------------------------------------------------------------------- | 546| [RenderNode](#rendernode) \| null | 当前RenderNode的上一个同级节点。若该RenderNode不包含上一个同级节点,则返回空对象null。 | 547 548**示例:** 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 607设置当前RenderNode的背景颜色。 608 609**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 610 611**系统能力:** SystemCapability.ArkUI.ArkUI.Full 612 613**参数:** 614 615| 参数名 | 类型 | 必填 | 说明 | 616| ------ | ------ | ---- | ---------------------- | 617| color | number | 是 | 背景颜色值,ARGB格式,示例:0xE5E5E5。 | 618 619get backgroundColor(): number 620 621获取当前RenderNode的背景颜色。 622 623**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 624 625**系统能力:** SystemCapability.ArkUI.ArkUI.Full 626 627**返回值:** 628 629| 类型 | 说明 | 630| ------ | ---------------------------------------------- | 631| number | 当前RenderNode的背景颜色,默认值为0X00000000。 | 632 633**示例:** 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 673设置是否对当前RenderNode剪裁。若设置为true,则超出该RenderNode大小的部分将会被截断。 674 675**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 676 677**系统能力:** SystemCapability.ArkUI.ArkUI.Full 678 679**参数:** 680 681| 参数名 | 类型 | 必填 | 说明 | 682| ------- | ------- | ---- | ------------------ | 683| useClip | boolean | 是 | 设置是否进行剪裁。<br/>true表示对当前RenderNode剪裁,false表示不对当前RenderNode剪裁。 | 684 685get clipToFrame(): boolean 686 687获取当前RenderNode是否需要进行剪裁。 688 689**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 690 691**系统能力:** SystemCapability.ArkUI.ArkUI.Full 692 693**返回值:** 694 695| 类型 | 说明 | 696| ------- | --------------------------------------------------- | 697| boolean | 获取当前RenderNode是否需要进行剪裁,默认值为true。<br/>true表示对当前RenderNode剪裁,false表示不对当前RenderNode剪裁。 | 698 699**示例:** 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 746设置当前RenderNode的不透明度。若输入的数值小于0,会被视为0。若输入的数值大于1,会被视为1。 747 748**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 749 750**系统能力:** SystemCapability.ArkUI.ArkUI.Full 751 752**参数:** 753 754| 参数名 | 类型 | 必填 | 说明 | 755| ------ | ------ | ---- | -------------------------------------- | 756| value | number | 是 | 将要设置的不透明度,数据范围为[0, 1],值越大透明度越低。 | 757 758get opacity(): number 759 760获取当前RenderNode的不透明度。 761 762**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 763 764**系统能力:** SystemCapability.ArkUI.ArkUI.Full 765 766**返回值:** 767 768| 类型 | 说明 | 769| ------ | ----------------------------------------- | 770| number | 获取当前RenderNode的不透明度,默认值为1,不透明。 | 771 772**示例:** 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 814设置当前RenderNode的大小。 815 816**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 817 818**系统能力:** SystemCapability.ArkUI.ArkUI.Full 819 820**参数:** 821 822| 参数名 | 类型 | 必填 | 说明 | 823| ------ | ---------------------------------------- | ---- | ---------------------------- | 824| size | [Size](./js-apis-arkui-graphics.md#size) | 是 | 将要设置的RenderNode的大小。 | 825 826get size(): Size 827 828获取当前RenderNode的大小。 829 830**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 831 832**系统能力:** SystemCapability.ArkUI.ArkUI.Full 833 834**返回值:** 835 836| 名称 | 说明 | 837| ---------------------------------------- | ----------------------------------------------- | 838| [Size](./js-apis-arkui-graphics.md#size) | 获取当前RenderNode的大小,默认值宽度和高度为0。 | 839 840**示例:** 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 881设置当前RenderNode的位置。 882 883**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 884 885**系统能力:** SystemCapability.ArkUI.ArkUI.Full 886 887**参数:** 888 889| 参数名 | 类型 | 必填 | 说明 | 890| -------- | ------------------------------------------------ | ---- | ---------------------------- | 891| position | [Position](./js-apis-arkui-graphics.md#position) | 是 | 将要设置的RenderNode的位置。 | 892 893get position(): Position 894 895获取当前RenderNode的位置。 896 897**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 898 899**系统能力:** SystemCapability.ArkUI.ArkUI.Full 900 901**返回值:** 902 903| 类型 | 说明 | 904| ------------------------------------------------ | ---------------------------------------------------- | 905| [Position](./js-apis-arkui-graphics.md#position) | 获取当前RenderNode的位置,默认位置为{ x: 0, y: 0 }。 | 906 907**示例:** 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 949设置当前RenderNode的大小和位置。当和[position](#position)、[size](#size)同时使用时,以后设置的为准。 950 951**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 952 953**系统能力:** SystemCapability.ArkUI.ArkUI.Full 954 955**参数:** 956 957| 参数名 | 类型 | 必填 | 说明 | 958| ------ | ------------------------------------------ | ---- | -------------------------------- | 959| frame | [Frame](./js-apis-arkui-graphics.md#frame) | 是 | 将要设置的RenderNode的大小和位置。 | 960 961get frame(): Frame 962 963获取当前RenderNode的大小和位置。 964 965**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 966 967**系统能力:** SystemCapability.ArkUI.ArkUI.Full 968 969**返回值:** 970 971| 类型 | 说明 | 972| --------------- | ----------------------------------------------------------------------------- | 973| [Frame](#frame) | 获取当前RenderNode的大小和位置,默认值为{ x: 0, y: 0, width: 0, height: 0 }。 | 974 975**示例:** 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 1016设置当前RenderNode的轴心,影响RenderNode的缩放和旋转效果。 1017 1018**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1019 1020**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1021 1022**参数:** 1023 1024| 参数名 | 类型 | 必填 | 说明 | 1025| ------ | ------------------------------------------ | ---- | ---------------------------- | 1026| pivot | [Pivot](./js-apis-arkui-graphics.md#pivot) | 是 | 将要设置的RenderNode的轴心。 | 1027 1028get pivot(): Pivot 1029 1030获取当前RenderNode的轴心。 1031 1032**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1033 1034**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1035 1036**返回值:** 1037 1038| 类型 | 说明 | 1039| ------------------------------------------ | ----------------------------------------------------- | 1040| [Pivot](./js-apis-arkui-graphics.md#pivot) | 获取当前RenderNode的轴心,默认值为{ x: 0.5, y: 0.5}。 | 1041 1042**示例:** 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 1086设置当前RenderNode的比例。 1087 1088**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1089 1090**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1091 1092**参数:** 1093 1094| 参数名 | 类型 | 必填 | 说明 | 1095| ------ | ------------------------------------------ | ---- | -------------------------------- | 1096| scale | [Scale](./js-apis-arkui-graphics.md#scale) | 是 | 将要设置的RenderNode的缩放比例。 | 1097 1098get scale(): Scale 1099 1100获取当前RenderNode的比例。 1101 1102**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1103 1104**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1105 1106**返回值:** 1107 1108| 类型 | 说明 | 1109| ------------------------------------------ | -------------------------------------------------- | 1110| [Scale](./js-apis-arkui-graphics.md#scale) | 获取当前RenderNode的比例,默认值为{ x: 1, y: 1 }。 | 1111 1112**示例:** 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 1154设置当前RenderNode的平移量。 1155 1156**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1157 1158**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1159 1160**参数:** 1161 1162| 参数名 | 类型 | 必填 | 说明 | 1163| ----------- | ------------------------------------------------------ | ---- | ------------------------------ | 1164| translation | [Translation](./js-apis-arkui-graphics.md#translation) | 是 | 将要设置的RenderNode的平移量。 | 1165 1166get translation(): Translation 1167 1168获取当前RenderNode的平移量。 1169 1170**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1171 1172**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1173 1174**返回值:** 1175 1176| 类型 | 说明 | 1177| ------------------------------------------------------ | ---------------------------------------------------- | 1178| [Translation](./js-apis-arkui-graphics.md#translation) | 获取当前RenderNode的平移量,默认值为{ x: 0, y: 0 }。 | 1179 1180**示例:** 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 1222设置当前RenderNode的旋转角度。 1223 1224**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1225 1226**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1227 1228**参数:** 1229 1230| 参数名 | 类型 | 必填 | 说明 | 1231| -------- | ------------------------------------------------ | ---- | -------------------------------- | 1232| rotation | [Rotation](./js-apis-arkui-graphics.md#rotation) | 是 | 将要设置的RenderNode的旋转角度。 | 1233 1234get rotation(): Rotation 1235 1236获取当前RenderNode的旋转角度。 1237 1238**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1239 1240**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1241 1242**返回值:** 1243 1244| 类型 | 说明 | 1245| ------------------------------------------------ | ------------------------------------------------------- | 1246| [Rotation](./js-apis-arkui-graphics.md#rotation) | 当前RenderNode的旋转角度。默认值为{ x: 0, y: 0, z: 0}。 | 1247 1248**示例:** 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 1290设置当前RenderNode的变换矩阵。 1291 1292**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1293 1294**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1295 1296**参数:** 1297 1298| 参数名 | 类型 | 必填 | 说明 | 1299| --------- | ---------------------------------------------- | ---- | -------------------------------- | 1300| transform | [Matrix4](./js-apis-arkui-graphics.md#matrix4) | 是 | 将要设置的RenderNode的变换矩阵。 | 1301 1302get transform(): Matrix4 1303 1304获取当前RenderNode的变换矩阵。默认值为: 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**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1315 1316**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1317 1318**返回值:** 1319 1320| 类型 | 说明 | 1321| ---------------------------------------------- | -------------------------- | 1322| [Matrix4](./js-apis-arkui-graphics.md#matrix4) | 当前RenderNode的变换矩阵。 | 1323 1324**示例:** 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 1371设置当前RenderNode的阴影颜色,ARGB格式。若设置了[shadowAlpha](#shadowalpha),则不透明度以shadowAlpha为准。 1372 1373**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1374 1375**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1376 1377**参数:** 1378 1379| 参数名 | 类型 | 必填 | 说明 | 1380| ------ | ------ | ---- | ------------------------------------------ | 1381| color | number | 是 | 将要设置的RenderNode的阴影颜色,ARGB格式。<br/>取值范围是符合ARGB格式的颜色。 | 1382 1383get shadowColor(): number 1384 1385获取当前RenderNode的阴影颜色。 1386 1387**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1388 1389**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1390 1391**返回值:** 1392 1393| 类型 | 说明 | 1394| ------ | -------------------------------------------------------- | 1395| number | 当前RenderNode的阴影颜色,ARGB格式,默认值为0X00000000。 | 1396 1397**示例:** 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 1440设置当前RenderNode的阴影偏移。 1441 1442**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1443 1444**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1445 1446**参数:** 1447 1448| 参数名 | 类型 | 必填 | 说明 | 1449| ------ | -------------------------------------------- | ---- | -------------------------------- | 1450| offset | [Offset](./js-apis-arkui-graphics.md#offset) | 是 | 将要设置的RenderNode的阴影偏移。 | 1451 1452get shadowOffset(): Offset 1453 1454获取当前RenderNode的阴影偏移。 1455 1456**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1457 1458**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1459 1460**返回值:** 1461 1462| 类型 | 说明 | 1463| -------------------------------------------- | -------------------------------------------------- | 1464| [Offset](./js-apis-arkui-graphics.md#offset) | 当前RenderNode的阴影偏移,默认值为{ x: 0, y: 0 }。 | 1465 1466**示例:** 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 1511设置当前RenderNode的标签。若当前节点是通过new创建的RenderNode,则设置的标签信息会在节点Inspector信息的属性中。 1512 1513**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1514 1515**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1516 1517**参数:** 1518 1519| 参数名 | 类型 | 必填 | 说明 | 1520| ------ | ------ | ---- | ----------------------------------------- | 1521| label | string | 是 | 将要设置的RenderNode的标签。 | 1522 1523get label(): string 1524 1525获取当前RenderNode的标签。 1526 1527**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1528 1529**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1530 1531**返回值:** 1532 1533| 类型 | 说明 | 1534| ------ | ---------------------------------------------- | 1535| string | 当前RenderNode的标签,默认值为""。 | 1536 1537**示例:** 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 1580设置当前RenderNode的阴影颜色的Alpha值。 1581 1582**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1583 1584**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1585 1586**参数:** 1587 1588| 参数名 | 类型 | 必填 | 说明 | 1589| ------ | ------ | ---- | ----------------------------------------- | 1590| alpha | number | 是 | 将要设置的RenderNode的阴影颜色的Alpha值。<br/> 取值范围是alpha值。 | 1591 1592get shadowAlpha(): number 1593 1594获取当前RenderNode的阴影颜色的Alpha值。 1595 1596**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1597 1598**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1599 1600**返回值:** 1601 1602| 类型 | 说明 | 1603| ------ | ---------------------------------------------- | 1604| number | 当前RenderNode的阴影颜色的Alpha值,默认值为0。 | 1605 1606**示例:** 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 1652设置当前RenderNode的阴影的光照高度。 1653 1654**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1655 1656**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1657 1658**参数:** 1659 1660| 参数名 | 类型 | 必填 | 说明 | 1661| --------- | ------ | ---- | -------------------------------- | 1662| elevation | number | 是 | 将要设置的RenderNode的光照高度。<br/> 取值范围:[0, +∞) | 1663 1664get shadowElevation(): number 1665 1666获取当前RenderNode的阴影的光照高度。 1667 1668**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1669 1670**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1671 1672**返回值:** 1673 1674| 类型 | 说明 | 1675| ------ | ------------------------------------- | 1676| number | 当前RenderNode的阴影高度,默认值为0。 <br/> 取值范围:[0, +∞) | 1677 1678**示例:** 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 1725设置当前RenderNode的阴影模糊半径。 1726 1727**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1728 1729**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1730 1731**参数:** 1732 1733| 参数名 | 类型 | 必填 | 说明 | 1734| ------ | ------ | ---- | ------------------------------------ | 1735| radius | number | 是 | 将要设置的RenderNode的阴影模糊半径。<br/> 取值范围:[0, +∞) | 1736 1737get shadowRadius(): number 1738 1739获取当前RenderNode的阴影模糊半径。 1740 1741**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1742 1743**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1744 1745**返回值:** 1746 1747| 类型 | 说明 | 1748| ------ | ----------------------------------------- | 1749| number | 当前RenderNode的阴影模糊半径,默认值为0。<br/> 取值范围:[0, +∞) | 1750 1751**示例:** 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 1804绘制方法,需要开发者进行实现。该方法会在RenderNode进行绘制时被调用。 1805 1806**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1807 1808**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1809 1810**参数:** 1811 1812| 参数名 | 类型 | 必填 | 说明 | 1813| ------- | ------------------------------------------------------ | ---- | ---------------- | 1814| context | [DrawContext](./js-apis-arkui-graphics.md#drawcontext) | 是 | 图形绘制上下文。 | 1815 1816**示例:** 1817 1818ArkTS侧代码: 1819 1820```ts 1821// Index.ets 1822import bridge from "libentry.so" // 该 so 由开发者通过 NAPI 编写并生成 1823import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI'; 1824 1825class MyRenderNode extends RenderNode { 1826 uiContext: UIContext; 1827 1828 constructor(uiContext: UIContext) { 1829 super(); 1830 this.uiContext = uiContext; 1831 } 1832 1833 draw(context: DrawContext) { 1834 // 需要将 context 中的宽度和高度从vp转换为px 1835 bridge.nativeOnDraw(0, context, this.uiContext.vp2px(context.size.height), this.uiContext.vp2px(context.size.width)); 1836 } 1837} 1838 1839class MyNodeController extends NodeController { 1840 private rootNode: FrameNode | null = null; 1841 1842 makeNode(uiContext: UIContext): FrameNode | null { 1843 this.rootNode = new FrameNode(uiContext); 1844 1845 const rootRenderNode = this.rootNode.getRenderNode(); 1846 if (rootRenderNode !== null) { 1847 const renderNode = new MyRenderNode(uiContext); 1848 renderNode.size = { width: 100, height: 100 } 1849 rootRenderNode.appendChild(renderNode); 1850 } 1851 1852 return this.rootNode; 1853 } 1854} 1855 1856@Entry 1857@Component 1858struct Index { 1859 private myNodeController: MyNodeController = new MyNodeController(); 1860 build() { 1861 Row() { 1862 NodeContainer(this.myNodeController) 1863 } 1864 } 1865} 1866``` 1867 1868C++侧可通过NAPI来获取Canvas,并进行后续的自定义绘制操作。 1869 1870```c++ 1871// native_bridge.cpp 1872#include "napi/native_api.h" 1873#include <native_drawing/drawing_canvas.h> 1874#include <native_drawing/drawing_color.h> 1875#include <native_drawing/drawing_path.h> 1876#include <native_drawing/drawing_pen.h> 1877 1878static napi_value OnDraw(napi_env env, napi_callback_info info) 1879{ 1880 size_t argc = 4; 1881 napi_value args[4] = { nullptr }; 1882 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 1883 1884 int32_t id; 1885 napi_get_value_int32(env, args[0], &id); 1886 1887 // 获取 Canvas 指针 1888 void* temp = nullptr; 1889 napi_unwrap(env, args[1], &temp); 1890 OH_Drawing_Canvas *canvas = reinterpret_cast<OH_Drawing_Canvas*>(temp); 1891 1892 // 获取 Canvas 宽度 1893 int32_t width; 1894 napi_get_value_int32(env, args[2], &width); 1895 1896 // 获取 Canvas 高度 1897 int32_t height; 1898 napi_get_value_int32(env, args[3], &height); 1899 1900 // 传入canvas、height、width等信息至绘制函数中进行自定义绘制 1901 auto path = OH_Drawing_PathCreate(); 1902 OH_Drawing_PathMoveTo(path, width / 4, height / 4); 1903 OH_Drawing_PathLineTo(path, width * 3 / 4, height / 4); 1904 OH_Drawing_PathLineTo(path, width * 3 / 4, height * 3 / 4); 1905 OH_Drawing_PathLineTo(path, width / 4, height * 3 / 4); 1906 OH_Drawing_PathLineTo(path, width / 4, height / 4); 1907 OH_Drawing_PathClose(path); 1908 1909 auto pen = OH_Drawing_PenCreate(); 1910 OH_Drawing_PenSetWidth(pen, 10); 1911 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00)); 1912 OH_Drawing_CanvasAttachPen(canvas, pen); 1913 1914 OH_Drawing_CanvasDrawPath(canvas, path); 1915 1916 return nullptr; 1917} 1918 1919EXTERN_C_START 1920static napi_value Init(napi_env env, napi_value exports) 1921{ 1922 napi_property_descriptor desc[] = { 1923 { "nativeOnDraw", nullptr, OnDraw, nullptr, nullptr, nullptr, napi_default, nullptr } 1924 }; 1925 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 1926 return exports; 1927} 1928EXTERN_C_END 1929 1930static napi_module demoModule = { 1931 .nm_version =1, 1932 .nm_flags = 0, 1933 .nm_filename = nullptr, 1934 .nm_register_func = Init, 1935 .nm_modname = "entry", 1936 .nm_priv = ((void*)0), 1937 .reserved = { 0 }, 1938}; 1939 1940extern "C" __attribute__((constructor)) void RegisterEntryModule(void) 1941{ 1942 napi_module_register(&demoModule); 1943} 1944``` 1945 1946修改工程中的`src/main/cpp/CMakeLists.txt`文件,添加如下内容: 1947 1948<!--code_no_check--> 1949 1950```cmake 1951# the minimum version of CMake. 1952cmake_minimum_required(VERSION 3.4.1) 1953project(NapiTest) 1954 1955set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) 1956 1957include_directories(${NATIVERENDER_ROOT_PATH} 1958 ${NATIVERENDER_ROOT_PATH}/include) 1959 1960add_library(entry SHARED native_bridge.cpp) 1961target_link_libraries(entry PUBLIC libace_napi.z.so) 1962target_link_libraries(entry PUBLIC libace_ndk.z.so) 1963target_link_libraries(entry PUBLIC libnative_drawing.so) 1964``` 1965 1966同时在工程中的`src/main/cpp/types/libentry/index.d.ts`文件中,添加自定义绘制函数在ArkTs侧的定义,如: 1967 1968<!--code_no_check--> 1969 1970```ts 1971import { DrawContext } from '@kit.ArkUI'; 1972 1973export const nativeOnDraw: (id: number, context: DrawContext, width: number, height: number) => number; 1974``` 1975 1976### invalidate 1977 1978invalidate(): void 1979 1980该方法会触发RenderNode的重新渲染。 1981 1982**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1983 1984**系统能力:** SystemCapability.ArkUI.ArkUI.Full 1985 1986**示例:** 1987 1988```ts 1989import bridge from "libentry.so" // 该 so 由开发者通过 NAPI 编写并生成 1990import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI'; 1991 1992class MyRenderNode extends RenderNode { 1993 uiContext: UIContext; 1994 1995 constructor(uiContext: UIContext) { 1996 super(); 1997 this.uiContext = uiContext; 1998 } 1999 2000 draw(context: DrawContext) { 2001 // 需要将 context 中的宽度和高度从vp转换为px 2002 bridge.nativeOnDraw(0, context, this.uiContext.vp2px(context.size.height), this.uiContext.vp2px(context.size.width)); 2003 } 2004} 2005 2006class MyNodeController extends NodeController { 2007 private rootNode: FrameNode | null = null; 2008 newNode: MyRenderNode | null = null; 2009 2010 makeNode(uiContext: UIContext): FrameNode | null { 2011 this.rootNode = new FrameNode(uiContext); 2012 const renderNode = this.rootNode.getRenderNode(); 2013 if (renderNode === null) { 2014 return this.rootNode; 2015 } 2016 this.newNode = new MyRenderNode(uiContext); 2017 this.newNode.size = { width: 100, height: 100 }; 2018 renderNode.appendChild(this.newNode); 2019 return this.rootNode; 2020 } 2021} 2022 2023@Entry 2024@Component 2025struct Index { 2026 private myNodeController: MyNodeController = new MyNodeController(); 2027 2028 build() { 2029 Column() { 2030 Column() { 2031 NodeContainer(this.myNodeController) 2032 .width('100%') 2033 Button('Invalidate') 2034 .onClick(() => { 2035 this.myNodeController.newNode?.invalidate() 2036 }) 2037 } 2038 .width('100%') 2039 .height('100%') 2040 } 2041 .height('100%') 2042 } 2043} 2044``` 2045 2046`libentry.so`的构建方式见draw方法的示例。 2047 2048### borderStyle<sup>12+</sup> 2049 2050set borderStyle(style: Edges\<BorderStyle>) 2051 2052设置当前RenderNode的边框样式。 2053 2054**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2055 2056**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2057 2058**参数:** 2059 2060| 参数名 | 类型 | 必填 | 说明 | 2061| ------ | ------------------------------------------------------------------------------------------------------ | ---- | ---------------------- | 2062| style | [Edges](./js-apis-arkui-graphics.md#edgest12)<[BorderStyle](./arkui-ts/ts-appendix-enums.md#borderstyle)> | 是 | RenderNode的边框样式。 | 2063 2064get borderStyle(): Edges\<BorderStyle> 2065 2066获取当前RenderNode的边框样式。 2067 2068**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2069 2070**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2071 2072**返回值:** 2073 2074| 类型 | 说明 | 2075| ------------------------------------------------------------------------------------------------------ | ---------------------- | 2076| [Edges](./js-apis-arkui-graphics.md#edgest12)<[BorderStyle](./arkui-ts/ts-appendix-enums.md#borderstyle)> | RenderNode的边框样式。 | 2077 2078**示例:** 2079```ts 2080import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI'; 2081 2082const renderNode = new RenderNode(); 2083renderNode.frame = { x: 0, y: 0, width: 150, height: 150 }; 2084renderNode.backgroundColor = 0XFF00FF00; 2085renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 }; 2086renderNode.borderStyle = { 2087 left: BorderStyle.Solid, 2088 top: BorderStyle.Dotted, 2089 right: BorderStyle.Dashed, 2090 bottom: BorderStyle.Solid 2091} 2092const borderStyle = renderNode.borderStyle; 2093 2094 2095class MyNodeController extends NodeController { 2096 private rootNode: FrameNode | null = null; 2097 2098 makeNode(uiContext: UIContext): FrameNode | null { 2099 this.rootNode = new FrameNode(uiContext); 2100 2101 const rootRenderNode = this.rootNode.getRenderNode(); 2102 if (rootRenderNode !== null) { 2103 rootRenderNode.appendChild(renderNode); 2104 } 2105 2106 return this.rootNode; 2107 } 2108} 2109 2110@Entry 2111@Component 2112struct Index { 2113 private myNodeController: MyNodeController = new MyNodeController(); 2114 2115 build() { 2116 Row() { 2117 NodeContainer(this.myNodeController) 2118 } 2119 } 2120} 2121``` 2122 2123### borderWidth<sup>12+</sup> 2124 2125set borderWidth(width: Edges\<number>) 2126 2127设置当前RenderNode的边框宽度。 2128 2129**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2130 2131**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2132 2133**参数:** 2134 2135| 参数名 | 类型 | 必填 | 说明 | 2136| ------ | --------------------------------------------------- | ---- | ---------------------- | 2137| width | [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | 是 | RenderNode的边框宽度,单位为vp。 | 2138 2139get borderWidth(): Edges\<number> 2140 2141获取当前RenderNode的边框宽度。 2142 2143**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2144 2145**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2146 2147**返回值:** 2148 2149| 类型 | 说明 | 2150| --------------------------------------------------- | ---------------------- | 2151| [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | RenderNode的边框宽度,默认所有边框宽度为0vp。 | 2152 2153**示例:** 2154 2155```ts 2156import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI'; 2157 2158const renderNode = new RenderNode(); 2159renderNode.frame = { x: 0, y: 0, width: 150, height: 150 }; 2160renderNode.backgroundColor = 0XFF00FF00; 2161renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 }; 2162const borderWidth = renderNode.borderWidth; 2163 2164 2165class MyNodeController extends NodeController { 2166 private rootNode: FrameNode | null = null; 2167 2168 makeNode(uiContext: UIContext): FrameNode | null { 2169 this.rootNode = new FrameNode(uiContext); 2170 2171 const rootRenderNode = this.rootNode.getRenderNode(); 2172 if (rootRenderNode !== null) { 2173 rootRenderNode.appendChild(renderNode); 2174 } 2175 2176 return this.rootNode; 2177 } 2178} 2179 2180@Entry 2181@Component 2182struct Index { 2183 private myNodeController: MyNodeController = new MyNodeController(); 2184 2185 build() { 2186 Row() { 2187 NodeContainer(this.myNodeController) 2188 } 2189 } 2190} 2191``` 2192 2193### borderColor<sup>12+</sup> 2194 2195set borderColor(color: Edges\<number>) 2196 2197设置当前RenderNode的边框颜色。 2198 2199**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2200 2201**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2202 2203**参数:** 2204 2205| 参数名 | 类型 | 必填 | 说明 | 2206| ------ | --------------------------------------------------- | ---- | ---------------------- | 2207| color | [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | 是 | RenderNode的边框颜色。 | 2208 2209get borderColor(): Edges\<number> 2210 2211获取当前RenderNode的边框颜色。 2212 2213**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2214 2215**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2216 2217**返回值:** 2218 2219| 类型 | 说明 | 2220| --------------------------------------------------- | ---------------------- | 2221| [Edges\<number>](./js-apis-arkui-graphics.md#edgest12) | RenderNode的边框颜色,默认所有边框颜色为0XFF000000。 | 2222 2223**示例:** 2224 2225```ts 2226import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI'; 2227 2228const renderNode = new RenderNode(); 2229renderNode.frame = { x: 0, y: 0, width: 150, height: 150 }; 2230renderNode.backgroundColor = 0XFF00FF00; 2231renderNode.borderWidth = { left: 8, top: 8, right: 8, bottom: 8 }; 2232renderNode.borderColor = { left: 0xFF0000FF, top: 0xFF0000FF, right: 0xFF0000FF, bottom: 0xFF0000FF }; 2233const borderColor = renderNode.borderColor; 2234 2235 2236class MyNodeController extends NodeController { 2237 private rootNode: FrameNode | null = null; 2238 2239 makeNode(uiContext: UIContext): FrameNode | null { 2240 this.rootNode = new FrameNode(uiContext); 2241 2242 const rootRenderNode = this.rootNode.getRenderNode(); 2243 if (rootRenderNode !== null) { 2244 rootRenderNode.appendChild(renderNode); 2245 } 2246 2247 return this.rootNode; 2248 } 2249} 2250 2251@Entry 2252@Component 2253struct Index { 2254 private myNodeController: MyNodeController = new MyNodeController(); 2255 2256 build() { 2257 Row() { 2258 NodeContainer(this.myNodeController) 2259 } 2260 } 2261} 2262``` 2263 2264### borderRadius<sup>12+</sup> 2265 2266set borderRadius(radius: BorderRadiuses) 2267 2268设置当前RenderNode的边框圆角。 2269 2270**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2271 2272**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2273 2274**参数:** 2275 2276| 参数名 | 类型 | 必填 | 说明 | 2277| ------ | ------------------------------------------------------------ | ---- | ---------------------- | 2278| radius | [BorderRadiuses](./js-apis-arkui-graphics.md#borderradiuses) | 是 | RenderNode的边框圆角,单位为vp。 | 2279 2280 2281get borderRadius(): BorderRadiuses 2282 2283获取当前RenderNode的边框圆角。 2284 2285**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2286 2287**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2288 2289**返回值:** 2290 2291| 类型 | 说明 | 2292| ------------------------------------------------------------ | ---------------------- | 2293| [BorderRadiuses](./js-apis-arkui-graphics.md#borderradiuses) | RenderNode的边框圆角,默认所有边框圆角为0vp。 | 2294 2295**示例:** 2296 2297```ts 2298import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI'; 2299 2300const renderNode = new RenderNode(); 2301renderNode.frame = { x: 0, y: 0, width: 150, height: 150 }; 2302renderNode.backgroundColor = 0XFF00FF00; 2303renderNode.borderRadius = { topLeft: 32, topRight: 32, bottomLeft: 32, bottomRight: 32 }; 2304const borderRadius = renderNode.borderRadius; 2305 2306 2307class MyNodeController extends NodeController { 2308 private rootNode: FrameNode | null = null; 2309 2310 makeNode(uiContext: UIContext): FrameNode | null { 2311 this.rootNode = new FrameNode(uiContext); 2312 2313 const rootRenderNode = this.rootNode.getRenderNode(); 2314 if (rootRenderNode !== null) { 2315 rootRenderNode.appendChild(renderNode); 2316 } 2317 2318 return this.rootNode; 2319 } 2320} 2321 2322@Entry 2323@Component 2324struct Index { 2325 private myNodeController: MyNodeController = new MyNodeController(); 2326 2327 build() { 2328 Row() { 2329 NodeContainer(this.myNodeController) 2330 } 2331 } 2332} 2333``` 2334 2335### shapeMask<sup>12+</sup> 2336 2337set shapeMask(shapeMask: ShapeMask) 2338 2339设置当前RenderNode的遮罩。 2340 2341**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2342 2343**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2344 2345**参数:** 2346 2347| 参数名 | 类型 | 必填 | 说明 | 2348| --------- | -------------------------------------------------- | ---- | ------------------ | 2349| shapeMask | [ShapeMask](./js-apis-arkui-graphics.md#shapemask12) | 是 | RenderNode的遮罩。 | 2350 2351get shapeMask(): ShapeMask 2352 2353获取当前RenderNode的遮罩。 2354 2355**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2356 2357**返回值:** 2358 2359| 类型 | 说明 | 2360| -------------------------------------------------- | ---------------------- | 2361| [ShapeMask](./js-apis-arkui-graphics.md#shapemask12) | RenderNode的边框遮罩。 | 2362 2363**示例:** 2364 2365```ts 2366import { RenderNode, FrameNode, NodeController, ShapeMask } from '@kit.ArkUI'; 2367 2368const mask = new ShapeMask(); 2369mask.setRectShape({ left: 0, right: 150, top: 0, bottom: 150 }); 2370mask.fillColor = 0X55FF0000; 2371mask.strokeColor = 0XFFFF0000; 2372mask.strokeWidth = 24; 2373 2374const renderNode = new RenderNode(); 2375renderNode.frame = { x: 0, y: 0, width: 150, height: 150 }; 2376renderNode.backgroundColor = 0XFF00FF00; 2377renderNode.shapeMask = mask; 2378const shapeMask = renderNode.shapeMask; 2379 2380 2381class MyNodeController extends NodeController { 2382 private rootNode: FrameNode | null = null; 2383 2384 makeNode(uiContext: UIContext): FrameNode | null { 2385 this.rootNode = new FrameNode(uiContext); 2386 2387 const rootRenderNode = this.rootNode.getRenderNode(); 2388 if (rootRenderNode !== null) { 2389 rootRenderNode.appendChild(renderNode); 2390 } 2391 2392 return this.rootNode; 2393 } 2394} 2395 2396@Entry 2397@Component 2398struct Index { 2399 private myNodeController: MyNodeController = new MyNodeController(); 2400 2401 build() { 2402 Row() { 2403 NodeContainer(this.myNodeController) 2404 } 2405 } 2406} 2407``` 2408 2409### shapeClip<sup>12+</sup> 2410 2411set shapeClip(shapeClip: ShapeClip) 2412 2413设置当前RenderNode的裁剪形状。 2414 2415**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2416 2417**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2418 2419**参数:** 2420 2421| 参数名 | 类型 | 必填 | 说明 | 2422| --------- | -------------------------------------------------- | ---- | ------------------ | 2423| shapeClip | [ShapeClip](./js-apis-arkui-graphics.md#shapeclip12) | 是 | RenderNode的裁剪形状。 | 2424 2425get shapeClip(): ShapeClip 2426 2427获取当前RenderNode的裁剪形状。 2428 2429**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2430 2431**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2432 2433**返回值:** 2434 2435| 类型 | 说明 | 2436| -------------------------------------------------- | ---------------------- | 2437| [ShapeClip](./js-apis-arkui-graphics.md#shapeclip12) | RenderNode的裁剪形状。 | 2438 2439**示例:** 2440 2441```ts 2442import { RenderNode, FrameNode, NodeController, ShapeMask, ShapeClip } from '@kit.ArkUI'; 2443 2444const clip = new ShapeClip(); 2445clip.setCommandPath({ commands: "M100 0 L0 100 L50 200 L150 200 L200 100 Z" }); 2446 2447const renderNode = new RenderNode(); 2448renderNode.frame = { 2449 x: 0, 2450 y: 0, 2451 width: 150, 2452 height: 150 2453}; 2454renderNode.backgroundColor = 0XFF00FF00; 2455renderNode.shapeClip = clip; 2456const shapeClip = renderNode.shapeClip; 2457 2458class MyNodeController extends NodeController { 2459 private rootNode: FrameNode | null = null; 2460 2461 makeNode(uiContext: UIContext): FrameNode | null { 2462 this.rootNode = new FrameNode(uiContext); 2463 2464 const rootRenderNode = this.rootNode.getRenderNode(); 2465 if (rootRenderNode !== null) { 2466 rootRenderNode.appendChild(renderNode); 2467 } 2468 2469 return this.rootNode; 2470 } 2471} 2472 2473@Entry 2474@Component 2475struct Index { 2476 private myNodeController: MyNodeController = new MyNodeController(); 2477 2478 build() { 2479 Column() { 2480 NodeContainer(this.myNodeController) 2481 .borderWidth(1) 2482 Button("setRectShape") 2483 .onClick(() => { 2484 shapeClip.setRectShape({ 2485 left: 0, 2486 right: 150, 2487 top: 0, 2488 bottom: 150 2489 }); 2490 renderNode.shapeClip = shapeClip; 2491 }) 2492 Button("setRoundRectShape") 2493 .onClick(() => { 2494 renderNode.shapeClip.setRoundRectShape({ 2495 rect: { 2496 left: 0, 2497 top: 0, 2498 right: this.getUIContext().vp2px(150), 2499 bottom: this.getUIContext().vp2px(150) 2500 }, 2501 corners: { 2502 topLeft: { x: 32, y: 32 }, 2503 topRight: { x: 32, y: 32 }, 2504 bottomLeft: { x: 32, y: 32 }, 2505 bottomRight: { x: 32, y: 32 } 2506 } 2507 }); 2508 renderNode.shapeClip = renderNode.shapeClip; 2509 }) 2510 Button("setCircleShape") 2511 .onClick(() => { 2512 renderNode.shapeClip.setCircleShape({ centerY: 75, centerX: 75, radius: 75 }); 2513 renderNode.shapeClip = renderNode.shapeClip; 2514 2515 }) 2516 Button("setOvalShape") 2517 .onClick(() => { 2518 renderNode.shapeClip.setOvalShape({ 2519 left: 0, 2520 right: this.getUIContext().vp2px(150), 2521 top: 0, 2522 bottom: this.getUIContext().vp2px(100) 2523 }); 2524 renderNode.shapeClip = renderNode.shapeClip; 2525 }) 2526 Button("setCommandPath") 2527 .onClick(() => { 2528 renderNode.shapeClip.setCommandPath({ commands: "M100 0 L0 100 L50 200 L150 200 L200 100 Z" }); 2529 renderNode.shapeClip = renderNode.shapeClip; 2530 }) 2531 } 2532 } 2533} 2534``` 2535 2536### dispose<sup>12+</sup> 2537 2538dispose(): void 2539 2540立即释放当前RenderNode。 2541 2542**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2543 2544**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2545 2546**示例:** 2547 2548```ts 2549import { RenderNode, FrameNode, NodeController } from '@kit.ArkUI'; 2550 2551const renderNode = new RenderNode(); 2552renderNode.frame = { x: 0, y: 100, width: 100, height: 100 }; 2553renderNode.backgroundColor = 0xffff0000; 2554 2555class MyNodeController extends NodeController { 2556 private rootNode: FrameNode | null = null; 2557 2558 makeNode(uiContext: UIContext): FrameNode | null { 2559 this.rootNode = new FrameNode(uiContext); 2560 2561 const rootRenderNode = this.rootNode!.getRenderNode(); 2562 if (rootRenderNode !== null) { 2563 rootRenderNode.size = { width: 200, height: 200 }; 2564 rootRenderNode.backgroundColor = 0xff00ff00; 2565 rootRenderNode.appendChild(renderNode); 2566 } 2567 2568 return this.rootNode; 2569 } 2570 2571 disposeRenderNode() { 2572 const rootRenderNode = this.rootNode!.getRenderNode(); 2573 if (rootRenderNode !== null) { 2574 rootRenderNode.removeChild(renderNode); 2575 } 2576 renderNode.dispose(); 2577 } 2578} 2579 2580@Entry 2581@Component 2582struct Index { 2583 private myNodeController: MyNodeController = new MyNodeController(); 2584 2585 build() { 2586 Column({ space: 4 }) { 2587 NodeContainer(this.myNodeController) 2588 Button('RenderNode dispose') 2589 .onClick(() => { 2590 this.myNodeController.disposeRenderNode(); 2591 }) 2592 .width('100%') 2593 } 2594 } 2595} 2596``` 2597 2598### markNodeGroup<sup>12+</sup> 2599 2600set markNodeGroup(isNodeGroup: boolean) 2601 2602标记是否优先绘制节点及其子节点。若设置为true,则透明度等属性将在节点绘制完毕后再进行合成。设置效果如下: 2603 2604 2605 2606**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2607 2608**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2609 2610**参数:** 2611 2612| 参数名 | 类型 | 必填 | 说明 | 2613| --------- | -------------------------------------------------- | ---- | ------------------ | 2614| isNodeGroup | boolean | 是 | 设置是否优先绘制节点及其子节点。<br/>true表示优先绘制节点及其子节点,false表示不是优先绘制节点及其子节点。 | 2615 2616get markNodeGroup(): boolean 2617 2618获取当前节点是否标记了优先绘制。 2619 2620**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2621 2622**返回值:** 2623 2624| 类型 | 说明 | 2625| ------- | ------------------------------------------- | 2626| boolean | 当前节点是否标记了优先绘制。<br/>true表示当前节点标记了优先绘制,false表示当前节点没有标记优先绘制。<br/>默认值:false | 2627 2628**示例:** 2629 2630```ts 2631import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI'; 2632import { drawing } from '@kit.ArkGraphics2D'; 2633 2634class MyRenderNode extends RenderNode { 2635 draw(context: DrawContext) { 2636 const canvas = context.canvas; 2637 const brush = new drawing.Brush(); 2638 brush.setColor({ alpha: 255, red: 255, green: 0, blue: 0 }); 2639 canvas.attachBrush(brush); 2640 canvas.drawRect({ left: 0, right: 200, top: 0, bottom: 200 }); 2641 canvas.detachBrush(); 2642 2643 brush.setColor({ alpha: 255, red: 0, green: 255, blue: 0 }); 2644 canvas.attachBrush(brush); 2645 canvas.drawRect({ left: 100, right: 300, top: 100, bottom: 300 }); 2646 canvas.detachBrush(); 2647 } 2648} 2649 2650const renderNode = new MyRenderNode(); 2651renderNode.frame = { x: 100, y: 100, width: 200, height: 200 }; 2652renderNode.backgroundColor = 0xff0000ff; 2653renderNode.markNodeGroup = true; 2654renderNode.opacity = 0.5; 2655 2656const isNodeGroup = renderNode.markNodeGroup; 2657 2658class MyNodeController extends NodeController { 2659 private rootNode: FrameNode | null = null; 2660 2661 makeNode(uiContext: UIContext): FrameNode | null { 2662 this.rootNode = new FrameNode(uiContext); 2663 2664 const rootRenderNode = this.rootNode.getRenderNode(); 2665 if (rootRenderNode !== null) { 2666 rootRenderNode.appendChild(renderNode); 2667 } 2668 2669 return this.rootNode; 2670 } 2671} 2672 2673@Entry 2674@Component 2675struct Index { 2676 private myNodeController: MyNodeController = new MyNodeController(); 2677 2678 build() { 2679 Row() { 2680 NodeContainer(this.myNodeController) 2681 } 2682 } 2683} 2684``` 2685 2686### lengthMetricsUnit<sup>12+</sup> 2687 2688set lengthMetricsUnit(unit: LengthMetricsUnit) 2689 2690设置RenderNode各个属性使用的单位。 2691 2692**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2693 2694**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2695 2696**参数:** 2697 2698| 参数名 | 类型 | 必填 | 说明 | 2699| ------ | -------------------------------------------------------------------- | ---- | ---------------------------------- | 2700| unit | [LengthMetricsUnit](./js-apis-arkui-graphics.md#lengthmetricsunit12) | 是 | 设置RenderNode各个属性使用的单位。 | 2701 2702get lengthMetricsUnit(): LengthMetricsUnit 2703 2704获取RenderNode各个属性使用的单位。 2705 2706**系统能力:** SystemCapability.ArkUI.ArkUI.Full 2707 2708**返回值:** 2709 2710| 类型 | 说明 | 2711| ------- | ------------------------------------------- | 2712| [LengthMetricsUnit](./js-apis-arkui-graphics.md#lengthmetricsunit12) | 获取RenderNode各个属性使用的单位,默认值为LengthMetricsUnit.DEFAULT。 | 2713 2714**示例:** 2715 2716```ts 2717import { RenderNode, FrameNode, NodeController, DrawContext } from '@kit.ArkUI'; 2718import { drawing } from '@kit.ArkGraphics2D'; 2719import { LengthMetricsUnit } from '@ohos.arkui.node'; 2720 2721class BaseRenderNode extends RenderNode { 2722 constructor() { 2723 super(); 2724 this.lengthMetricsUnit = LengthMetricsUnit.PX; 2725 } 2726} 2727 2728class MyRenderNode extends BaseRenderNode { 2729 draw(context: DrawContext) { 2730 const canvas = context.canvas; 2731 const brush = new drawing.Brush(); 2732 brush.setColor({ alpha: 255, red: 255, green: 0, blue: 0 }); 2733 canvas.attachBrush(brush); 2734 canvas.drawRect({ left: 0, right: 200, top: 0, bottom: 200 }); 2735 canvas.detachBrush(); 2736 } 2737} 2738 2739const renderNode = new MyRenderNode(); 2740renderNode.frame = { x: 100, y: 100, width: 200, height: 200 }; 2741renderNode.backgroundColor = 0xff0000ff; 2742renderNode.rotation = { x: 0, y: 0, z: 45 }; 2743 2744class MyNodeController extends NodeController { 2745 private rootNode: FrameNode | null = null; 2746 2747 makeNode(uiContext: UIContext): FrameNode | null { 2748 this.rootNode = new FrameNode(uiContext); 2749 const rootRenderNode = this.rootNode.getRenderNode(); 2750 if (rootRenderNode !== null) { 2751 rootRenderNode.appendChild(renderNode); 2752 } 2753 return this.rootNode; 2754 } 2755} 2756 2757@Entry 2758@Component 2759struct Index { 2760 private myNodeController: MyNodeController = new MyNodeController(); 2761 2762 build() { 2763 Row() { 2764 NodeContainer(this.myNodeController) 2765 } 2766 } 2767} 2768``` 2769