Canvas实现自定义布局

244 阅读2分钟

需求背景

为页面编辑器实现可以自由布局,并能完成组件模块绑定。

image.png

体验使用

vue-page-editor => 自定义布局按钮

npm地址

使用地址

思路整理

思考思考一下。

一、边界与热区

二、布局数据结构

三、边界落点与修复

1.热区落点

  1. 监听点击事件、拿到offsetX、offsetY.
  2. 根据x、y进行是否存在热区数组内(热区数组由初始化递归布局树获取)
  3. 如果不在、判断为选中区域(后续完成)
  4. 如果在则根据存在热区在布局树查找出所有可能存在的热区。根据落点判断具体存在哪个热区。
  5. 获取热区后,拿到热区存在当前树节点的数组的位置进行起始落点修复,拿到修复后下标并存储他所在的直线。
  6. 根据上右下左原则、获取到对应热区原顶点位置。即 【下标, 下标+1】(末尾下标需要赋值为0下标)
  7. 根据拿到坐标位置。判断坐标相同点。即可确定具体落点并修复到具体线段上。
  8. 根据具体落点绘制落点,生成临时Canvas,并开始监听鼠标移动(同时根据鼠标落点绘制线段)
  9. 监听结束落点。

2.落点的连线与落点的确定

1.由1可知、落点确定后开始监听鼠标移动。根据移动绘制线段。

2.再次监听落点、如果落点后在之前被记录了落点、那么完成该落点。

3.落点情况分为:未在热区、在热区、在热区但是和之前落点的热区重合。

4.未再热区、在热区但是和之前落点的热区重合: 落点失败 销毁临时Canvas、重置为落点前的点。逻辑中止。

5.在热区且落下起点对边落点,完成连线。并根据连线进行区域划分

三、落点后的区域划分

核心规则: 交线一定会划分到最小矩形。

1.划分新区域

规则: 始终起点到终点依次划分

2.重新计算每块的占比与树的结构

规则: 根据交叉块、进行计算子节点、当前热区、子线段。