Canvas学习与实践 - 基于Canvas的像素画板实现
2020-09-27 10:42:38
最近在学习Canvas,想到之前说到的Css像素画能不能基于Canvas来设计,正好Canvas处理与绘画图像很强大,并且可以精确到控制每一个像素,还挺适合作为一个像素画板的。
效果演示
演示画一个bilibili小电视
设计思路
既然是画像素画的,自然不能跟普通画板一样线条边缘平滑,而是反其道而行之。通过放大每一个像素,营造一种像素风的感觉。建立一定尺寸的Canvas画布,放大每一个像素,通过鼠标操作每一个像素块颜色来完成一张像素画的制作。
具体实践
生成初始像素画板
想象像素画板每一个网格都是一个像素点,对每个像素点进行放大,方便鼠标操作。
1 | <div class="drawing-board-wrapper"> |
下面对Canvas设置100%的宽高以放大整个画板,并需要设置image-rendering: pixelated;
来放大每一个像素点,否者单纯放大Canvas会造成放大后模糊的现象。
1 | .drawing-board-wrapper { |
整个画布宽高我设置为浏览器窗口高度减去100px,默认画布网格行数与列数为32,每个网格宽高设置为1px,并将每个网格X,Y偏移值,宽高,颜色存入initGridList
中,方便后续操作。generateInitialGrids
方法判断当前网格排序为奇数或偶数来赋予相应的背景颜色,将数据存入initGridList
列表。initDrawingBoard
方法遍历initGridList
列表生成每一个小网格来组成整个画板。
1 | // 画布大小 |
监听鼠标事件
初始画板生成后,需要通过鼠标在画板上面进行绘画,所以我们需要设置相应的点击、移动、聚焦等鼠标动作来绘画,清除、选中网格。
handleEvent
用来监听鼠标执行了哪种操作,并调用相应的方法。hoverGrids
方法用来通知当前鼠标悬停在哪个网格上,并通过加深网格背景颜色来告知用户。clearHoverGrids
方法清除上一个网格悬停效果。drawingGrids
方法通过点击鼠标左键触发,并改变当前鼠标所在网格背景颜色。eraseGrids
方法通过点击鼠标右键触发,并清除当前鼠标所在网格背景颜色。draw
方法能精确定位鼠标所在网格的序号,并改变当前网格颜色。
1 | // 绘画状态 |
画板设置
画板设置能提供部分接口来修改画板绘画属性,例如画板网格数、画笔颜色、画笔粗细等配置。
功能列表
- 画板网格数
- 画笔颜色
- 画笔粗细
- 快捷工具
- 预览功能 [2020.10.16]
- 导出图片 [2020.10.16]
- 导出CSS box-shadow
未解决的问题 & bugs
- 绘画时,鼠标移动过快,出现线条不连贯中断问题。
- 等等