<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
使用 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軸方向的距離。
如果想了解 viewportTransform
每個元素代表什麼,可以看看 《Fabric.js 變換視窗》
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 拖拽平移畫布方法範例的詳細內容,更多關於Fabric.js 拖拽平移畫布的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45