国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Fabric.js 自定義控件

這篇具有很好參考價值的文章主要介紹了Fabric.js 自定義控件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文簡介

帶尬猴,我是德育處主任


雖然 Fabric.js 提供的基礎功能已經(jīng)很豐富了,但有時難免需要定制一些需求。比如本文要講的 『自定義控件』。掌握創(chuàng)建自定義控件這個功能,能夠創(chuàng)建更加精美和實用的圖形應用程序,提高用戶體驗和用戶滿意度。

盡管 Fabric.js 的文檔很一般,但 demo 還挺豐富。本文講解 Fabric.js 官網(wǎng)收錄的 Custom controls, render and actions 。



自定義控件

先看看官方例子

Fabric.js 自定義控件

這個例子創(chuàng)建了2個自定義控件,一個是復制,一個是刪除。

官方代碼我會放到文末,接下來我們試著創(chuàng)建一個“自定義刪除控件”。


初始化畫布和頁面元素

按照 Custom controls, render and actions 的樣式創(chuàng)建一個矩形。

Fabric.js 自定義控件

<canvas id="c" width="500" height="400" style="border:1px solid #ccc"></canvas>

<script>
  // 綁定頁面畫布
  let canvas = new fabric.Canvas('c')

  // 創(chuàng)建矩形
  let rect = new fabric.Rect({
    left: 100,
    top: 50,
    fill: 'yellow',
    width: 200,
    height: 100,
    objectCaching: false,
    stroke: 'lightgreen',
    strokeWidth: 4,
  })

  // 將矩形添加到畫布里
  canvas.add(rect)
</script>

使用上面的代碼就可以在畫布中創(chuàng)建一個矩形。如果你對這些代碼還不太熟悉的話,推薦閱讀一下 《Fabric.js 中文入門教程》


創(chuàng)建刪除按鈕

創(chuàng)建自定義控件通常有一下2步操作:

  1. 創(chuàng)建控件
  2. 添加功能事件

Fabric.js 提供了 fabric.Control() 方法創(chuàng)建自定義控件。該方法可以定義控件的基礎屬性和事件綁定,基礎屬性包括控件位置、鼠標經(jīng)過時的樣式等。常用的事件有鼠標按下(mouseDownHandler)、鼠標抬起(mouseUpHandler)、鼠標拖拽(actionHandler)等。

Fabric.js 自定義控件

// 省略前面的代碼……

// 刪除元素的方法
function deleteObject(eventData, transform) {
  let target = transform.target
  let canvas = target.canvas
  canvas.remove(target) // 刪除元素
  canvas.requestRenderAll() // 刷新畫布
}

// 創(chuàng)建自定義控件并添加到矩形里
rect.controls.deleteControl = new fabric.Control({
  x: 0.5,
  y: -0.5,
  offsetY: -16,
  offsetX: 16,
  cursorStyle: 'pointer', // 鼠標移到控件時的指針樣式
  mouseUpHandler: deleteObject, // 鼠標抬起時觸發(fā)的事件
  render: function(ctx, left, top, styleOverride, fabricObject) { // 渲染一個粉紅色的正方形
    ctx.save()
    let size = this.cornerSize
    ctx.fillStyle = 'pink'
    ctx.translate(left, top)
    ctx.fillRect(-size / 2, -size / 2, size, size)
    ctx.restore()
  },
  cornerSize: 24
})

fabric.Control() 方法接收一個對象參數(shù),該對象有一個 render 屬性用來渲染自定義控件。這里面涉及到部分原生 canvas 的基礎知識,比如 ctx.save()ctx.restore() ,這部分內(nèi)容給我在 《canvas 狀態(tài)管理》 里提到過,有興趣的工友可以去看看。



Custom controls, render and actions 的代碼

前面講到的就是創(chuàng)建自定義控件的基本方法, Fabric.js 官網(wǎng)收錄的 Custom controls, render and actions 例子中使用了 base64 格式的圖片作為自定義控件的展示元素,而且還加多了一個復制元素的控件。經(jīng)過前面的例子,相信你已經(jīng)能看得懂 Custom controls, render and actions 的代碼。

我把代碼復制到這里,有興趣的可以看看~

Fabric.js 自定義控件

<div class="controls">
  <p>
    <button id="add" onclick="Add()">Add a rectangle</button>
  </p>
</div>
<canvas id="c" width="500" height="400" style="border:1px solid #ccc"></canvas>

<script src="../js/fabric.js"></script>
<script>
  var canvas = this.__canvas = new fabric.Canvas('c');

  var deleteIcon = "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3E%3Csvg version='1.1' id='Ebene_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='595.275px' height='595.275px' viewBox='200 215 230 470' xml:space='preserve'%3E%3Ccircle style='fill:%23F44336;' cx='299.76' cy='439.067' r='218.516'/%3E%3Cg%3E%3Crect x='267.162' y='307.978' transform='matrix(0.7071 -0.7071 0.7071 0.7071 -222.6202 340.6915)' style='fill:white;' width='65.545' height='262.18'/%3E%3Crect x='266.988' y='308.153' transform='matrix(0.7071 0.7071 -0.7071 0.7071 398.3889 -83.3116)' style='fill:white;' width='65.544' height='262.179'/%3E%3C/g%3E%3C/svg%3E";

  var cloneIcon = "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='iso-8859-1'%3F%3E%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 55.699 55.699' width='100px' height='100px' xml:space='preserve'%3E%3Cpath style='fill:%23010002;' d='M51.51,18.001c-0.006-0.085-0.022-0.167-0.05-0.248c-0.012-0.034-0.02-0.067-0.035-0.1 c-0.049-0.106-0.109-0.206-0.194-0.291v-0.001l0,0c0,0-0.001-0.001-0.001-0.002L34.161,0.293c-0.086-0.087-0.188-0.148-0.295-0.197 c-0.027-0.013-0.057-0.02-0.086-0.03c-0.086-0.029-0.174-0.048-0.265-0.053C33.494,0.011,33.475,0,33.453,0H22.177 c-3.678,0-6.669,2.992-6.669,6.67v1.674h-4.663c-3.678,0-6.67,2.992-6.67,6.67V49.03c0,3.678,2.992,6.669,6.67,6.669h22.677 c3.677,0,6.669-2.991,6.669-6.669v-1.675h4.664c3.678,0,6.669-2.991,6.669-6.669V18.069C51.524,18.045,51.512,18.025,51.51,18.001z M34.454,3.414l13.655,13.655h-8.985c-2.575,0-4.67-2.095-4.67-4.67V3.414z M38.191,49.029c0,2.574-2.095,4.669-4.669,4.669H10.845 c-2.575,0-4.67-2.095-4.67-4.669V15.014c0-2.575,2.095-4.67,4.67-4.67h5.663h4.614v10.399c0,3.678,2.991,6.669,6.668,6.669h10.4 v18.942L38.191,49.029L38.191,49.029z M36.777,25.412h-8.986c-2.574,0-4.668-2.094-4.668-4.669v-8.985L36.777,25.412z M44.855,45.355h-4.664V26.412c0-0.023-0.012-0.044-0.014-0.067c-0.006-0.085-0.021-0.167-0.049-0.249 c-0.012-0.033-0.021-0.066-0.036-0.1c-0.048-0.105-0.109-0.205-0.194-0.29l0,0l0,0c0-0.001-0.001-0.002-0.001-0.002L22.829,8.637 c-0.087-0.086-0.188-0.147-0.295-0.196c-0.029-0.013-0.058-0.021-0.088-0.031c-0.086-0.03-0.172-0.048-0.263-0.053 c-0.021-0.002-0.04-0.013-0.062-0.013h-4.614V6.67c0-2.575,2.095-4.67,4.669-4.67h10.277v10.4c0,3.678,2.992,6.67,6.67,6.67h10.399 v21.616C49.524,43.26,47.429,45.355,44.855,45.355z'/%3E%3C/svg%3E%0A"

  var deleteImg = document.createElement('img');
  deleteImg.src = deleteIcon;

  var cloneImg = document.createElement('img');
  cloneImg.src = cloneIcon;

  fabric.Object.prototype.transparentCorners = false;
  fabric.Object.prototype.cornerColor = 'blue';
  fabric.Object.prototype.cornerStyle = 'circle';

  function Add() {
    var rect = new fabric.Rect({
      left: 100,
      top: 50,
      fill: 'yellow',
      width: 200,
      height: 100,
      objectCaching: false,
      stroke: 'lightgreen',
      strokeWidth: 4,
    });

    canvas.add(rect);
    canvas.setActiveObject(rect);
  }

  function renderIcon(icon) {
    return function renderIcon(ctx, left, top, styleOverride, fabricObject) {
      var size = this.cornerSize;
      ctx.save();
      ctx.translate(left, top);
      ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle));
      ctx.drawImage(icon, -size/2, -size/2, size, size);
      ctx.restore();
    }
  }

  fabric.Object.prototype.controls.deleteControl = new fabric.Control({
    x: 0.5,
    y: -0.5,
    offsetY: -16,
    offsetX: 16,
    cursorStyle: 'pointer',
    mouseUpHandler: deleteObject,
    render: renderIcon(deleteImg),
    cornerSize: 24
  });

  fabric.Object.prototype.controls.clone = new fabric.Control({
    x: -0.5,
    y: -0.5,
    offsetY: -16,
    offsetX: -16,
    cursorStyle: 'pointer',
    mouseUpHandler: cloneObject,
    render: renderIcon(cloneImg),
    cornerSize: 24
  });

  Add();

  function deleteObject(eventData, transform) {
    var target = transform.target;
		var canvas = target.canvas;
      canvas.remove(target);
      canvas.requestRenderAll();
	}

  function cloneObject(eventData, transform) {
    var target = transform.target;
    var canvas = target.canvas;
    target.clone(function(cloned) {
      cloned.left += 10;
      cloned.top += 10;
      canvas.add(cloned);
    });
  }
</script>


代碼倉庫

? 基礎自定義控件用法



推薦閱讀

??《Fabric.js 從入門到膨脹》

??《Fabric.js 動態(tài)設置字號大小》

??《Fabric.js 監(jiān)聽元素相交(重疊)》

??《Fabric.js 拖放元素進畫布》

??《Fabric.js 保存自定義屬性》

??《Fabric.js 樣式不更新怎么辦?》
代碼倉庫文章來源地址http://www.zghlxwxcb.cn/news/detail-711425.html

到了這里,關于Fabric.js 自定義控件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Fabric.js 復制粘貼元素

    Fabric.js 復制粘貼元素

    點贊 + 關注 + 收藏 = 學會了 當你要復制一個 fabric 的元素時,你考慮到的是什么?是深拷貝當前選中對象再添加到畫布中? 其實, fabric.js 提供了一個克隆方法,在 fabric.js 官網(wǎng)的案例里也有這個demo:Fabric.js demos · Copy and Paste。 這次就講講這個 demo。 動手之前,我們先理清思

    2024年02月08日
    瀏覽(24)
  • Fabric.js 樣式不更新怎么辦?

    Fabric.js 樣式不更新怎么辦?

    帶尬猴,我嗨德育處主任 不知道你有沒有遇到過在使用 Fabric.js 時無意中一些騷操作修改了元素的樣式,但刷新畫布卻沒更新元素樣式? 如果你也遇到同樣的問題的話,可以嘗試使用本文的方法。 我先舉個例子。 在這個例子中,頁面運行1秒后,我想通過 rect.fill = \\\'red\\\' 的方

    2024年02月07日
    瀏覽(17)
  • Fabric.js 元素選中狀態(tài)的事件與樣式

    Fabric.js 元素選中狀態(tài)的事件與樣式

    帶尬猴! 你是否在使用 Fabric.js 時希望能在選中元素后自定義元素樣式或選框(控制角和輔助線)的樣式? 如果是的話,可以放心往下讀。 本文將手把腳和你一起過一遍 Fabric.js 在對象元素選中后常用的樣式設置。 我將對象元素選中后的設置分成3類進行講解: 控制角 輔助

    2024年02月11日
    瀏覽(20)
  • HTML5 2d canvas 庫 —— Fabric.js 和 Konva.js

    原生 canvas 的操作主要基于上下文,需要使用者自己從0開始去實現(xiàn)一些基本功能,比較復雜。而 canvas 庫文件則封裝好了許多便利的對象,使得用戶可以在比較高級的層面上進行繪制。 Fabric.js 官網(wǎng):Fabric.js Javascript Canvas Library Konva.js 官網(wǎng):Konva 中文文檔 中文API 優(yōu)點: 比較老

    2024年02月12日
    瀏覽(21)
  • Fabric.js 拖拽頂點修改多邊形形狀

    Fabric.js 拖拽頂點修改多邊形形狀

    我正在參加「掘金·啟航計劃」 戴尬猴,我是德育處主任 這次要介紹的一個demo是\\\"拖拽多邊形定點修改多邊形形狀\\\"。 其實 Fabric.js 官網(wǎng)也有這個demo:Fabric.js demos · Custom controls, polygon 。但這個demo可能對于剛接觸 Fabric.js 的工友來說有點過于復雜,所以本文就把該demo進一步簡

    2024年02月03日
    瀏覽(649)
  • fabric.js 實現(xiàn)元素拖拽、引入圖片、標注交互

    fabric.js 實現(xiàn)元素拖拽、引入圖片、標注交互

    by:垃圾程序員 特別鳴謝:拿只鍵盤出來繡花的德育處主任,他的系列文章給了我很大的幫助。該說不說,站在前人的肩膀上就是得勁。 德育處主任 - 知乎 拿只鍵盤出來繡花 回答數(shù) 7,獲得 143 次贊同 https://www.zhihu.com/people/rabbit-svip fabric.js 是一個用于創(chuàng)建可交互式的 HTML5

    2024年04月12日
    瀏覽(21)
  • Fabric.js+vue 實現(xiàn)鼠標滾輪縮放畫布+移動畫布

    話不多說 直接貼代碼 一、實現(xiàn)鼠標滾輪縮放畫布 使用說明,我的canvas畫布定義為 canvas,替他均不用額外設置變量。canvas = new fabric.Canvas(\\\'editorCanvas\\\', {... 二、實現(xiàn)鼠標按下變抓手,并可移動畫布中內(nèi)容 使用說明:data中定義panning: false,用來標記鼠標按下狀態(tài)(是否鼠標按下)

    2024年02月09日
    瀏覽(93)
  • fabric.js里toDataURL后,畫布內(nèi)容展示不全?

    fabric.js里toDataURL后,畫布內(nèi)容展示不全?

    復現(xiàn)場景: 用fabric生成畫布后,轉(zhuǎn)成圖片,然后直接在瀏覽器里打開,畫布展示內(nèi)容缺失 畫布原圖: toDataURL后鏈接在瀏覽器打開: 原因解析: base64鏈接太長,輸入瀏覽器鏈接被截斷,導致展示不全,可直接將url鏈接放在dom元素里測試

    2024年02月13日
    瀏覽(13)
  • 基于fabric.js的圖片編輯器, 畫布背景實現(xiàn)原理

    基于fabric.js的圖片編輯器, 畫布背景實現(xiàn)原理

    使用了element-plus提供的圖片上傳 el-upload 組件 圖片上傳支持兩種元素,普通圖片元素和背景圖片元素,所以定義屬性type進行區(qū)分 type為 Image 為普通圖片, background 為背景 背景也是一張圖片,使用fabric.Image創(chuàng)建圖片元素 因為沒有圖片服務器所以把上傳的文件轉(zhuǎn)換了base64圖片,作為f

    2024年02月02日
    瀏覽(44)
  • Qt自定義控件 —— 顏色選擇組合控件

    Qt自定義控件 —— 顏色選擇組合控件

    ???????? 在開始閱讀本文之前,如果您有學習創(chuàng)建Qt自定義控件并在其他項目中引用的需求,請參考: Linux系統(tǒng)下在Qt Creator中創(chuàng)建自定義控件并在其他項目中引用 https://blog.csdn.net/YMGogre/article/details/128920804 目錄 1、應用場景: 2、所需資源: 3、界面布局: 3.1、各布局/控件

    2024年02月10日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包