摘要:簡介是一個(gè)可以簡化程序編寫的庫。為提供所缺少的對象模型交互和一整套其他不可或缺的工具。基于協(xié)議開源,在上有許多人貢獻(xiàn)代碼。在移動,線,曲線,或弧等命令的幫助下,路徑可以形成令人難以置信的復(fù)雜形狀。同組的路徑路徑組的幫助,開放更多的可能性。
簡介
Fabric.js是一個(gè)可以簡化canvas程序編寫的庫。 Fabric.js為canvas提供所缺少的對象模型, svg parser, 交互和一整套其他不可或缺的工具。基于MIT協(xié)議開源,在github上有許多人貢獻(xiàn)代碼。
Why fabric?canvas提供一個(gè)好的畫布能力, 但其api超級爛。如果你就想畫個(gè)簡單圖形, 其實(shí)也可以, 不過做一些復(fù)雜的圖形繪制, 編寫一些復(fù)雜的效果,就不是那么好了。
fabric就是為此而開發(fā)。
用對象的方式去編寫代碼
舉個(gè)例子
傳統(tǒng)的畫正方形代碼
// 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);
好的 其實(shí)并沒有什么差別 不過我們試著旋轉(zhuǎn)一下角度
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);
如果我們想重新調(diào)整位置 怎么辦
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
畫一個(gè)三角形 和一個(gè) 圓形
// 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 其實(shí)也就有了get
對象可以創(chuàng)建時(shí)設(shè)置屬性 也可以先實(shí)例化 再賦值
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是函數(shù) 大家可以使用class繼承
默認(rèn)值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 是圖像基類
你可以自己擴(kuò)充方法
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
經(jīng)典的設(shè)計(jì) 有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你可以輕松的加載一個(gè)圖片
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);
當(dāng)然也可以通過url加載一張圖片到canvas
fabric.Image.fromURL("my_image.png", function(oImg) { canvas.add(oImg); });
可以對加載的圖片進(jìn)行預(yù)處理
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
我們已經(jīng)看了簡單的形狀,然后圖像。更復(fù)雜、豐富的形狀和內(nèi)容呢?
路徑包括一系列的命令,這基本上模仿一個(gè)筆從一個(gè)點(diǎn)到另一個(gè)。在“移動”,“線”,“曲線”,或“弧”等命令的幫助下,路徑可以形成令人難以置信的復(fù)雜形狀。同組的路徑(路徑組的幫助),開放更多的可能性。
類似于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 點(diǎn).
“L” 代表 “l(fā)ine” 畫一條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也可以設(shè)置canvas屬性
當(dāng)然 太困然了 所以你可以使用 fabric.loadSVGFromString or fabric.loadSVGFromURL 方法
Afterword看些demo吧
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79095.html
摘要:之前我們學(xué)習(xí)了基礎(chǔ)用法現(xiàn)在我們開始一些好玩的我們先回顧設(shè)置一下正方形角度方法這是沒有動畫的都有方法那么正方形會從到有一個(gè)動畫過度從左到右進(jìn)行變動逆時(shí)針轉(zhuǎn)度當(dāng)然還支持這些方法圖片可以使用效果一次可以使用多個(gè)效果當(dāng)然你也可以自己定義支持顏色 之前我們學(xué)習(xí)了基礎(chǔ)用法 現(xiàn)在我們開始一些好玩的 Animation 我們先回顧設(shè)置一下正方形角度方法 rect.set(angle, 45); 這是沒...
摘要:之前我們學(xué)習(xí)了基礎(chǔ)和高級特性現(xiàn)在介紹更神奇的東西話說這個(gè)功能我最喜歡組成群組可以統(tǒng)一修改其中所有組件屬性如何定義現(xiàn)在我們就可以對其中的對象集修改中的元素相對于定位但是由于要確保之前得到卻切位置所以要異步可以動態(tài)添加添加并修改當(dāng)然你可以使用 之前我們學(xué)習(xí)了基礎(chǔ)和高級特性 現(xiàn)在介紹更神奇的東西 Groups 話說這個(gè)功能我最喜歡 組成群組可以統(tǒng)一修改其中所有組件屬性 如何定義 var...
摘要:前言熟悉的朋友想必都使用或者聽說過,算是一個(gè)元老級的庫了,從第一個(gè)版本發(fā)布到現(xiàn)在,已經(jīng)有年時(shí)間了。中緩存是默認(rèn)開啟的,同時(shí)也可以設(shè)置為禁用。處理屏屏幕模糊的問題,直接給出處理方法,就不展開說了。 前言 熟悉 canvas 的朋友想必都使用或者聽說過 Fabric.js,F(xiàn)abric 算是一個(gè)元老級的 canvas 庫了,從第一個(gè)版本發(fā)布到現(xiàn)在,已經(jīng)有 8 年時(shí)間了。我近一年時(shí)間也在項(xiàng)目...
閱讀 2964·2023-04-26 02:04
閱讀 1278·2021-11-04 16:07
閱讀 3699·2021-09-22 15:09
閱讀 678·2019-08-30 15:54
閱讀 1899·2019-08-29 14:11
閱讀 2525·2019-08-26 12:19
閱讀 2255·2019-08-26 12:00
閱讀 752·2019-08-26 10:27