OpenHarmony实战开发-手写绘制及保存图片。

本文介绍了如何在鸿蒙系统中使用drawing和image库实现手写绘制功能,包括创建自定义节点控制器和渲染节点,以及利用NodeContainer组件和ImagePackerAPI保存手写板绘制的内容为图片。详细步骤展示了从绘制、撤销、重置到图片保存的整个过程。
摘要由CSDN通过智能技术生成

手写绘制及保存图片

介绍

本示例使用drawing库的Pen和Path结合NodeContainer组件实现手写绘制功能,并通过image库的packToFile和packing接口将手写板的绘制内容保存为图片。

效果图预览

在这里插入图片描述
使用说明

  1. 在虚线区域手写绘制,点击撤销按钮撤销前一笔绘制,点击重置按钮清空绘制。
  2. 点击packToFile保存图片按钮和packing保存图片按钮可以将绘制内容保存为图片写入文件,显示图片保存路径。

实现思路

1.创建NodeController的子类MyNodeController,用于获取根节点的RenderNode和绑定的NodeContainer组件宽高。

export class MyNodeController extends NodeController {
   
  private rootNode: FrameNode | null = null; // 根节点
  rootRenderNode: RenderNode | null = null; // 从NodeController根节点获取的RenderNode,用于添加和删除新创建的MyRenderNode实例
  width: number = 0; // 实例绑定的NodeContainer组件的宽,单位px
  height: number = 0; // 实例绑定的NodeContainer组件的宽,单位px

  // MyNodeController实例绑定的NodeContainer创建时触发,创建根节点rootNode并将其挂载至NodeContainer
  makeNode(uiContext: UIContext): FrameNode {
   
    this.rootNode = new FrameNode(uiContext);
    if (this.rootNode !== null) {
   
      this.rootRenderNode = this.rootNode.getRenderNode();
    }
    return this.rootNode;
  }

  // 绑定的NodeContainer布局时触发,获取NodeContainer的宽高
  aboutToResize(size: Size): void {
   
    this.width = size.width;
    this.height = size.height;
    // 设置画布底色为白色
    if (this.rootRenderNode !== null) {
   
      // NodeContainer布局完成后设置rootRenderNode的背景色为白色
      this.rootRenderNode.backgroundColor = 0XFFFFFFFF;
      // rootRenderNode的位置从组件NodeContainer的左上角(0,0)坐标开始,大小为NodeContainer的宽高
      this.rootRenderNode.frame = {
    x: 0, y: 0, width: this.width, height: this.height };
    }
  }
}

2.创建RenderNode的子类MyRenderNode,初始化画笔和绘制path路径。

export class MyRenderNode extends RenderNode {
   
  path: drawing.Path = new drawing.Path(); // 新建路径对象,用于绘制手指移动轨迹

  // RenderNode进行绘制时会调用draw方法,初始化画笔和绘制路径
  draw(context: DrawContext): void  {
   
    const canvas = context.canvas;
    // 创建一个画笔Pen对象,Pen对象用于形状的边框线绘制
    const pen = new drawing.Pen();
    // 设置画笔开启反走样,可以使得图形的边缘在显示时更平滑
    pen.setAntiAlias(true)
  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值