【轉】使用fabricjs實現圖形編輯器

使用fabricjs實現圖形編輯器

http://www.mamicode.com/info-detail-2417117.html

1、fabricjs的引用html

1.能夠直接經過script引入vue

2.經過npm安裝html5

  1)npm install fabricjsnpm

  2)在須要使用的地方導入  import { fabric } from ‘fabric‘canvas

  技術分享圖片

  而後就能夠使用fabric來對canvas畫布進行圖形的編輯數組

2、fabricjs的使用編輯器

1.將圖層從外部拖入畫布中spa

.設置元素爲可拖放,將draggable屬性設置爲true.net

 技術分享圖片

.dataTransfer.setData() 是用於設置拖動數據的數據類型和值,第一個參數通常都是爲文本text,第二個參數是被拖動對象的id,也可不設置雙向綁定

.綁定ondragover事件(規定元素要放到何處)和ondrop(元素放置)

注意:ondragover事件是必需要的,否則會識別不了放置的位置,詳細可瞭解菜鳥教程上的解說http://www.runoob.com/html/html5-draganddrop.html

技術分享圖片

技術分享圖片

以上代碼在綁定拖動事件的時候有if判斷是爲了限制拖拽放置的容器,讓左右兩邊的拖拽互不影響

 在drop須要放置的事件中調用fabricjs的添加圖片的方法,left和top就是你要把被拖元素放置在畫布上的位置

技術分享圖片

添加成功後圖形就能夠進行平移、縮放、旋轉等基本操做

3.複製、粘貼、剪切、撤銷、重作

參考https://www.cnblogs.com/lfqcode/p/8601605.html,剪切的原理和複製相似,不一樣的是剪切的時候要將該對象從畫布上移除

撤銷重作可參考https://jsfiddle.net/abhi47/rwdpf3nL/29/

4.經過拖動改變圖層層級關係

技術分享圖片

 

技術分享圖片

1)首先經過vue的數據雙向綁定將左中右三部分聯繫起來,從左邊拖動圖形到畫布的時候,右邊數據列相應發生改變,在對右邊進行拖動改變圖層層級的時候,右邊數據列的順序發生變化的同時畫布圖層層級也跟着變化

這時候能夠封裝一個方法,用來更新右邊數據列的信息

技術分享圖片

操做右邊區域的拖拽和左邊的同樣,可是要限制所拖拽後要放置的容器,否則會出現右邊的能夠拖放到畫布的狀況,因此在綁定拖動事件的時候纔會有判斷的狀況

2)處理右邊拖動事件的第一步和左邊的一致,先設置元素爲可拖動,而後要讓圖層拖動到空白區域才能放置

技術分享圖片

這時候須要考慮幾個問題(由於後面不管是更新數據列仍是更新畫布圖層的層級關係,都是須要用到索引的,因此如下狀況都是使用索引值):

第一,須要記錄被拖目標對象的索引

第二,須要記錄最終放置在哪一個位置

第三,肯定好放置位置後數據列順序改變,同時畫布圖層層級也變化

如今就按照上面的問題一步一步解決:

第一,給右邊每條數據上綁定一個自定義屬性data-orig,值爲數組的index,這是數組用index屬性是爲了記錄數據的原始狀態,由於在頁面展現的時候是倒序顯示的

技術分享圖片

技術分享圖片

(該數組的數據更新在左邊拖圖形到畫布的時候同步更新了)

第二,由於要實現元素拖動空白區域才能讓其放置,這時能夠在每條記錄之中添加一個p標籤,而後設置opacity爲0

技術分享圖片

同時綁定一個自定義屬性,值也是數組的index,而後怎麼獲取呢,繼續看

技術分享圖片

以上代碼中,evt就是記錄了被拖目標對象的信息,而後經過toElemen.getAttribute能夠獲取到某個屬性值,objsArr數組是canvas畫布的全部圖層記錄

獲取到後第一步是須要先把當前拖動的目標對象記錄起來,而後splice將其從數組中刪除,爲何是操做記錄畫布圖層的數組,後面會說到,

移除以後,再將目標對象插入到數組指定的位置,而後調用

that.canvas2.renderAll();這就是爲何移除和插入的時候要操做畫布的數據,由於操做完成後調用該句代碼就會自動將畫布進行從新繪製
最後調用以前封裝的方法that.layer_edit_Evt();這時右邊的數據列也進行了更新,以下圖
技術分享圖片

 

以上就是關於fabricjs的部分圖形操做,可能有的地方說的不太好,就請見諒了。

fabricjs:http://fabricjs.com/

相關文章
相關標籤/搜索