Javascript Snap.svg沿路径拖动组并保存位置
我正在尝试Snap操作SVG,但在沿路径拖动一组元素时遇到了一些问题 我修改了我发现的这个 我可以拖动组,它会停留在我放下它的地方,但是当我再次开始拖动时,组会返回到它的原点,如果我发疯了,它就会开始真正有问题 我是SVG新手,我尝试了一些教程来学习,但是这些东西可能不适合我,我非常感谢您的一些见解Javascript Snap.svg沿路径拖动组并保存位置,javascript,svg,snap.svg,Javascript,Svg,Snap.svg,我正在尝试Snap操作SVG,但在沿路径拖动一组元素时遇到了一些问题 我修改了我发现的这个 我可以拖动组,它会停留在我放下它的地方,但是当我再次开始拖动时,组会返回到它的原点,如果我发疯了,它就会开始真正有问题 我是SVG新手,我尝试了一些教程来学习,但是这些东西可能不适合我,我非常感谢您的一些见解 编辑:我的比较好,谢谢你指出伊恩。我想问题是你每次都在重置ox。在前面的示例中,他们使用attr('cx')而不是ox,因此他们总是引用要偏移的形状的原始位置。每次重置时,差值将始终为零,因此将重置
编辑:我的比较好,谢谢你指出伊恩。我想问题是你每次都在重置ox。在前面的示例中,他们使用attr('cx')而不是ox,因此他们总是引用要偏移的形状的原始位置。每次重置时,差值将始终为零,因此将重置为零。所以你需要做一些修改 因此,在我们做任何事情之前,让所有的“牛市”都回到“原始位置”。 把‘sx’称为‘起始位置’,我们可以计算出每次拖动的起始位置。我们需要这个来添加“dx”(拖动时添加的增量差) 我们可以先存储原始位置…然后稍后更改变换以引用该原始位置,而不是起始位置
group.drag(move, start, end);
group.data("ox", +group.getBBox().cx);
group.data("oy", +group.getBBox().cy);
start = function () {
this.data("sx", +this.getBBox().cx);
this.data("sy", +this.getBBox().cy);
},
move = function (dx, dy) {
var tmpPt = {
x: this.data('sx') + dx,
y: this.data('sy') + dy
};
l = gradSearch(l, tmpPt);
pt = path.getPointAtLength(l);
// We change this!!!
if (!isNaN(pt.x) && !isNaN(pt.y)) {
this.transform('t' + (pt.x - this.data("ox")) + ',' + (pt.y - this.data("oy")) );
};
},
我认为问题在于每次都在重置ox。在前面的示例中,他们使用attr('cx')而不是ox,因此他们总是引用要偏移的形状的原始位置。每次重置时,差值将始终为零,因此将重置为零。所以你需要做一些修改 因此,在我们做任何事情之前,让所有的“牛市”都回到“原始位置”。 把‘sx’称为‘起始位置’,我们可以计算出每次拖动的起始位置。我们需要这个来添加“dx”(拖动时添加的增量差) 我们可以先存储原始位置…然后稍后更改变换以引用该原始位置,而不是起始位置
group.drag(move, start, end);
group.data("ox", +group.getBBox().cx);
group.data("oy", +group.getBBox().cy);
start = function () {
this.data("sx", +this.getBBox().cx);
this.data("sy", +this.getBBox().cy);
},
move = function (dx, dy) {
var tmpPt = {
x: this.data('sx') + dx,
y: this.data('sy') + dy
};
l = gradSearch(l, tmpPt);
pt = path.getPointAtLength(l);
// We change this!!!
if (!isNaN(pt.x) && !isNaN(pt.y)) {
this.transform('t' + (pt.x - this.data("ox")) + ',' + (pt.y - this.data("oy")) );
};
},
不太清楚,您问题中的代码与小提琴中的代码不同,因此不确定这是否只是原始源代码。你能在问题的底部添加一个与你当前拥有的代码相匹配的JSFIDLE(或编辑上面的代码以匹配)。谢谢@Ian,我忘记了最重要的一点。它不是很清楚,你问题中的代码与fiddle中的不同,所以不确定这是否只是原始源代码。你能在问题的底部添加一个与你当前拥有的代码相匹配的JSFIDLE吗(或者编辑上面的代码以匹配)。谢谢你@Ian,我忘记了最重要的一点。非常感谢,可能看起来很简单,但我被阻止了这么久,祝你愉快,再次感谢。非常感谢,也许它看起来很简单,但我被封锁了这么长时间,祝你有一个美好的一天,再次感谢。