Fabric JS绘制具有活动形状的多边形
我需要创建仪器绘制多边形在我的项目与织物js。 我发现sctipthttps://github.com/taqimustafa/fabricjs-polygon非常适合我。 但此脚本适用于Fabric 1.6.3,而我使用的是1.7.11。
我对Fabric 1.7.11和activeShape有一个小问题。 ActiveShape仅在第一个点和最后一个点之间90度的区域中绘制。
下面是示例: https://codepen.io/daer_ru/pen/pdOMyX
var min = 99;
var max = 999999;
var polygonMode = true;
var pointArray = new Array();
var lineArray = new Array();
var activeLine;
var activeShape = false;
var canvas
$(window).load(function(){
prototypefabric.initCanvas();
$('#create-polygon').click(function() {
prototypefabric.polygon.drawPolygon();
});
});
var prototypefabric = new function () {
this.initCanvas = function () {
canvas = window._canvas = new fabric.Canvas('c');
canvas.setWidth($(window).width());
canvas.setHeight($(window).height()-$('#nav-bar').height());
//canvas.selection = false;
canvas.on('mouse:down', function (options) {
if(options.target && options.target.id == pointArray[0].id){
prototypefabric.polygon.generatePolygon(pointArray);
}
if(polygonMode){
prototypefabric.polygon.addPoint(options);
}
});
canvas.on('mouse:up', function (options) {
});
canvas.on('mouse:move', function (options) {
if(activeLine && activeLine.class == "line"){
var pointer = canvas.getPointer(options.e);
activeLine.set({ x2: pointer.x, y2: pointer.y });
var points = activeShape.get("points");
points[pointArray.length] = {
x:pointer.x,
y:pointer.y
}
activeShape.set({
points: points
});
canvas.renderAll();
}
canvas.renderAll();
});
};
};
prototypefabric.polygon = {
drawPolygon : function() {
polygonMode = true;
pointArray = new Array();
lineArray = new Array();
activeLine;
},
addPoint : function(options) {
var random = Math.floor(Math.random() * (max - min + 1)) + min;
var id = new Date().getTime() + random;
var circle = new fabric.Circle({
radius: 5,
fill: '#ffffff',
stroke: '#333333',
strokeWidth: 0.5,
left: (options.e.layerX/canvas.getZoom()),
top: (options.e.layerY/canvas.getZoom()),
selectable: false,
hasBorders: false,
hasControls: false,
originX:'center',
originY:'center',
id:id
});
if(pointArray.length == 0){
circle.set({
fill:'red'
})
}
var points = [(options.e.layerX/canvas.getZoom()),(options.e.layerY/canvas.getZoom()),(options.e.layerX/canvas.getZoom()),(options.e.layerY/canvas.getZoom())];
line = new fabric.Line(points, {
strokeWidth: 2,
fill: '#999999',
stroke: '#999999',
class:'line',
originX:'center',
originY:'center',
selectable: false,
hasBorders: false,
hasControls: false,
evented: false
});
if(activeShape){
var pos = canvas.getPointer(options.e);
var points = activeShape.get("points");
points.push({
x: pos.x,
y: pos.y
});
var polygon = new fabric.Polygon(points,{
stroke:'#333333',
strokeWidth:1,
fill: '#cccccc',
opacity: 0.3,
selectable: false,
hasBorders: false,
hasControls: false,
evented: false
});
canvas.remove(activeShape);
canvas.add(polygon);
activeShape = polygon;
canvas.renderAll();
}
else{
var polyPoint = [{x:(options.e.layerX/canvas.getZoom()),y:(options.e.layerY/canvas.getZoom())}];
var polygon = new fabric.Polygon(polyPoint,{
stroke:'#333333',
strokeWidth:1,
fill: '#cccccc',
opacity: 0.3,
selectable: false,
hasBorders: false,
hasControls: false,
evented: false
});
activeShape = polygon;
canvas.add(polygon);
}
activeLine = line;
pointArray.push(circle);
lineArray.push(line);
canvas.add(line);
canvas.add(circle);
canvas.selection = false;
},
generatePolygon : function(pointArray){
var points = new Array();
$.each(pointArray,function(index,point){
points.push({
x:point.left,
y:point.top
});
canvas.remove(point);
});
$.each(lineArray,function(index,line){
canvas.remove(line);
});
canvas.remove(activeShape).remove(activeLine);
var polygon = new fabric.Polygon(points,{
stroke:'#333333',
strokeWidth:0.5,
fill: 'red',
opacity: 1,
hasBorders: false,
hasControls: false
});
canvas.add(polygon);
activeLine = null;
activeShape = null;
polygonMode = false;
canvas.selection = true;
}
};
解决方案
创建多边形时需要使用objectCaching:false
。在创建完整的多边形之后,不要使用它,因此它将创建自己的对象缓存,这样如果没有修改,它就不会在下一次渲染调用时渲染。
此处已更新codepen
相关文章