學(xué)習(xí)整理fabric.js自定義選擇控制框樣式和增加控制圖標(biāo)
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
選擇控制框簡介控制線控制點(diǎn)注意自定義控制線樣式與框選對(duì)象間的內(nèi)邊距fabric.Object.prototype.padding = 10;1 fabric.Object.prototype.controls.mtr.withConnection = false;1 修改控制線顏色fabric.Object.prototype.borderColor = 'dodgerblue';1 自定義控制點(diǎn)樣式// 修改控制點(diǎn)的形狀,默認(rèn)為`rect`矩形,可選的值還有`circle`圓形 fabric.Object.prototype.cornerStyle = "circle"; // 修改控制點(diǎn)的填充色為白色 fabric.Object.prototype.cornerColor = "white"; // 修改控制點(diǎn)的大小為10px fabric.Object.prototype.cornerSize = 10; // 設(shè)置控制點(diǎn)不透明,即可以蓋住其下的控制線 fabric.Object.prototype.transparentCorners = false; // 修改控制點(diǎn)的邊框顏色為`gray`灰色 fabric.Object.prototype.cornerStrokeColor = "gray";
// 單獨(dú)修改旋轉(zhuǎn)控制點(diǎn)距離主體的縱向距離為-20px fabric.Object.prototype.controls.mtr.offsetY = -20; // 單獨(dú)修改旋轉(zhuǎn)控制點(diǎn),光標(biāo)移動(dòng)到該點(diǎn)上時(shí)的樣式為`pointer`,一個(gè)手的形狀 fabric.Object.prototype.controls.mtr.cursorStyle = "pointer"; 自定義控制點(diǎn)貼圖/*控制選中邊框 旋轉(zhuǎn)圖標(biāo) start*/ // 渲染圖標(biāo)的方法 function renderIcon(image, initialAngle) { return function (ctx, left, top, styleOverride, fabricObject) { let size = this.cornerSize; ctx.save(); ctx.translate(left, top); ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle + initialAngle)); ctx.drawImage(image, -size / 2, -size / 2, size, size); ctx.restore(); }; } // 圖標(biāo)的下載鏈接省略 const iconURL = "../img/xuanzhuan.png"; const callback = (image, isError) => { if (!isError) { fabric.Object.prototype.controls.ml = new fabric.Control({ x: 0, y: -0.5, offsetY: -20, cursorStyle: 'pointer', actionHandler: fabric.controlsUtils.rotationWithSnapping, cursorStyleHandler: fabric.controlsUtils.rotationStyleHandler, // 渲染圖標(biāo) render: renderIcon(image._element, 0), // 設(shè)置控制點(diǎn)大小 cornerSize: 30 }); } }; fabric.Image.fromURL(iconURL, callback); /*控制選中邊框 旋轉(zhuǎn)圖標(biāo) stop*/ 添加自定義控制點(diǎn)/*控制選中邊框 增加自對(duì)應(yīng)圖標(biāo) start*/ // 從畫布中刪除當(dāng)前選中的對(duì)象 function deleteObject() { // 獲取畫布當(dāng)前選中的對(duì)象 let activeObject = canvas.getActiveObject(); if (activeObject) { canvas.remove(activeObject); canvas.renderAll(); } } // 垃圾桶圖標(biāo)的下載鏈接 const deleteIconURL = "../img/delete.png"; const deletecallback = (img, isError) => { console.log(img); if (!isError) { fabric.Object.prototype.controls.delete = new fabric.Control({ // x和y設(shè)置該控制點(diǎn)和第二列中間的控制點(diǎn)重合 x: 0, y: -0.5, // offsetX和offsetY設(shè)置該控制點(diǎn)在水平和豎直兩個(gè)方向上 // 偏移的距離(單位px) offsetX: 28, offsetY: -20, // 光標(biāo)移動(dòng)到該控制點(diǎn)時(shí)變?yōu)橐粋€(gè)手的圖標(biāo) cursorStyle: 'pointer', // 自定義的值,可忽略 actionName: "delete", // 設(shè)置當(dāng)點(diǎn)擊了該控制點(diǎn),鼠標(biāo)彈起是執(zhí)行的動(dòng)作處理方法 mouseUpHandler: () => deleteObject(), //渲染圖標(biāo) render: renderIcon(img._element, 0), cornerSize: 39 }); } }; fabric.Image.fromURL(deleteIconURL, deletecallback); /*控制選中邊框 增加自對(duì)應(yīng)圖標(biāo) stop*/ 所有代碼效果圖index.html<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>Fabric.js 上傳圖片保存</title> <script src="../fabric5.2.1.js"></script> <style> div#container { padding: 30px; font-family: 'verdana', lucida; } input { background-color: #ccc; padding: 0; width: 300px; color: #777; } #lnkDownload { display: block; padding: 0; margin-top: 10px; text-decoration: none; } </style> </head> <body> <div id="container"> <canvas id="imageCanvas" width="300" height="300"></canvas> <a id="lnkDownload" href="#"> <button> 保存圖片</button> </a> </div> <script src="script.js"></script> </body> </html> script.jsvar canvas = new fabric.Canvas('imageCanvas', { backgroundColor: 'rgb(240,240,240)', includeDefaultValues: false,// 指示toObject/toDatalessObject是否應(yīng)該包含默認(rèn)值,如果設(shè)置為false,則優(yōu)先于對(duì)象值 perPixelTargetFind: true, //這一句說明選中的時(shí)候以圖形的實(shí)際大小來選擇而不是以邊框來選擇 hasBorders: false, }); canvas.setWidth(500); canvas.setHeight(500); /*控制選中邊框 start*/ //將內(nèi)邊距設(shè)置為10px fabric.Object.prototype.padding = 10; // 修改控制點(diǎn)的形狀,默認(rèn)為`rect`矩形,可選的值還有`circle`圓形 fabric.Object.prototype.cornerStyle = "circle"; // 修改控制點(diǎn)的填充色為白色 fabric.Object.prototype.cornerColor = "white"; //將控制線默認(rèn)的淺藍(lán)色改為 #dc143c, fabric.Object.prototype.borderColor = '#dc143c'; // 修改控制點(diǎn)的大小為10px fabric.Object.prototype.cornerSize = 10; // 設(shè)置控制點(diǎn)不透明,即可以蓋住其下的控制線 fabric.Object.prototype.transparentCorners = false; // 修改控制點(diǎn)的邊框顏色為`gray`灰色 fabric.Object.prototype.cornerStrokeColor = "blue"; // 單獨(dú)修改旋轉(zhuǎn)控制點(diǎn)距離主體的縱向距離為-20px fabric.Object.prototype.controls.mtr.offsetY = -20; // 單獨(dú)修改旋轉(zhuǎn)控制點(diǎn),光標(biāo)移動(dòng)到該點(diǎn)上時(shí)的樣式為`pointer`,一個(gè)手的形狀 fabric.Object.prototype.controls.mtr.cursorStyle = "pointer"; //旋轉(zhuǎn)控制點(diǎn)和主體之間一般沒有那條控制線,這里我們對(duì)它進(jìn)行隱藏。 fabric.Object.prototype.controls.mtr.withConnection = false; /*控制選中邊框 stop*/ /*控制選中邊框 旋轉(zhuǎn)圖標(biāo) start*/ // 渲染圖標(biāo)的方法 function renderIcon(image, initialAngle) { return function (ctx, left, top, styleOverride, fabricObject) { let size = this.cornerSize; ctx.save(); ctx.translate(left, top); ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle + initialAngle)); ctx.drawImage(image, -size / 2, -size / 2, size, size); ctx.restore(); }; } // 圖標(biāo)的下載鏈接省略 const iconURL = "../img/xuanzhuan.png"; const callback = (image, isError) => { if (!isError) { fabric.Object.prototype.controls.ml = new fabric.Control({ x: 0, y: -0.5, offsetY: -20, cursorStyle: 'pointer', actionHandler: fabric.controlsUtils.rotationWithSnapping, cursorStyleHandler: fabric.controlsUtils.rotationStyleHandler, // 渲染圖標(biāo) render: renderIcon(image._element, 0), // 設(shè)置控制點(diǎn)大小 cornerSize: 30 }); } }; fabric.Image.fromURL(iconURL, callback); /*控制選中邊框 旋轉(zhuǎn)圖標(biāo) stop*/ /*控制選中邊框 增加自對(duì)應(yīng)圖標(biāo) start*/ // 從畫布中刪除當(dāng)前選中的對(duì)象 function deleteObject() { // 獲取畫布當(dāng)前選中的對(duì)象 let activeObject = canvas.getActiveObject(); if (activeObject) { canvas.remove(activeObject); canvas.renderAll(); } } // 垃圾桶圖標(biāo)的下載鏈接 const deleteIconURL = "../img/delete.png"; const deletecallback = (img, isError) => { console.log(img); if (!isError) { fabric.Object.prototype.controls.delete = new fabric.Control({ // x和y設(shè)置該控制點(diǎn)和第二列中間的控制點(diǎn)重合 x: 0, y: -0.5, // offsetX和offsetY設(shè)置該控制點(diǎn)在水平和豎直兩個(gè)方向上 // 偏移的距離(單位px) offsetX: 28, offsetY: -20, // 光標(biāo)移動(dòng)到該控制點(diǎn)時(shí)變?yōu)橐粋€(gè)手的圖標(biāo) cursorStyle: 'pointer', // 自定義的值,可忽略 actionName: "delete", // 設(shè)置當(dāng)點(diǎn)擊了該控制點(diǎn),鼠標(biāo)彈起是執(zhí)行的動(dòng)作處理方法 mouseUpHandler: () => deleteObject(), //渲染圖標(biāo) render: renderIcon(img._element, 0), cornerSize: 39 }); } }; fabric.Image.fromURL(deleteIconURL, deletecallback); /*控制選中邊框 增加自對(duì)應(yīng)圖標(biāo) stop*/ // 矩形 var rect = new fabric.Rect({ left: 100, top: 100, fill: 'orange', width: 100, height: 100, }) canvas.add(rect); // 圓角矩形 var rect2 = new fabric.Rect({ left: 300, top: 100, fill: 'yellowgreen', width: 100, height: 100, rx: 20, ry: 20 }) canvas.add(rect2); // 圓形 var circle = new fabric.Circle({ radius: 50, fill: 'green', left: 200, top: 200, controls: false, // 不可編輯 hasControls: false, // 控件將不顯示,并且不能用于操作對(duì)象 }); canvas.add(circle); // 使用 IText,可編輯文本 var text = new fabric.IText( '奇葩呀,www.qipa250.com', { top:300, fontSize:14, fontFamily: 'Comic Sans' } ) canvas.add(text); var imageSaver = document.getElementById('lnkDownload'); imageSaver.addEventListener('click', saveImage, false); function saveImage() { console.log('toJSON==', canvas.toJSON()); console.log('toObject==', canvas.toObject()); // 輸出序列化的內(nèi)容 this.href = canvas.toDataURL({ format: 'png', quality: 0.8 }); this.download = 'canvas.png'; } 該文章在 2023/5/23 10:36:40 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |