Canvas / Fabric.js .loadFromJSON()替换整个画布

时间:2015-01-15 20:32:36

标签: javascript json canvas fabricjs

我有2个JSON对象:

  • jSONObject1

    {"类型":"组"" originX":"左"" originY":& #34;顶部""左":0,"顶部":0,"对象&#34 ;: [{"类型":"线""中风":"灰"" X 1":430,& #34; X 2":20.0," Y 1":430," Y2":430},         {"类型":"线""中风":"灰"" X 1":430,&# 34; X 2":20.0," Y 1":20.0," Y2":20.0}         {"类型":"线""中风":"灰"" X 1":430,&# 34; X 2":430," Y 1":20.0," Y2":430},         {"类型":"线""中风":"灰"" X 1":20.0,&# 34; X 2":20.0," Y 1":430," Y2":20.0}]}

包含要在画布上绘制的线条数组,构成建筑平面布置图

  • jSONObject2

    {"类型":"组"" originX":"左"" originY":& #34;顶部""左":0,"顶部":0, "对象":[{"类型":" RECT"" originX":"左"&#34 ; originY":"顶部""左":45,"顶部": - 405"宽度":60,& #34;高度" 60"填充":"红色"},         {"类型":" RECT"" originX":"左"" originY":"顶部""左" 105"顶部": - 405.0,"宽度" 60"高度":60, "填充":"红色"},         {"类型":" RECT"" originX":"左"" originY":"顶部""左" 165"顶部": - 405.0,"宽度" 60"高度":60, "填充":"蓝色"},         {"类型":" RECT"" originX":"左"" originY":"顶部""左" 225"顶部": - 405.0,"宽度" 60"高度":60, "填充":"蓝色"}]}

包含要在画布上绘制的矩形数组,用于显示平面布置图中不同点的指标。

我使用.loadFromJSON(...)在画布上渲染所需的线条/矩形。问题是,每次调用此函数时,它都会完全替换画布上的所有内容,而不是覆盖平面图上的平面图度量矩形。

将2个独立的JSON对象渲染到Canvas元素上而没有覆盖另一个的最佳方法是什么?

我查看this GitHub issue建议使用 fromObject()方法从JSON添加对象而不清除整个画布。从理论上讲,这听起来像是一个不错的主意...这个页面也引出了2个jsfiddle"例子"如何使用这个fromObject方法,one of which doesn't even work和其他一个似乎工作但很不清楚。

尝试使用loadFromJSON()(覆盖):

Canvas canvas = document.getElementById("myCanvas");
canvas.loadFromJSON(JSON.stringify(jSONObject1))
canvas.loadFromJSON(JSON.stringify(jSONObject2))
canvas.renderAll();

尝试使用fromObject()(没有工作)

var jSONObjects = jSONObject1.concat(jSONObject2);
for (var i = 0; i < jSONObjects.length; i++) {
    var klass = fabric.util.getKlass(jSONObjects[i].type);
    var obj = klass.fromObject(jSONObjects[i]);
    canvas.add(obj);
}
canvas.renderAll();

提前致谢。

2 个答案:

答案 0 :(得分:3)

如果查看loadFromJSON的代码,每次都会清除画布。

loadFromJSON: function (json, callback, reviver) {
if (!json) {
  return;
}

// serialize if it wasn't already
var serialized = (typeof json === 'string')
  ? JSON.parse(json)
  : json;

this.clear();

var _this = this;
this._enlivenObjects(serialized.objects, function () {
  _this._setBgOverlay(serialized, callback);
}, reviver);

return this;
},

您需要连接两个JSON对象。

答案 1 :(得分:2)

我从未尝试过fromObject()方法。

我首先尝试使用concat合并两个JSON对象,然后使用loadFromJson()。

var finalFloorPlan = jSONObject1.concat(jSONObject2);