成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Fabric.js 簡(jiǎn)單介紹和使用

piapia / 867人閱讀

摘要:簡(jiǎn)介是一個(gè)可以簡(jiǎn)化程序編寫的庫(kù)。為提供所缺少的對(duì)象模型交互和一整套其他不可或缺的工具?;趨f(xié)議開(kāi)源,在上有許多人貢獻(xiàn)代碼。在移動(dòng),線,曲線,或弧等命令的幫助下,路徑可以形成令人難以置信的復(fù)雜形狀。同組的路徑路徑組的幫助,開(kāi)放更多的可能性。

簡(jiǎn)介

Fabric.js是一個(gè)可以簡(jiǎn)化canvas程序編寫的庫(kù)。 Fabric.js為canvas提供所缺少的對(duì)象模型, svg parser, 交互和一整套其他不可或缺的工具。基于MIT協(xié)議開(kāi)源,在github上有許多人貢獻(xiàn)代碼。

Why fabric?

canvas提供一個(gè)好的畫布能力, 但其api超級(jí)爛。如果你就想畫個(gè)簡(jiǎn)單圖形, 其實(shí)也可以, 不過(guò)做一些復(fù)雜的圖形繪制, 編寫一些復(fù)雜的效果,就不是那么好了。
fabric就是為此而開(kāi)發(fā)。

用對(duì)象的方式去編寫代碼

舉個(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í)并沒(méi)有什么差別 不過(guò)我們?cè)囍D(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

可以簡(jiǎn)單的使用set來(lái)控制對(duì)象屬性
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

對(duì)象可以創(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(); // 1
Hierarchy 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; // true
Canvas

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 有對(duì)象方法

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)然也可以通過(guò)url加載一張圖片到canvas

fabric.Image.fromURL("my_image.png", function(oImg) {
  canvas.add(oImg);
});

可以對(duì)加載的圖片進(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)看了簡(jiǎn)單的形狀,然后圖像。更復(fù)雜、豐富的形狀和內(nèi)容呢?
路徑包括一系列的命令,這基本上模仿一個(gè)筆從一個(gè)點(diǎn)到另一個(gè)。在“移動(dòng)”,“線”,“曲線”,或“弧”等命令的幫助下,路徑可以形成令人難以置信的復(fù)雜形狀。同組的路徑(路徑組的幫助),開(kāi)放更多的可能性。
類似于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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/79095.html

相關(guān)文章

  • Fabric.js簡(jiǎn)單介紹使用 (二)

    摘要:之前我們學(xué)習(xí)了基礎(chǔ)用法現(xiàn)在我們開(kāi)始一些好玩的我們先回顧設(shè)置一下正方形角度方法這是沒(méi)有動(dòng)畫的都有方法那么正方形會(huì)從到有一個(gè)動(dòng)畫過(guò)度從左到右進(jìn)行變動(dòng)逆時(shí)針轉(zhuǎn)度當(dāng)然還支持這些方法圖片可以使用效果一次可以使用多個(gè)效果當(dāng)然你也可以自己定義支持顏色 之前我們學(xué)習(xí)了基礎(chǔ)用法 現(xiàn)在我們開(kāi)始一些好玩的 Animation 我們先回顧設(shè)置一下正方形角度方法 rect.set(angle, 45); 這是沒(méi)...

    wangdai 評(píng)論0 收藏0
  • Fabric.js 簡(jiǎn)單介紹使用 (三)

    摘要:之前我們學(xué)習(xí)了基礎(chǔ)和高級(jí)特性現(xiàn)在介紹更神奇的東西話說(shuō)這個(gè)功能我最喜歡組成群組可以統(tǒng)一修改其中所有組件屬性如何定義現(xiàn)在我們就可以對(duì)其中的對(duì)象集修改中的元素相對(duì)于定位但是由于要確保之前得到卻切位置所以要異步可以動(dòng)態(tài)添加添加并修改當(dāng)然你可以使用 之前我們學(xué)習(xí)了基礎(chǔ)和高級(jí)特性 現(xiàn)在介紹更神奇的東西 Groups 話說(shuō)這個(gè)功能我最喜歡 組成群組可以統(tǒng)一修改其中所有組件屬性 如何定義 var...

    xi4oh4o 評(píng)論0 收藏0
  • 我從 fabric.js 中學(xué)到了什么

    摘要:前言熟悉的朋友想必都使用或者聽(tīng)說(shuō)過(guò),算是一個(gè)元老級(jí)的庫(kù)了,從第一個(gè)版本發(fā)布到現(xiàn)在,已經(jīng)有年時(shí)間了。中緩存是默認(rèn)開(kāi)啟的,同時(shí)也可以設(shè)置為禁用。處理屏屏幕模糊的問(wèn)題,直接給出處理方法,就不展開(kāi)說(shuō)了。 前言 熟悉 canvas 的朋友想必都使用或者聽(tīng)說(shuō)過(guò) Fabric.js,F(xiàn)abric 算是一個(gè)元老級(jí)的 canvas 庫(kù)了,從第一個(gè)版本發(fā)布到現(xiàn)在,已經(jīng)有 8 年時(shí)間了。我近一年時(shí)間也在項(xiàng)目...

    oogh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<