
canvas中的拖拽、缩放、旋转 (下) —— 代码实现
上一篇文章介绍了canvas中的拖拽、缩放、旋转中涉及到的数学知识。
代码准备 - 如何在canvas中画出一个带旋转角度的元素
在canvas中,如果一个元素带有一个旋转角度,可以直接变化canvas的坐标轴来画出此元素。举个例子,
代码整体思路
整个demo的实现思路如下:
用户开始触摸(touchstart)时,获取用户的触摸对象,是Sprite的本体?删除按钮?缩放按钮?旋转按钮?并且根据各种情况,对变化参数进行初始化。
用户移动手指(touchmove)时,根据手指的坐标,更新stage中的所有元素的位置、大小,记录变化参数。修改对应sprite的属性值。同时对canvas进行重绘。
用户一旦停止触摸(touchend)时,根据变化参数,更新sprite的坐标,同时对变化参数进行重置。
需要注意的是,在touchmove的过程中,并不需要更新sprite的坐标,只需要记录变化的参数即可。在touchend过程中,再进行坐标的更新。坐标的唯一用处,就是判断用户点击时,落点是否在指定区域内。
代码细节
首先,声明两个类:Stage和Sprite。Stage表示整个canvas区域,Sprite表示canvas中的元素。我们可以在Stage中添加多个Sprite,删除Sprite。这两个类的属性如下。
demo中,点击canvas下方的红色方块时,会实例化一个sprite,调用stage.append时,会将实例化的sprite直接push到Stage的spriteList属性内。
下面是Stage的方法:
Sprite的方法:
Stage的方法主要是处理和用户交互的逻辑,得到用户操作的交互参数,然后根据交互参数调用Sprite的方法来进行变化。
代码在这里:https://coypan.info/demo/canvas-drag-scale-rotate.html
写在后面
本文介绍了文章开头给出的demo的详细实现过程。代码还有很大的优化空间。事实上,工作上的需求并没有要求【旋转】,只需要实现【拖拽】、【缩放】即可。在只实现【拖拽】和【缩放】的情况下,会容易很多,不需要用到四个顶点的坐标以及之前的那些复杂的数学知识。而在自己实现【旋转】的过程中,也学到了很多。符合预期。
