欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > HarmonyOS(66) ArkUI FrameNode实现自定义View

HarmonyOS(66) ArkUI FrameNode实现自定义View

2025/1/23 6:54:29 来源:https://blog.csdn.net/chunqiuwei/article/details/144363091  浏览:    关键词:HarmonyOS(66) ArkUI FrameNode实现自定义View

自定义View

  • 1、前言
  • 2、MyFrameNode实现
    • 2.1、onDraw方法绘制红色矩形框
    • 2.2、onMeasure测量自定义FrameNode
    • 2.3、onLayout方法自定义FrameNode的布局方式
    • 2.4、onMeasure测量自定义FrameNode
  • 3、初始化MyFrameNode并添加child FrameNode
    • 3.1 通过NodeController初始化MyFrameNode
    • 3.2 通过NodeContainer使用MyFrameNode
  • 4、全部源码
  • 5、参考资料

1、前言

在HarmonyOS(65) ArkUI FrameNode详解一文中详细说明了FrameNode的作用,以及怎么对节点的查询、增加、删除功能。FrameNode还有一个重要的功能就是实现自定义View,类似Android一样。本篇博文通过一个demo来说明如何通过FrameNode实现自定义View. 实现效果如下:
在这里插入图片描述

  • 绿色矩形是自定义的MyFrameNode
  • 粉色矩形是MyFrameNode的childFrameNode
  • 红色矩形框是通过。FrameNode的onDraw方法绘制的图形
  • FrameNode提供的invalidate方法可以是的FrameNode重新绘制,也就是执行onDraw方法,类比Android的invalidate方法。
  • FrameNode提供的setNeedsLayout,将当前 FrameNode提供的节点标记,在下一帧会重新布局,有点类似于Android的requestLayout方法。
    下面就分析下怎么实现的,通过本篇博文你可以了解到如何自定义FrameNode以及NodeController的用法:

2、MyFrameNode实现

2.1、onDraw方法绘制红色矩形框

通过重写 FrameNode的onDraw方法,可以自定义 FrameNode的绘制内容。绘制上图红色矩形边框的代码如下:

//自定义FrameNode
class MyFrameNode extends FrameNode {public width: number = 100;public offsetY: number = 0;private space: number = 1;//省略了onMeasure方法//省略了onLayout方法//绘制红色矩形边框onDraw(context: DrawContext) {//获取画布const canvas = context.canvas;//初始化画笔const pen = new drawing.Pen();//设置边框宽度pen.setStrokeWidth(15);//设置边框颜色为红色,RGB模式pen.setColor({ alpha: 255, red: 255, green: 0, blue: 0 });//画布绑定画笔canvas.attachPen(pen);//绘制画笔canvas.drawRect({left: 50,right: this.width + 50,top: 50,bottom: this.width + 50,});//释放画笔canvas.detachPen();}//通过动态修改width来修改红色矩形边框的right和bottonaddWidth() {this.width = (this.width + 10) % 50 + 100;// 页面重绘this.invalidate();}
}//end MyFrameNode//点击上图Invalidate方法的代码如下Button('Invalidate').margin(10).onClick(() => {this.nodeController?.myFrameNode?.addWidth();})

通过上面代码我们可以注意下一个细节点,在绘制完成后要调用canvas.detachPen()及时释放相关资源。

2.2、onMeasure测量自定义FrameNode

  • onMeasure方法可以自定义 FrameNode的测量方式,使用measure方法可以主动传递布局约束触发重新测量,可以参考AndroidonMeasure方法。
//自定义childFrameNode 的布局约束
function GetChildLayoutConstraint(constraint: LayoutConstraint, child: FrameNode): LayoutConstraint {const size = child.getUserConfigSize();const width = Math.max(Math.min(constraint.maxSize.width, size.width.value),constraint.minSize.width);const height = Math.max(Math.min(constraint.maxSize.height, size.height.value),constraint.minSize.height);const finalSize: Size = { width, height };//返回一个自定义布局约束const res: LayoutConstraint = {maxSize: finalSize,minSize: finalSize,//子节点计算百分比时的尺寸基准percentReference: finalSize};return res;
}//自定义MyFrameNode
class MyFrameNode extends FrameNode {

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com