fabricjs 限制对象拖动
fabricjs limiting object drag
参考下面的代码,我可以在canvas框内来回拖动红线,让它停在左边的极限。但是这条线并没有停在右边的极限——它会消失在方框之外,如果我向左拖动,它会重新出现。我查看了 fabricjs 演示(独立控件、PerPixel 拖放、Stickman)并注意到可以以类似的方式拖动对象 "out of sight"。这是fabricjs的特性,还是有什么方法可以修复我的代码,使红线不能被拖出正确的限制?
var canvas = new fabric.Canvas('cnvs');
var leftLimit = 20;
var rightLimit = 400;
var redLine = new fabric.Line([leftLimit, 0, leftLimit, canvas.height], {
stroke: 'red',
strokeWidth: 2,
borderColor: 'white',
hasControls: false
});
canvas.add(redLine);
canvas.renderAll();
canvas.on('object:moving', function(e) {
redLine = e.target;
redLine.set({
top: 0
});
if (redLine.left < leftLimit) {
redLine.set({
left: leftLimit
});
}
if (redLine > rightLimit) {
redLine.set({
left: rightLimit
});
}
canvas.renderAll();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.3/fabric.js"></script>
<canvas id="cnvs" width="500" height="200" style="border:1px solid #000000"></canvas>
我不确定您是否打错了字,但是 (redLine > rightLimit)
没有任何意义。你应该比较 left
:
if (redLine.left > rightLimit) {
redLine.set({ left: rightLimit });
}
或者,因为你的线有一定的宽度,你可以让它停止而不重叠边界:
if (redLine.left + redLine.strokeWidth > rightLimit) {
redLine.set({ left: rightLimit - redLine.strokeWidth });
}
参考下面的代码,我可以在canvas框内来回拖动红线,让它停在左边的极限。但是这条线并没有停在右边的极限——它会消失在方框之外,如果我向左拖动,它会重新出现。我查看了 fabricjs 演示(独立控件、PerPixel 拖放、Stickman)并注意到可以以类似的方式拖动对象 "out of sight"。这是fabricjs的特性,还是有什么方法可以修复我的代码,使红线不能被拖出正确的限制?
var canvas = new fabric.Canvas('cnvs');
var leftLimit = 20;
var rightLimit = 400;
var redLine = new fabric.Line([leftLimit, 0, leftLimit, canvas.height], {
stroke: 'red',
strokeWidth: 2,
borderColor: 'white',
hasControls: false
});
canvas.add(redLine);
canvas.renderAll();
canvas.on('object:moving', function(e) {
redLine = e.target;
redLine.set({
top: 0
});
if (redLine.left < leftLimit) {
redLine.set({
left: leftLimit
});
}
if (redLine > rightLimit) {
redLine.set({
left: rightLimit
});
}
canvas.renderAll();
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.3/fabric.js"></script>
<canvas id="cnvs" width="500" height="200" style="border:1px solid #000000"></canvas>
我不确定您是否打错了字,但是 (redLine > rightLimit)
没有任何意义。你应该比较 left
:
if (redLine.left > rightLimit) {
redLine.set({ left: rightLimit });
}
或者,因为你的线有一定的宽度,你可以让它停止而不重叠边界:
if (redLine.left + redLine.strokeWidth > rightLimit) {
redLine.set({ left: rightLimit - redLine.strokeWidth });
}