私は新人ですAngularおよびFabric.js。ユーザーがキャンバスにオブジェクトをドラッグアンドドロップして、線で接続できるUIを構築しようとしています。
本質的に、最初のリンクからAngular4のドラッグアンドドロップの例を取得して、2番目のリンクにあるFabric.jsキャンバスでうまく機能することを期待しています。
<ul>
<li><a href="https://www.npmjs.com/package/ng2-drag-drop">Drag and Drop</a></li>
<li><a href="https://codepen.io/janih/pen/Pqwbpe">Canvas Example</a></li>
</ul>
ドラッグアンドドロップの例は機能しますが、Fabric.jsキャンバスはChromeで四角いボックスとして表示され、それ以上はレンダリングされません。
私が取った手順:
Tsconfig.jsonで「allowJs」を設定しました:true
私のdnd.component.htmlは次のようになります:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
<script type="text/javascript" src="canvas.js"></script>
<style>
canvas {
border: 1px solid #ccc;
}
</style>
<div class="container">
<div>
<simple-dnd></simple-dnd>
<canvas id="c" width="600" height="600"></canvas>
</div>
</div>
そして、canvas.jsは次のようになります。
setTimeout(function() {
$(document).ready(function () {
var canvas = new fabric.Canvas('c', {selection: false});
var grid = 50;
// create grid
for (var i = 0; i < (600 / grid); i++) {
canvas.add(new fabric.Line([i * grid, 0, i * grid, 600], {stroke: '#ccc', selectable: false}));
canvas.add(new fabric.Line([0, i * grid, 600, i * grid], {stroke: '#ccc', selectable: false}))
}
// add objects
var rect = new fabric.Rect({
left: 100,
top: 100,
width: 247,
height: 309,
fill: '#9f9',
originX: 'left',
originY: 'top',
centeredRotation: true
});
canvas.add(rect);
var rect2 = new fabric.Rect({
left: 100,
top: 100,
width: 223,
height: 167,
fill: '#faa',
originX: 'left',
originY: 'top',
centeredRotation: true
});
canvas.add(rect2);
var rect3 = new fabric.Rect({
left: 196,
top: 334,
width: 150,
height: 75,
fill: 'blue',
originX: 'left',
originY: 'top',
centeredRotation: true
});
canvas.add(rect3);
canvas.renderAll();
});
}, 0);
私は似たようなことをします。ただし、提供したリンクを正確に使用していない。私はcanvasとangular4とともにファブリックjsを使用して、このようにpngファイルをキャンバスにドラッグアンドドロップします。成分:
import { Component, OnInit} from '@angular/core';
import 'fabric';
declare const fabric: any;
@Component({
selector: 'app-image-preview',
templateUrl: './image-preview.component.html',
styleUrls: ['./image-preview.component.styl']
})
export class ImagePreviewComponent implements OnInit {
image: any;
file:File = null;
canvas:any;
constructor() { }
ngOnInit() {
//this.context = this.canvasRef.nativeElement.getContext('2d');
this.canvas = new fabric.Canvas('canvas', { selection: false });
}
handleDrop(e) {
this.file = e.dataTransfer.files[0];
const reader = new FileReader();
reader.onload = (imgFile) => {
console.log(imgFile);
const data = imgFile.target["result"];
fabric.Image.fromURL(data, (img) => {
let oImg = img.set({
left: 0,
top: 0,
angle: 0
}).scale(1);
this.canvas.add(oImg).renderAll();
var a = this.canvas.setActiveObject(oImg);
var dataURL = this.canvas.toDataURL({format: 'png', quality: 0.8});
});
};
reader.readAsDataURL(this.file);
return false;
}
}
HTMLテンプレート:
<div
(dragover)="false"
(dragend)="false"
(drop)="handleDrop($event)">
<canvas id="canvas" class="canvas" width="500" height="500">
</canvas>
</div>
私のために働いたもの(2Toadの解決策: https://stackoverflow.com/a/49481766/9753985 )Angular 7:
最初のインストールファブリック:
npm i fabric
npm i @types/fabric
HTMLにcanvas要素を追加します。
<canvas id="canvas" width="500" height="500"></canvas>
次に、TSインポートファブリックでファブリックオブジェクトを作成します。
import { Component, OnInit } from '@angular/core';
import { fabric } from 'fabric';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
canvas: any;
ngOnInit() {
this.canvas = new fabric.Canvas('canvas');
this.canvas.add(new fabric.IText('Hello World !'));
}
}
fabric.js + Angular 7.x
私にとっては、このシナリオで機能します:
<script src="./assets/fabric.js"></script>
declare const fabric: any;
<canvas id="canvas" width="300" height="300"></canvas>
ngAfterViewInit() {
const canvas = new fabric.Canvas('canvas');
const rect = new fabric.Rect({
top : 100,
left : 100,
width : 60,
height : 70,
fill : 'red'
});
canvas.add(rect);
}
angular-editor-fabric-js は、「Angular複数のオプションを備えたv5用のFabricjsに基づくドラッグアンドドロップエディター」です
気分転換にもお使いいただけます。