react实现简易画板程序

文章同时发布于:https://pengfeixc.com/blog/60d073bce97367196dce3efc。
在这之前,我写过一个vue版本的画板程序。最近因为minicode的上线,就把画板用react重写了,其实思路什么的都是一样的,只是使用的前端框架不一样罢了。
react-paint地址
github源码地址: https://github.com/pengfeiw/react-paint。

一. react-paint

程序界面如图,上方是工具栏,下面是画布绘制区域。

主要功能使用html canvas实现,可以在MDN canvas教程上学习canvas的二维图形绘制。

下面我说下部分的主要功能实现,你们可以在github上找我的源码进行参考。

二. 功能实现

笔、橡皮擦和形状功能

主要是监听画板的鼠标事件实现的,这里我运用了面向对象的思想,写了一个Tool类,Pen、Shape、Eraser都是通过继承实现的。

class Tool {public onMouseDown(event: MouseEvent): void {//}public onMouseMove(event: MouseEvent): void {//}public onMouseUp(event: MouseEvent): void {//}
}class Pen extends Tool {// 覆盖基类的三个鼠标事件方法public onMouseDown(event: MouseEvent): void {//}public onMouseMove(event: MouseEvent): void {//}public onMouseUp(event: MouseEvent): void {//}
}class Shape extends Tool {...
}// 由于橡皮擦和笔的实现基本一样,仅颜色和线宽不一样,所以我直接将Eraser继承Pen
class Eraser extends Pen {...
}

从mousedown至mouseup这一个完整的过程,表示一段线段或者一个形状的绘制。具体实现可以看我的源码。

填充功能

填充功能使用了图形学的flood fill算法,具体思路可以参考我的这篇文章高效率的种子填充算法。这个功能我花的时间是最多的,在算法上我花了很多时间去查阅资料和实践。

回退和前进功能

这个主要利用了双栈的思想,将每一步canvas的剪影(ImageData)存储在栈中。每次在canvas上绘制一个形状或者线段,又或者是擦除一条线段,都将此时的canvas图片(ImageData)存储在imageData1栈顶。back时将imageData1的栈顶元素弹栈,并将该元素push到imageData2中。forward的时,如果imageData2非空,将imageData2执行弹栈操作,将该元素push到imageData1中。每次操作后,都将imageData1的栈顶ImageData加载到canvas上,即实现了撤销和回退功能。

class Snapshot {private imageData1: ImageData[] = [];private imageData2: ImageData[] = [];public add(imageData: ImageData) {this.imageData1.push(imageData);}public back() {if (this.imageData1.length > 1) {const imageData = this.imageData1.pop() as ImageData;this.imageData2.push(imageData);}return this.imageData1.length > 0 ? this.imageData1[this.imageData1.length - 1] : null;}public forward() {if (this.imageData2.length > 0) {const imageData = this.imageData2.pop() as ImageData;this.imageData1.push(imageData);}return this.imageData1.length > 0 ? this.imageData1[this.imageData1.length - 1] : null;}
}

其他功能

其他功能相对比较简单,就是更改一些线的样式,这里就不再详述了,更多细节请参考我的github。

如果你对该程序有疑问,可以在我的个人网站文章下方留言,也可以留下您的联系方式☺。

(完)

react实现简易画板程序相关推荐

  1. Android 简易画板

    用到的方法 画布Canvas 画笔Paint 路径Path 文件 File 位图 Bitmap 菜单 menu 创建一个Android项目,实现手绘功能的简易画板,并可以储存. activity_ma ...

  2. JavaScript 简易画板

    html 5 canvas只是一个容器,想要画出东西全部依赖于JavaScript.感觉什么都离不开这个JavaScript脚本. 简易画板核心代码: <script>var start ...

  3. react.js做小程序_如何使用React.js构建现代的聊天应用程序

    react.js做小程序 In this tutorial, I will guide you to build your own group chat application using React ...

  4. 创建react应用程序_使用SpringWebFlux的React式Web应用程序

    创建react应用程序 1.React式编程简介 React式编程是为具有以下特征的应用程序创造的术语: 非阻塞应用 事件驱动和异步 需要少量线程来垂直扩展(即在JVM中) 就像面向对象的编程,函数式 ...

  5. ios react_查找内存泄漏React本机应用程序(iOS)

    ios react by Jignesh Kakadiya 通过Jignesh Kakadiya 查找内存泄漏React本机应用程序(iOS) (Finding memory leaks react- ...

  6. php 滑块 爬虫_PHP实现简易爬虫与简易采集程序

    今天跟大家分享两段php代码,一段是PHP实现简易爬虫,一段是PHP实现简易采集程序.代码都比较简单,适合会点php的SEO初学者. PHP实现简易爬虫 代码中涉及两个表,urls和visited,分 ...

  7. 基于QGraphics的简易画板1

    最近制作一个画板实现自定义绘图,之前写的画板程序是关于QPainter的,画布缩放效果不理想,也不能实现图元的平移,所以一直想写一个基于QGraphics的画板. 因为代码有点长,在这里分享绘制直线和 ...

  8. wxpython开发实例_Python中使用wxPython开发的一个简易笔记本程序实例

    Python中使用wxPython开发的一个简易笔记本程序实例 发布于 2016-01-22 21:23:22 | 252 次阅读 | 评论: 0 | 来源: 网友投递 wxPython Python ...

  9. react与微信小程序

    由组员完成 原文链接 都说react和微信小程序很像,但是像在什么部分呢,待我稍作对比. 生命周期 1.React React的生命周期在16版本以前与之后发生了重大变化,原因在于引入的React F ...

最新文章

  1. C语言\b回退一格!多点的!_只愿与一人十指紧扣_新浪博客
  2. 8086汇编语言命令速查与详解
  3. VMware vSphere 5.0升级到5.1的思路
  4. 满屋研选获1亿元B轮融资,华创资本领投,五岳资本、金地集团、治平资本等跟投...
  5. 屠龙之路_战胜View对DataBase猛烈进攻_ThirdDay
  6. Java常见容器(Container)关系图
  7. ThinkPHP3.2 实现阿里云OSS上传文件
  8. [Java基础]Collection集合
  9. Apache SolrCloud安装
  10. j pocket_Wallabag:Pocket的开源替代品
  11. linux中几个热键
  12. 启发式搜索之八皇后问题
  13. Aladdin推出软件智能卡和一次性密码认证解决方案
  14. Cilium 官方文档翻译(7) IPAM Kubernetes Host模式
  15. A* Search Algorithm
  16. eclipse java注释乱码_Eclipse中文注释乱码解决
  17. 复旦大学邱锡鹏:若优化顺利,MOSS三月底开源;库克或被踢出苹果董事会;华为云联合CSDN发布智能化编程助手Snap|极客头条
  18. 基于scrapy下的租房信息爬取与数据展示工具的设计与实现
  19. 腾讯云服务器发送邮件的坑
  20. 智慧物业综合管理系统(java+vue+Uni-app),源码免费分享

热门文章

  1. 【机器学习】机器学习(一、二):批梯度下降法、随机/增量梯度下降法、最小二乘法
  2. 「秒杀购物商城业务服务」「分布式架构服务」盘点中间件服务
  3. 强制下载钉钉直播回放,简单易 附爬取工具
  4. Win PE 是什么?
  5. [递推] 洛谷P1010
  6. 《脑力赋能》读书笔记
  7. linux source code download
  8. 快速以太网中传输介质100BASE-TX
  9. windows清理_推荐一款Windows磁盘清理工具
  10. AutoIt3 使用进程名获取窗口句柄