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