我们在重构代码之后,重新添加新的功能:添加一个圆形/椭圆的工具。 第一步,增加一个新的按钮:

      <button id='ellipse' onclick="handleDrawEllipse()">ellipse</button>
复制代码

按钮点击事件响应代码:

    function handleDrawEllipse(event) {tool = new EllipseTool(ctx, 2, 'green');}
复制代码

第二部,实现EllipseTool。类似于矩形,也是用鼠标拖出一个矩形区域,然后在这个矩形区域内,画出一个椭圆/圆形。因此,我们让EllipseTool直接继承RectTool:

    class EllipseTool extends RectTool {//handleMouseMove(x, y) {if (this._tempImageData) {ctx.putImageData(this._tempImageData, 0, 0);}//this._bottomRight = {x, y};//const pt1 = this._topLeft;const pt2 = this._bottomRight;const left = Math.min(pt1.x, pt2.x);const top = Math.min(pt1.y, pt2.y);const right = Math.max(pt1.x, pt2.x);const bottom = Math.max(pt1.y, pt2.y);//const centerX = (left + right) / 2;const centerY = (top + bottom) / 2;const radiusX = centerX - left;const radiusY = centerY - top;ctx.beginPath();ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, Math.PI * 2);ctx.stroke();}//handleMouseUp() {return new EllipseData(this._topLeft, this._bottomRight, this.lineWidth, this.strokeStyle);}}
复制代码

我们只是重写了handleMouseMove和handleMouseUp。主要就是覆盖显示部分和返回的数据类型。EllipseData也很简单:

    class EllipseData extends RectData {//draw(ctx) {//ctx.beginPath();ctx.lineWidth = this._lineWidth;ctx.strokeStyle = this._strokeStyle;//const pt1 = this._topLeft;const pt2 = this._bottomRight;const left = Math.min(pt1.x, pt2.x);const top = Math.min(pt1.y, pt2.y);const right = Math.max(pt1.x, pt2.x);const bottom = Math.max(pt1.y, pt2.y);//const centerX = (left + right) / 2;const centerY = (top + bottom) / 2;const radiusX = centerX - left;const radiusY = centerY - top;//ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, Math.PI * 2);ctx.stroke();//}
复制代码

同样,我们让EllipseData继承RectData,然后重写draw方法。当然你也可以让EllipseData直接继承自ActionData。并不会有太大的区别。 这样我们就实现了圆形/椭圆的绘制工具。和重构之前,我们添加矩形工具完全不同,我们没有修改任何已经存在的代码,而是仅仅添加了新的代码,就实现了椭圆工具的添加。 同样,你也可以继续实现更多的工具,例如直线,正多边形,五角星等等。 不过,仍然有可以改进的地方。首先,我们的js代码和html混在一起,不符合目前主流的方式(html和js分离)。即使我们把js拿出来当独放在一个文件内,让然不便与维护。因为所有的功能都混在一个文件内。 接下来,我们将会利用webpack来解决这个问题。让我们开发js就像c++/java那样,把代码分成不同的模块,然后模块之间可以进行引用,最后形成一个工程。

转载于:https://juejin.im/post/5cc2e67af265da037c7cebba

javascript全栈开发实践-web-7相关推荐

  1. javascript全栈开发实践-准备

    目标: 我们将会通过一些列教程,在只使用JavaScript开发的情况下,实现一个手写笔记应用.该应用具有以下特点: 全平台,有手机客户端(Android/iOS),Windows,macOS,Lin ...

  2. javascript全栈开发实践-web-4

    接下来,我们继续完善功能.作为一个手写应用,undo/redo操作是必须的.要现实undo/redo,最容易想到的实现方式,就是我们记住每一次操作的结果,在用户undo的时候,显示之前的结果给用户就可 ...

  3. python sanic orm_Sanic + 前端MVVM 一种新一代Python高性能全栈开发实践

    SanicCRUD-vue Sanic + 前端MVVM 一种新一代Python高性能全栈开发实践 背景 本项目将使用Sanic + Vue2 + Webpack2 配合最简单CRUD的逻辑来展示一个 ...

  4. 全栈开发和web开发_全栈开发人员:这是什么,以及如何成为一个完整的开发人员...

    全栈开发和web开发 一个全职的开发人员是各行各业的杰作,也是一个备受追捧的求职者. 标题暗示着知识的广度,这对于人手不足的初创公司和管理复杂应用程序的大公司而言都是无价的. 但是, 术语" ...

  5. python sanic_Sanic + 前端MVVM 一种新一代Python高性能全栈开发实践

    SanicCRUD-vue Sanic + 前端MVVM 一种新一代Python高性能全栈开发实践 背景 本项目将使用Sanic + Vue2 + Webpack2 配合最简单CRUD的逻辑来展示一个 ...

  6. 全栈开发和web开发_成为全栈开发人员

    全栈开发和web开发 This popular article has been updated in June 2017 to include modern technologies. 该热门文章已 ...

  7. python全栈开发实践入门_Python全栈开发实践入门

    Python全栈开发实践入门 编辑 锁定 讨论 上传视频 <Python全栈开发实践入门>是2017年10月电子工业出版社出版的图书,作者是谢瑛俊. 书 名 Python全栈开发实践入门 ...

  8. 预告:Javascript全栈开发的系列文章

    自从一年前发布了Vuejs小书的电子书,也有些日子没有碰过它们了,现在因为项目的缘故,需要使用JavaScript全栈开发.所以,我得把这个全栈环境搭建起来. 说起来搭建JS全栈开发环境,设计到的东西 ...

  9. python全栈开发实践入门_讲书3分钟丨《Python全栈开发实践入门》 -讲书人 谢瑛俊...

    只需3分钟就能快速了解一本书! 由作(译)者发声讲书,直指新书的特点与主旨. 只需利用碎片化时间,省时省力选到适合自己的好书 音频链接 音频内容 大家好,我是<Python全栈开发实践入门> ...

最新文章

  1. 软件测试培训:高薪测试技术要掌握哪些
  2. 小学计算机管理员培训,中小学计算机管理员培训心得体会-20210401075623.docx-原创力文档...
  3. Qt状态机框架介绍(一)
  4. TensorFlow安装手册
  5. AD 脚本kixtart运用之五(用户电脑屏保设置)
  6. .NET Core 3.1通用主机原理及使用
  7. ECCV2018--点云匹配
  8. 搭建网站常见返回码40X 50X等错误的原因及解决方案
  9. c语言编程中如何对其,C语言内存对齐详解(3)
  10. ServiceNow常用角色和分组
  11. 使用URLDecoder对URL进行中文解析
  12. tomcat解决get请求中文乱码问题(两种解决方案)
  13. [转载]大数据入门 - 董飞
  14. SQL Sever创库
  15. 至高心法 - SpringCloud Alibaba (二)Nacos 服务注册与配置中心
  16. 【python Turtle源码】教你如何画一只迎福虎将~
  17. L2CAP数据发送和接收
  18. 【VUE+Mapbox】mapbox地图在vue中展示所遇问题解决
  19. Coursera | Introduction to Data Science in Python(University of Michigan)| Assignment3
  20. Ubuntu内网穿透搭建网站:设置跳转本地网页服务 6/17

热门文章

  1. typecho除了首页其他大部分网页404怎么办?
  2. Android working with volley
  3. USACO Section 4.2 Drainage Ditches(最大流)
  4. SQL生成日期维度(到小时)
  5. 网页设计表格单元格线条及边框设置
  6. 算法导论 CLRS 22.4-4 解答
  7. [转帖]ISE与Modelsim联合观察中间信号
  8. 对二进制文件的操作(c++ 程序设计 by 谭浩强 课本实例)
  9. 搜索算法(一)--DFS/BFS求解拯救同伴问题(JAVA)
  10. wallpaper怎么导入视频_快速制作视频字幕,我们推荐这款可视化字幕软件!