AxeSlide软件项目梳理   canvas绘图系列知识点整理

元素和影子

我们在主画布上绘制所有添加到画布上的元素,主画布上的所有元素存储在commonElements中。

在hitCanvas上,对应每一个元素commonElement都有一个对应的hitElement元素,这些元素存储在另外一个集合hitElements中。每一个hitElement元素对应的是我们在另外一个hitCanvas画布上绘制的各色矩形,并且每个矩形用的颜色rgb值都是不一样的(创建元素时随机生成的颜色值)。

commonElements和hitElements这两个集合都是哈希表,hashtable的键值均为一个六位的rgb颜色值。

当我们的鼠标在画布上点击时,点到的元素呈现编辑状态,但是怎么计算得到具体点击到哪个元素上呢?这个rgb值是最关键的。

下面是展示的一个作品中commonElements和hitElements的所有元素:

主画布canvas的元素绘制如下:

hitCanvas上每个元素的矩形如下图,

生成随机色值

我们生成随机色值的方法如下:

 1 public getUniqueColorKey() {
 2             var key, elements = this.commonElements;
 3             while (true) {
 4                 key = Common.Util.getRandomColor();//方法如下
 5                 if (key && !(elements.has(key))) {//判断生成的key是否已经使用
 6                     break;
 7                 }
 8             }
 9             return key;
10         }
11
12 //另一个文件中的getRandomColor
13    public static getRandomColor() {
14             var randColor = (Math.random() * 0xFFFFFF << 0).toString(16);
15             while (randColor.length < 6) {
16                 randColor = "0" + randColor;
17             }
18             return "#" + randColor;
19         }

getRandomColor生成随机颜色的方法参见 http://www.neatstudio.com/archives/?article-1008.html

getImageData获取像素点数据

当鼠标点击到canvas画布上时,通过hitCanvas上的鼠标点坐标获取到该点的data

editor.canvas.canvasImp.getActiveElement(mouseInfo, editor.hitCanvas.context);//获取点击的元素

 1         public getActiveElement(e, cxt) {
 2             var p = cxt.getImageData(e.mouseX, e.mouseY, 1, 1).data;
 3             if (p[3] == 255) {
 4                 // fully opaque pixel
 5                 var colorKey = "#" + Common.Util.rgbToHex(p[0], p[1], p[2]);
 6                 var activeEle = this.commonElements.get(colorKey);
 7                 return activeEle;
 8             }
 9             return null;
10         }

getImageData() 方法返回 ImageData 对象,该对象拷贝了画布指定矩形的像素数据。

对于 ImageData 对象中的每个像素,都存在着四方面的信息,即 RGBA 值:

  • R - 红色 (0-255)
  • G - 绿色 (0-255)
  • B - 蓝色 (0-255)
  • A - alpha 通道 (0-255; 0 是透明的,255 是完全可见的)

color/alpha 以数组形式存在,并存储于 ImageData 对象的 data 属性中。

如取画布点(500,300),该点对应上面hitCanvas图中黄色块的某一点坐标,得到的ImageData如下

转载于:https://www.cnblogs.com/fangsmile/p/6273641.html

软件项目技术点(4)——实现点击画布上元素相关推荐

  1. 软件项目技术点(21)——自动保存和恢复

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 自动保存的基本思路 1)软件每次打开都会创建一个保存画布元素信息的文件,文件名是在打开软件时生成的唯一字符串.可同时打开多个窗口,所以 ...

  2. 软件项目技术路线图_创建基本的项目路线图

    软件项目技术路线图 Continuing from my previous article, at this checkpoint, I have two things with me: 上一篇文章的 ...

  3. 软件项目技术路线图_为您的项目创建路线图

    软件项目技术路线图 Scrum has a tool for roadmap and release planning as well. We use two different mechanisms ...

  4. 软件项目技术点(2)——Canvas之平移translate、旋转rotate、缩放scale

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transf ...

  5. 软件项目技术点(20)——导出视频

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 导出的视频和播放器自动播放效果时一样的,这样用户就可以传到视频网站分享出去,或者mp4文件发送分享给朋友. 导出视频过程 我们导出视频 ...

  6. 软件项目技术点(1)——d3.interpolateZoom-在两个点之间平滑地缩放平移

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 软件参考d3的知识点 我们在软件中主要用到d3.js的核心函数d3.interpolateZoom - 在两个点之间平滑地缩放平移.请 ...

  7. 软件项目技术点(1)——Tween算法及缓动效果

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 Tween算法及缓动效果 软件里在切换步序时需要有过渡动画效果,从当前位置的画面缓动到目标位置的画面.动画效果可重新查看文章系列第一篇 ...

  8. 软件项目技术点(25)——提升性能之检测绘制范围

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 软件里的一个画面包含很多个元素,但是当缩放到某个局部位置时,需要绘制的元素个数就很少.那么怎么判断某个元素是否需要进行绘制呢? 我们在 ...

  9. 软件项目技术点(7)——在canvas上绘制自定义图形

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...

最新文章

  1. html脱机不显示图片,Python绘图脱机图表嵌入HTML(不工作)
  2. chrome浏览器 新建 标签 页面 跳转到主页(或跳转到谷歌)
  3. 然并卵:BF 科普 BF 解释器的 JS 实现
  4. 为什么静态成员、静态方法中不能用this和super关键字
  5. 属性总结(二):color
  6. aws dynamodb_DynamoDB备忘单–您需要了解的有关2020 AWS认证开发人员助理认证的Amazon Dynamo DB的所有信息
  7. Socket常见错误代码与描述
  8. 【学神-RHEL7】1-3-Linux基本命令和配置服务器来电后自动开机
  9. Qt笔记-获取Windows下目前运行的进程信息
  10. 【script】python3使用http.server搭建简易web服务
  11. SAP License:SAP MM物料管理
  12. Linux磁盘管理:LVM逻辑卷管理
  13. 手机图片怎么免费转换成PDF格式?教程来了
  14. js 正则表达式判断非法字符以及常用正则表达式。
  15. [原创]C#中国象棋网络版源代码-C# Chinese Chess Source Code
  16. 深入理解PHP原理之PHP与WEB服务器交互
  17. 如何使用FSMC让OLED屏幕刷新率飞起来?
  18. 八六、Linux 服务器+Nginx服务简介
  19. 施工员报考建筑八大员报考提高工程建筑施工人员安全生产意识
  20. <mvc:annotation-driven/>标签的使用

热门文章

  1. 如何退出while(cinvalue)的循环
  2. 让ubuntu在一个窗口下打开多个终端的软件——terminator
  3. C++技术在哪些领域中最为适用?
  4. 开课吧课堂:深入了解学习C++的意义与就业方向
  5. Python就业涨薪小技巧!
  6. Flutter安装、配置、初体验 windows 版
  7. 设计模式-命令模式(Command)
  8. POJ 3037 SPFA
  9. 关于成员变量和局部变量是否都会被默认初始化的问题
  10. mini2440 uboot使用nfs方式引导内核,文件系统