demo如下:import { RenderNode, DrawContext, FrameNode, NodeController } from "@ohos.arkui.node" import drawing from "@ohos.graphics.drawing" class TextRenderNode extends RenderNode { async draw(context: DrawContext) { const canvas = context.canvas; const pen = new drawing.Pen(); pen.setStrokeWidth(5); pen.setColor({ alpha: 255, red: 255, green: 0, blue: 0 }); let path = new drawing.Path(); // path.moveTo(10,10); path.arcTo(10, 10, 200, 200, 0,180); // path.close(); canvas.attachPen(pen); canvas.drawPath(path); canvas.detachPen(); } } class MyNodeController extends NodeController { private rootNode: FrameNode | null = null; private nodeArray: Array<TextRenderNode> = [] addMyNode(item: TextRenderNode) { this.nodeArray.push(item) } makeNode(uiContext: UIContext): FrameNode | null { this.rootNode = new FrameNode(uiContext); const renderNode = this.rootNode.getRenderNode(); if (renderNode === null) { return this.rootNode; } if (renderNode) { renderNode.clearChildren() this.nodeArray.forEach((item) => { renderNode.appendChild(item) }) } return this.rootNode; } } @Entry @Component struct Index { @State newNode: TextRenderNode = new TextRenderNode(); @State nodeCV: MyNodeController = new MyNodeController() tempY = 0 build() { Column() { Column() { NodeContainer(this.nodeCV).width('100%').height(200) Button('Invalidate').onClick(() => { let newNode = new TextRenderNode() newNode.frame = { x: 0, y: this.tempY, width: 200, height: 100 } this.nodeCV.addMyNode(newNode) this.nodeCV.rebuild() this.tempY += 100 }) }.width('100%').height('100%') }.height('100%') } }
demo如下: