摘要:簡介是一個可以簡化程序編寫的庫。為提供所缺少的對象模型交互和一整套其他不可或缺的工具。基于協議開源,在上有許多人貢獻代碼。在移動,線,曲線,或弧等命令的幫助下,路徑可以形成令人難以置信的復雜形狀。同組的路徑路徑組的幫助,開放更多的可能性。
簡介
Fabric.js是一個可以簡化canvas程序編寫的庫。 Fabric.js為canvas提供所缺少的對象模型, svg parser, 交互和一整套其他不可或缺的工具。基于MIT協議開源,在github上有許多人貢獻代碼。
Why fabric?canvas提供一個好的畫布能力, 但其api超級爛。如果你就想畫個簡單圖形, 其實也可以, 不過做一些復雜的圖形繪制, 編寫一些復雜的效果,就不是那么好了。
fabric就是為此而開發。
用對象的方式去編寫代碼
舉個例子
傳統的畫正方形代碼
// reference canvas element (with id="c") var canvasEl = document.getElementById("c"); // get 2d context to draw on (the "bitmap" mentioned earlier) var ctx = canvasEl.getContext("2d"); // set fill color of context ctx.fillStyle = "red"; // create rectangle at a 100,100 point, with 20x20 dimensions ctx.fillRect(100, 100, 20, 20);
使用fabric
// create a wrapper around native canvas element (with id="c") var canvas = new fabric.Canvas("c"); // create a rectangle object var rect = new fabric.Rect({ left: 100, top: 100, fill: "red", width: 20, height: 20 }); // "add" rectangle onto canvas canvas.add(rect);
好的 其實并沒有什么差別 不過我們試著旋轉一下角度
var canvasEl = document.getElementById("c"); var ctx = canvasEl.getContext("2d"); ctx.fillStyle = "red"; ctx.translate(100, 100); ctx.rotate(Math.PI / 180 * 45); ctx.fillRect(-10, -10, 20, 20);
fabric
var canvas = new fabric.Canvas("c"); // create a rectangle with angle=45 var rect = new fabric.Rect({ left: 100, top: 100, fill: "red", width: 20, height: 20, angle: 45 }); canvas.add(rect);
如果我們想重新調整位置 怎么辦
var canvasEl = document.getElementById("c"); ... ctx.strokRect(100, 100, 20, 20); ... // erase entire canvas area ctx.clearRect(0, 0, canvasEl.width, canvasEl.height); ctx.fillRect(20, 50, 20, 20);
fabric
var canvas = new fabric.Canvas("c"); ... canvas.add(rect); ... rect.set({ left: 20, top: 50 }); canvas.renderAll();objects
fabric.Circle
fabric.Ellipse
fabric.Line
fabric.Polygon
fabric.Polyline
fabric.Rect
fabric.Triangle
畫一個三角形 和一個 圓形
// create a wrapper around native canvas element (with id="c") var canvas = new fabric.Canvas("c"); var circle = new fabric.Circle({ radius: 20, fill: "green", left: 100, top: 100 }); var triangle = new fabric.Triangle({ width: 20, height: 30, fill: "blue", left: 50, top: 50 }); canvas.add(circle, triangle);Manipulating objects
可以簡單的使用set來控制對象屬性
positioning — left, top;
dimension — width, height;
rendering — fill, opacity, stroke, strokeWidth;
scaling and rotation — scaleX, scaleY, angle;
and even those related to flipping — flipX, flipY.
rect.set("fill", "red"); rect.set({ strokeWidth: 5, stroke: "rgba(100,200,200,0.5)" }); rect.set("angle", 15).set("flipY", true);
有了set 其實也就有了get
對象可以創建時設置屬性 也可以先實例化 再賦值
var rect = new fabric.Rect({ width: 10, height: 20, fill: "#f55", opacity: 0.7 }); // or functionally identical var rect = new fabric.Rect(); rect.set({ width: 10, height: 20, fill: "#f55", opacity: 0.7 });
另外這里的fabric.Rect是函數 大家可以使用class繼承
默認值var rect = new fabric.Rect(); // notice no options passed in rect.getWidth(); // 0 rect.getHeight(); // 0 rect.getLeft(); // 0 rect.getTop(); // 0 rect.getFill(); // rgb(0,0,0) rect.getStroke(); // null rect.getOpacity(); // 1Hierarchy and Inheritance
fabric.Object 是圖像基類
你可以自己擴充方法
fabric.Object.prototype.getAngleInRadians = function() { return this.getAngle() / 180 * Math.PI; }; var rect = new fabric.Rect({ angle: 45 }); rect.getAngleInRadians(); // 0.785... var circle = new fabric.Circle({ angle: 30, radius: 10 }); circle.getAngleInRadians(); // 0.523... circle instanceof fabric.Circle; // true circle instanceof fabric.Object; // trueCanvas
fabric.Canvas 是canvas的wrapper
var canvas = new fabric.Canvas("c"); var rect = new fabric.Rect(); canvas.add(rect); // add object canvas.item(0); // reference fabric.Rect added earlier (first object) canvas.getObjects(); // get all objects on canvas (rect will be first and only) canvas.remove(rect); // remove previously-added fabric.Rect
經典的設計 有options 有對象方法
var canvas = new fabric.Canvas("c", { backgroundColor: "rgb(100,100,200)", selectionColor: "blue", selectionLineWidth: 2 // ... }); // or var canvas = new fabric.Canvas("c"); canvas.setBackgroundImage(http://..."); canvas.onFpsUpdate = function(){ /* ... */ }; // ...Images
使用fabric.Image你可以輕松的加載一個圖片
html
js
var canvas = new fabric.Canvas("c"); var imgElement = document.getElementById("my-image"); var imgInstance = new fabric.Image(imgElement, { left: 100, top: 100, angle: 30, opacity: 0.85 }); canvas.add(imgInstance);
當然也可以通過url加載一張圖片到canvas
fabric.Image.fromURL("my_image.png", function(oImg) { canvas.add(oImg); });
可以對加載的圖片進行預處理
fabric.Image.fromURL("my_image.png", function(oImg) { // scale image down, and flip it, before adding it onto canvas oImg.scale(0.5).setFlipX(true); canvas.add(oImg); });Path and PathGroup
我們已經看了簡單的形狀,然后圖像。更復雜、豐富的形狀和內容呢?
路徑包括一系列的命令,這基本上模仿一個筆從一個點到另一個。在“移動”,“線”,“曲線”,或“弧”等命令的幫助下,路徑可以形成令人難以置信的復雜形狀。同組的路徑(路徑組的幫助),開放更多的可能性。
類似于svg的path
var canvas = new fabric.Canvas("c"); var path = new fabric.Path("M 0 0 L 200 100 L 170 200 z"); path.set({ left: 120, top: 120 }); canvas.add(path);
“M” 代表 “move” 命令, 告訴筆到 0, 0 點.
“L” 代表 “line” 畫一條0, 0 到 200, 100 的線.
another “L” creates a line to 170, 200.
z” tells forces drawing pen to close current path and finalize the shape.
... var path = new fabric.Path("M 0 0 L 300 100 L 200 300 z"); ... path.set({ fill: "red", stroke: "green", opacity: 0.5 }); canvas.add(path);
path也可以設置canvas屬性
當然 太困然了 所以你可以使用 fabric.loadSVGFromString or fabric.loadSVGFromURL 方法
Afterword看些demo吧
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/79095.html
摘要:之前我們學習了基礎用法現在我們開始一些好玩的我們先回顧設置一下正方形角度方法這是沒有動畫的都有方法那么正方形會從到有一個動畫過度從左到右進行變動逆時針轉度當然還支持這些方法圖片可以使用效果一次可以使用多個效果當然你也可以自己定義支持顏色 之前我們學習了基礎用法 現在我們開始一些好玩的 Animation 我們先回顧設置一下正方形角度方法 rect.set(angle, 45); 這是沒...
摘要:之前我們學習了基礎和高級特性現在介紹更神奇的東西話說這個功能我最喜歡組成群組可以統一修改其中所有組件屬性如何定義現在我們就可以對其中的對象集修改中的元素相對于定位但是由于要確保之前得到卻切位置所以要異步可以動態添加添加并修改當然你可以使用 之前我們學習了基礎和高級特性 現在介紹更神奇的東西 Groups 話說這個功能我最喜歡 組成群組可以統一修改其中所有組件屬性 如何定義 var...
摘要:前言熟悉的朋友想必都使用或者聽說過,算是一個元老級的庫了,從第一個版本發布到現在,已經有年時間了。中緩存是默認開啟的,同時也可以設置為禁用。處理屏屏幕模糊的問題,直接給出處理方法,就不展開說了。 前言 熟悉 canvas 的朋友想必都使用或者聽說過 Fabric.js,Fabric 算是一個元老級的 canvas 庫了,從第一個版本發布到現在,已經有 8 年時間了。我近一年時間也在項目...
閱讀 2978·2023-04-26 02:04
閱讀 1286·2021-11-04 16:07
閱讀 3712·2021-09-22 15:09
閱讀 685·2019-08-30 15:54
閱讀 1906·2019-08-29 14:11
閱讀 2534·2019-08-26 12:19
閱讀 2261·2019-08-26 12:00
閱讀 764·2019-08-26 10:27