软件项目技术点(4)——实现点击画布上元素
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)——实现点击画布上元素相关推荐
- 软件项目技术点(21)——自动保存和恢复
AxeSlide软件项目梳理 canvas绘图系列知识点整理 自动保存的基本思路 1)软件每次打开都会创建一个保存画布元素信息的文件,文件名是在打开软件时生成的唯一字符串.可同时打开多个窗口,所以 ...
- 软件项目技术路线图_创建基本的项目路线图
软件项目技术路线图 Continuing from my previous article, at this checkpoint, I have two things with me: 上一篇文章的 ...
- 软件项目技术路线图_为您的项目创建路线图
软件项目技术路线图 Scrum has a tool for roadmap and release planning as well. We use two different mechanisms ...
- 软件项目技术点(2)——Canvas之平移translate、旋转rotate、缩放scale
AxeSlide软件项目梳理 canvas绘图系列知识点整理 画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transf ...
- 软件项目技术点(20)——导出视频
AxeSlide软件项目梳理 canvas绘图系列知识点整理 导出的视频和播放器自动播放效果时一样的,这样用户就可以传到视频网站分享出去,或者mp4文件发送分享给朋友. 导出视频过程 我们导出视频 ...
- 软件项目技术点(1)——d3.interpolateZoom-在两个点之间平滑地缩放平移
AxeSlide软件项目梳理 canvas绘图系列知识点整理 软件参考d3的知识点 我们在软件中主要用到d3.js的核心函数d3.interpolateZoom - 在两个点之间平滑地缩放平移.请 ...
- 软件项目技术点(1)——Tween算法及缓动效果
AxeSlide软件项目梳理 canvas绘图系列知识点整理 Tween算法及缓动效果 软件里在切换步序时需要有过渡动画效果,从当前位置的画面缓动到目标位置的画面.动画效果可重新查看文章系列第一篇 ...
- 软件项目技术点(25)——提升性能之检测绘制范围
AxeSlide软件项目梳理 canvas绘图系列知识点整理 软件里的一个画面包含很多个元素,但是当缩放到某个局部位置时,需要绘制的元素个数就很少.那么怎么判断某个元素是否需要进行绘制呢? 我们在 ...
- 软件项目技术点(7)——在canvas上绘制自定义图形
AxeSlide软件项目梳理 canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...
最新文章
- html脱机不显示图片,Python绘图脱机图表嵌入HTML(不工作)
- chrome浏览器 新建 标签 页面 跳转到主页(或跳转到谷歌)
- 然并卵:BF 科普 BF 解释器的 JS 实现
- 为什么静态成员、静态方法中不能用this和super关键字
- 属性总结(二):color
- aws dynamodb_DynamoDB备忘单–您需要了解的有关2020 AWS认证开发人员助理认证的Amazon Dynamo DB的所有信息
- Socket常见错误代码与描述
- 【学神-RHEL7】1-3-Linux基本命令和配置服务器来电后自动开机
- Qt笔记-获取Windows下目前运行的进程信息
- 【script】python3使用http.server搭建简易web服务
- SAP License:SAP MM物料管理
- Linux磁盘管理:LVM逻辑卷管理
- 手机图片怎么免费转换成PDF格式?教程来了
- js 正则表达式判断非法字符以及常用正则表达式。
- [原创]C#中国象棋网络版源代码-C# Chinese Chess Source Code
- 深入理解PHP原理之PHP与WEB服务器交互
- 如何使用FSMC让OLED屏幕刷新率飞起来?
- 八六、Linux 服务器+Nginx服务简介
- 施工员报考建筑八大员报考提高工程建筑施工人员安全生产意识
- <mvc:annotation-driven/>标签的使用