首页 > 其他分享 >鸿蒙HarmonyOS应用开发-手写板(二)

鸿蒙HarmonyOS应用开发-手写板(二)

时间:2024-12-04 19:28:47浏览次数:7  
标签:canvas 鸿蒙 路径 path2D Path2D 画布 HarmonyOS 手写板 清空

        在前一篇手写板的文章中(HarmonyOS应用开发-手写板-CSDN博客),我们通过使用Path实现了一个基本的手写板,但遗憾的是,无法保存所绘制的图像。在本文中,我们将采用canvas和Path2D来重新构建手写板应用。依然只需几十行代码,就能轻松实现手写功能,并添加清空画布以及保存图片的功能。

一、先上效果图:

二、上代码

import picker from '@ohos.file.picker';
import fs from '@ohos.file.fs';
import buffer from '@ohos.buffer';

@Entry
@Component
struct CanvasPage {
  //手写路径
  @State pathCommands: string = '';
  canvas: CanvasRenderingContext2D = new CanvasRenderingContext2D();
  path2D: Path2D = new Path2D();

  build() {
    Column() {
      Row() {
        //清空画布按钮
        Button("清空")
          .margin(10)
          .onClick(() => {
            //将路径置空
            this.path2D = new Path2D();
            //清空画布
            this.canvas.clearRect(0, 0, this.canvas.width, this.canvas.height);
          })
        Button("保存")
          .onClick(() => {
            this.saveImage();
          })
      }

      Canvas(this.canvas)
        .width('100%')
        .height('100%')
        .onTouch((e) => {
          this.onTouchEvent(e);
        })
    }
  }

  onTouchEvent(event: TouchEvent) {
    //手指按下和移动时的位置转换成像素位置
    let x = (event.touches[0].x);
    let y = (event.touches[0].y);
    switch (event.type) {

    //手指按下
      case TouchType.Down:
      //移动到(x,y)点
        this.path2D.moveTo(x, y);
        break;

    //画线到(x,y)点
      case TouchType.Move:
        this.path2D.lineTo(x, y);
      //画笔颜色
        this.canvas.strokeStyle = "#0000ff";
      //画笔粗细
        this.canvas.lineWidth = 5;
      //画出线段
        this.canvas.stroke(this.path2D);
        break;
      default:
        break;
    }
  }

  saveImage() {
    //获取图片的base64字符串
    let imageStr = this.canvas.toDataURL().split(',')[1];
    //文件保存路径
    let uri = '';
    try {
      let PhotoSaveOptions = new picker.PhotoSaveOptions();
      //保存图片默认名称
      PhotoSaveOptions.newFileNames = ['11111.png'];
      let photoPicker = new picker.PhotoViewPicker();
      //调起系统的图片保存功能
      photoPicker.save(PhotoSaveOptions).then((PhotoSaveResult) => {
        uri = PhotoSaveResult[0];
        //打开文件
        let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
        //base64字符串转成buffer
        const decodeBuffer = buffer.from(imageStr, 'base64').buffer;
        //写入文件
        fs.writeSync(file.fd, decodeBuffer);
        //关闭文件
        fs.closeSync(file);
      }).catch((err: Error) => {
        console.error(err + '');
      })
    } catch (e) {
      console.error(e);
    }
  }
}

在这段代码中,根据功能划分,主要涵盖了三个关键操作:绘制路径、清空画布和保存画布。

一、绘制路径

        在绘制路径方面,代码通过Canvas执行图像绘制,同时借助Path2D定义了具体的绘制路径。手写路径的生成通过记录手指按下和移动的位置实现。具体操作包括:

this.path2D.moveTo(x, y)  // 移动到(x, y)点
this.path2D.lineTo(x, y)  // 画线到(x, y)点

二、清空画布

清空画布的操作分为两步:

1.将路径置空

// 重新生成新的Path2D对象,因为HarmonyOS中的Path2D没有reset方法
this.path2D = new Path2D();  

2.清空canvas

this.canvas.clearRect(0, 0, this.canvas.width, this.canvas.height);

三、保存画布

        保存画布的过程主要由saveImage方法完成,依赖于@ohos.file.picker组件,调用系统的图片保存功能。具体步骤包括:

  1. 通过PhotoViewPickersave方法获取用户选择的保存文件路径。
  2. 利用Canvas的toDataURL()方法将Canvas转换为base64字符串形式的图片。
  3. 通过@ohos.buffer将base64字符串转换为buffer。
  4. 最终,通过@ohos.file.fs将buffer写入文件,文件的路径为之前获取的保存路径。

        这一系列步骤成功实现了将绘制的图像保存为一个完整的图片文件。整体而言,代码清晰地展示了绘制路径、清空画布和保存画布的功能实现。

标签:canvas,鸿蒙,路径,path2D,Path2D,画布,HarmonyOS,手写板,清空
From: https://blog.csdn.net/liuhaikang2024/article/details/144247864

相关文章

  • 手把手教你华为鸿蒙开发第十章
    华为鸿蒙开发:深入探索Tabs组件的定制与应用引言在移动应用设计中,标签页(Tabs)是用户切换不同内容区块的重要界面元素。华为鸿蒙操作系统提供的Tabs组件支持开发者创建高度定制化的标签页界面。本文将通过DevEcoStudio详细介绍Tabs组件的使用,包括基本设置、动态生成标签页......
  • 鸿蒙开发-ArkTS 中实现评级功能
    以下是一个在ArkTS中实现简单评级功能的代码示例,示例以一个星级评分的形式呈现,用户可以点击星星来选择对应的评分等级,分数范围是1到5星。1.界面布局部分(使用.ets文件,假设为RatingExample.ets)import{Component,Prop,State}from'@arkts/core';@Entry@Com......
  • 鸿蒙开发-ArkTS 中实现关系数据管理功能
    在ArkTS中使用SQLite数据库来实现简单关系数据功能的具体代码示例,模拟了一个“学生-课程”的多对多关系场景,即一个学生可以选修多门课程,一门课程也可以被多个学生选修。导入必要的模块import{SQLiteDatabase}from'@arkts/sqlite';初始化数据库letdb:SQL......
  • HarmonyOS Next 加密技术的未来发展趋势
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)加密技术的未来发展趋势,基于实际开发实践和行业前瞻性研究进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。第一章:当......
  • HarmonyOS Next 与其他系统加密技术对比
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)与其他常见操作系统(如安卓、iOS)加密技术的差异,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。第一......
  • HarmonyOS Next 分布式加密协作应用案例剖析
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在分布式加密协作应用中的应用,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。第一章:应用场景与架......
  • HarmonyOS Next 数据安全存储与管理平台构建
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在数据安全存储与管理平台构建中的应用,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。第一章:平台......
  • HarmonyOS Next 入门实战 - 导航框架:HMRouter
    基础知识目前官方推荐的最佳解决方案,是官方对于Navigation导航组件的封装,使用更简单便捷。如果熟悉Navigation的话,使用起来很快上手。首先先集成HMRouter模块使用命令行安装依赖:ohpminstall@hadss/hmrouter或在模块的oh-package.json5文件中添加依赖{"dependencies"......
  • 中安证件OCR识别技术助力鸿蒙生态:智能化证件识别新体验
    在数字化和智能化的浪潮中,伴随国产化战略的深入推进,国产操作系统和软件生态的建设逐渐走向成熟。鸿蒙操作系统(HarmonyOSNext)作为华为推出的重要操作系统,凭借其开放、灵活和高效的特点,正在加速在多个领域的普及和应用。特别是在智能识别和人工智能技术的支持下,鸿蒙系统在各行各......
  • 手把手教你华为鸿蒙开发之第七节
    华为鸿蒙开发:数组和对象遍历及UI渲染详解引言在华为鸿蒙操作系统的开发中,数组和对象的遍历是基础且频繁的操作。无论是处理数据集合还是动态生成用户界面,都需要对数组和对象进行高效的遍历。本文将详细介绍如何在鸿蒙开发中使用for循环、for...of循环以及ForEach方法来遍......