【问题标题】:Canvas: Mouse Events画布:鼠标事件
【发布时间】:2013-03-24 05:29:24
【问题描述】:
我知道不可能将事件处理程序添加到画布中的特定圆圈或矩形。但是有一些不错的框架,例如 EaselJS、KineticJS、Paper.js、Fabric.js,它们支持对特定元素的事件处理。
有人可以解释一下他们是如何工作的吗?
我认为只有两种解决方案。
1. 您为每个元素创建一个新的画布区域并将它们放在一起。通过这种方式,您可以为每个区域分配一个事件处理程序。
2. 你只有一个画布区域和一个事件处理程序。这样,您必须进行复杂的数学计算才能确定是否单击了特定元素。如果您只有圆形或矩形,此解决方案可能很简单。但是如果你有很多曲线的路径,这个解决方案就很难了。
我不想使用这些库。如果有人可以帮助我,那就太好了。
【问题讨论】:
标签:
html
events
canvas
mouse
【解决方案1】:
这里简要介绍了画布绘图库的工作原理
未更改的画布只是一个大位图。一旦您在画布上绘制形状,它们就是不可访问的、被遗忘的像素。
Canvas 绘图库将所有形状存储到“保留”对象中。每个形状对象都有足够的关于自身的信息,以便绘图库在必要时重新绘制它。
画布绘图库是对象的“控制器”。这些库具有必要的算法,可以根据需要跟踪、操作和重绘所有形状对象。
每个形状对象都保留以下信息:
基本识别
形状的固有属性:
- 矩形形状(矩形、图像、文本)知道宽度和高度。
- 圆形(圆形、椭圆形、正多边形、星形)知道半径和边数。
- 行知道长度。
- 曲线形状(弧线、贝塞尔曲线、路径)知道锚点和控制点。
- 文字也知道……嗯,文字!
- 图像也知道它们的像素数据(通常存储在 javascript Image 对象中)
转化信息:
- 起始 X/Y 坐标
- 平移 - 偏离起始坐标的累积移动。
- 旋转 - 此形状的累积旋转(通常以弧度为单位)。
- 缩放 - 累积调整大小
- 其他变换(不太常见)是倾斜和扭曲
- 分层信息 - 当前 z-index
样式信息:
- 描边颜色,
- 笔画宽度,
- 填充颜色,
- 不透明度,
- 是可见的,
- 线帽,
- 角半径
追踪能力:
- 边界框 - 完全包含此形状的最小矩形
- 这用于“命中测试”以查看鼠标是否在此对象内(用于选择和拖动)
【解决方案2】:
如果您不想使用库,您可能会发现我的回答 in this thread 很有帮助。正如 markE 所说,一旦画布被写入,就无法跟踪该数据(除非您关心循环遍历每个单独的像素并测试其颜色;尽管这仅对像素级碰撞检测真正有用)。