大三的时候上过一门面向对象的课程,期末要做个小项目,要尽可能使用面向对象的思想,不限制编程语言。
当时的我正在为即将到来的秋招做准备,便借此机会做了一个简单的 Canvas 绘图工具,可以添加一些基础形状(矩形、菱形、圆形、椭圆、三角形等)、文本框、画笔工具,工具栏 UI 照着 Figma 做的。
当时需要实现点击选中元素功能,我是通过遍历所有元素,计算点击位置是否在元素的区域内来实现的。如果有多个元素重叠,就比较头疼,需要再额外处理一下层级。
时隔 4 年,我又一次接触这类 Canvas 应用,看到了其他人对这个问题的一种非常完美的解决思路:
原始 Canvas 称为 c1,新增一个与其完全一致的 c2,每个元素在触发 draw 方法时,不仅在 c1 上进行绘制,还要在 c2 上绘制自己的包络区域,用一种随机的 rgb 值作为颜色值。并存储这样的(元素, color)键值对。
当触发点击时,先获取点击坐标在 c2 上的色值,再通过色值直接拿到对应的元素。这种做法也可以很好地处理多个元素重叠的层级问题。
非常妙。
这种做法叫做「像素标记法」。