当我问你是否有理由在 KineticJS 阶段之外拥有图像条时,你回答:
只是因为当我 toJSON 它(用于保存和调用以供将来编辑)时,我只想要照片拼贴上的图像而不是条带上的照片。
我对此的回答是:
您不必在整个舞台上使用 toJSON。
如果您将照片条(以前在画布之外)与拼贴画(以前在画布内)分开到不同的图层中,那么您可以有两个图层并toJSON
仅在其中一个图层上使用!
结果将是toJSON
只会序列化来自给定层的对象,这听起来像你需要的。
jsfiddle - 这是一个示例来说明我的意思,请原谅我将图像捕捉到组的糟糕逻辑。我有 2 层:photoStripLayer
和collageLayer
单击拼贴 toJSON 按钮。请注意,console.log 输出不包含任何图像。这是因为collageLayer
它内部只有一个具有子矩形的组。
将第一个 yoda(左上角,其余不工作,这只是一个示例)拖到红色框中。抱歉,您必须尝试使用它才能正确捕捉(我假设您已经有了“捕捉”代码)
如果 Yoda 节点在dragend
红框内,它将使用 KineticJS 的moveTo
函数将 yoda 从photoStripLayer
-->移动collageLayer
。当 Yoda 捕捉到相对于新组的位置 (0,0) 时,您就会知道它起作用了。
现在单击 Collage toJSON 按钮。请注意,yoda 图像现在是 toJSON console.log 输出的一部分。yoda 被转移到新组,这是collageLayer
. 现在是 collageLayer 的一部分,Yoda 是.
这是拖动代码:
node.on('dragend', function () {
var pos = stage.getMousePosition();
var X = pos.x;
var Y = pos.y;
var minX = snap.getX();
var maxX = snap.getX() + snap.getWidth();
var minY = snap.getY();
var maxY = snap.getY() + snap.getHeight();
if (node.getX() < minX) {
node.moveTo(snap);
node.setX(0);
node.setY(0);
}
if (node.getX() > maxX) {
node.moveTo(snap);
node.setX(0);
node.setY(0);
}
if (node.getY() < minY) {
node.moveTo(snap);
node.setX(0);
node.setY(0);
}
if (node.getY() > maxY) {
node.moveTo(snap);
node.setX(0);
node.setY(0);
}
photoStripLayer.draw();
collageLayer.draw();
});
以及按钮点击代码来说明使用toJSON:
function collageToJSON() {
var cjson = collageLayer.toJSON();
console.log(cjson);
/* To illustrate, you can also call toDataURL here. But in JSFiddle I think it throws a Security Error.
collageLayer.toDataURL({
callback: function(dataUrl) {
window.open(dataUrl);
}
});
*/
}
document.getElementById('CtoJSON').addEventListener('click', function () {
collageToJSON();
});
你有它!通过让KineticJS处理整个过程来解决这个问题。