Fabric.js 拖拽平移画布
2022/12/24 4:24:04
本文主要是介绍Fabric.js 拖拽平移画布,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文简介
点赞 + 关注 + 收藏 = 学会了
使用 fabric.js
创建出来的画布默认是不能拖拽移动的。
不过我们可以利用一些小技巧让画布具有被拖拽的能力,fabric.js
官网也提供了一个 demo
,但文档上并没有详细的讲解拖拽画布的实现原理。
本文就粗略分析一下这个原理。
原理解析
鼠标拖拽的原理其实很简单,主要就3步:
- 鼠标点击元素
- 移动鼠标
- 松开鼠标
在鼠标移动时,获取鼠标当前位置,然后修改被拖拽元素的位置。
当松开鼠标时,也要获取松手那刻鼠标所在位置,然后设置元素的位置。
先看看官方给出的例子再逐步分析
<canvas id="c" width="500" height="500" style="border: 1px solid #ccc;"></canvas> <script src="../js/fabric.js"></script> <script> // 创建画布 let canvas = new fabric.Canvas('c', { allowTouchScrolling: true }) // 矩形 const rect = new fabric.Rect({ width: 100, height: 100, left: 10, top: 10, fill: 'pink' }) // 三角形 const triangle = new fabric.Triangle({ top: 100, left: 100, width: 80, // 底边长度 height: 100, // 底边到对角的距离 fill: 'blue' }) // 将矩形和三角形添加到画布中 canvas.add(rect, triangle) // 按下鼠标事件 canvas.on('mouse:down', function (opt) { var evt = opt.e; if (evt.altKey === true) { this.isDragging = true this.lastPosX = evt.clientX this.lastPosY = evt.clientY } }) // 移动鼠标事件 canvas.on('mouse:move', function (opt) { if (this.isDragging) { var e = opt.e; var vpt = this.viewportTransform; vpt[4] += e.clientX - this.lastPosX vpt[5] += e.clientY - this.lastPosY this.requestRenderAll() this.lastPosX = e.clientX this.lastPosY = e.clientY } }) // 松开鼠标事件 canvas.on('mouse:up', function (opt) { this.setViewportTransform(this.viewportTransform) this.isDragging = false }) </script>
拖拽画布的代码来自官方案例。我删减了部分元素。
从上面的代码可以看出,主要事件是 mouse:down
、mouse:move
、mouse:up
。
按下鼠标时
canvas.on('mouse:down', function (opt) { var evt = opt.e; if (evt.altKey === true) { this.isDragging = true this.lastPosX = evt.clientX this.lastPosY = evt.clientY } })
通过 mouse:down
事件,设置了按住 alt
键时再按下鼠标左键,才能触发拖拽事件(开始)。
自定义3个属性:
isDragging
: 拖拽状态,true
表示可拖拽lastPosX
: 画布上一个x坐标lastPosY
: 画布上一个y坐标
为什么要记录 lastPosX
和 lastPosY
呢?
把鼠标点击时,鼠标所在的位置记录下来。之后移动时,再通过鼠标新出现的位置和点击时的位置对比,就能计算出鼠标移动了多少距离,然后再调整画布移动的距离即可。
移动鼠标时
canvas.on('mouse:move', function (opt) { if (this.isDragging) { var e = opt.e; var vpt = this.viewportTransform; vpt[4] += e.clientX - this.lastPosX vpt[5] += e.clientY - this.lastPosY this.requestRenderAll() this.lastPosX = e.clientX this.lastPosY = e.clientY } })
通过 mouse:move
可以监听鼠标的移动。
此时就要通过 isDragging
判断是否进入拖拽状态。
viewportTransform
是 fabric.js
在画布上的一个属性。
官方文档是这样介绍的:
The transformation (a Canvas 2D API transform matrix) which focuses the viewport
上面的代码,修改了 viewportTransform
下标为 4
和 5
的元素。
viewportTransform[4]
: 水平位移(x轴)viewportTransform[5]
: 垂直位移(y轴)
e.clientX - this.lastPosX
就是鼠标移动的x轴方向的距离,e.clientY - this.lastPosY
可以计算出鼠标移动的y轴方向的距离。
requestRenderAll()
是在每次移动完画布就刷新一下。
刷新完画布,就把上一个点(x和y坐标)改成最新的:this.lastPosX = e.clientX
和 this.lastPosY = e.clientY
,给下次移动鼠标时提供一个参考值,方便计算。
松开鼠标时
canvas.on('mouse:up', function (opt) { this.setViewportTransform(this.viewportTransform) this.isDragging = false })
使用 setViewportTransform
设置画布的视图。
并退出拖拽模式:isDragging = false
。
以上就是在 fabric.js
中拖拽画布的方法。
点赞 + 关注 + 收藏 = 学会了
代码仓库
这篇关于Fabric.js 拖拽平移画布的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27Vue2面试真题详解与实战教程
- 2024-12-27Vue3面试真题详解与实战攻略
- 2024-12-27JS大厂面试真题解析与实战指南
- 2024-12-27JS 大厂面试真题详解与实战指南
- 2024-12-27React 大厂面试真题详解及应对策略
- 2024-12-27Vue2 大厂面试真题详解及实战演练
- 2024-12-27Vue3 大厂面试真题详解及实战指南
- 2024-12-27Vue3大厂面试真题详解与实战攻略
- 2024-12-26React入门教程:从零开始搭建你的第一个React应用
- 2024-12-25Vue2入门教程:轻松掌握前端开发基础