在做一些绘图类应用时,有时会遇到处理“图层”的问题,而HTML5原生的Canvas并没有“图层”的概念,所以需要一些特别的手段来实现多图层绘图。本文介绍一种多canvas
重叠模拟图层的方法来实现多图层的各种操作。
绘图区构建
用一个父元素作为容器,把所有的canvas
元素设置成一样的宽高并放在里面重叠。
1 |
|
具体方法是父元素设置为相对定位
,所有canvas
设置为绝对定位
,并且设置left
和top
为0
,使所有的canvas
元素重叠
1 |
|
图层操作
一般还会有图层管理面板
来进行图层的操作,需要保持canvas
元素状态和图层管理面板
同步,用原生js来操作DOM
实现是极其繁琐的,推荐使用一种框架,比如Vue
、React
、Angular
等来进行。由于不同框架实现图层操作方法不同,这里只给出原生js的实现思路。
新建图层
操作DOM
,在父容器上新增canvas
元素,并将其宽高设置为绘图区宽高。
删除图层
操作DOM
,在父容器上删除图层对应的canvas
元素。
切换当前图层
获取对应图层的context
,赋值给当前context
。
改变图层顺序
操作DOM
,把canvas
元素的顺序随之改变。
变换图层
为了方便,使用原生canvas API
里面的各种API即可:
- 移动:
translate(x, y)
- 旋转:
rotate(angle)
- 缩放:
scale(x, y)
- 变形:
transform(m11, m12, m21, m22, dx, dy)
详见:变形 Transformations - Web API 接口 | MDN
绘图区的保存与导出
导出图像
分别导出所有canvas
元素的图像,并按照图层从底部到顶部的顺序,绘制到一个canvas
元素中,再导出图像。
1 |
|
保存绘图区状态
记录各图层图像、名称、顺序等信息,其中图像使用Base64
编码成字符串,其它信息直接使用字符串,共同保存为一个json
文件,进行压缩,读取时,只需解压后还原各图层即可。
这里简单列出保存文件的大致实现方法,没有进行压缩。
1 |
|