gpt4 book ai didi

javascript - 如何避免Fabric.JS中.animate方法的中断

转载 作者:行者123 更新时间:2023-12-03 00:40:55 24 4
gpt4 key购买 nike

在下面的脚本中,红色方 block 将移动到单击的点。

    let canvas = new fabric.Canvas('canvas', {width: 500,height: 500});
let square = new fabric.Rect({left: 100,top: 100,width: 50,height: 50,fill: 'red' });

canvas.add(square);

canvas.on('mouse:down', function (options) {
let x = options.e.x;
let y = options.e.y;
square.animate ({ left: x, top: y }, {
onChange: canvas.requestRenderAll.bind(canvas),
duration: 500
});
})

但是,如果您在方 block 移动时单击另一个点,它会将其目的地更改为新点为什么会发生这种情况?

从我的 Angular 来看,脚本流程是这样的:

1) 在鼠标按下事件上,.animate 回调转到事件队列

2) 当它触发红色方 block 时,开始通过调用 canvas.requestRenderAll() 改变它的坐标

3)如果点击其他点,另一个回调(callback2)将转到事件队列。

它的触发速度相对较快,因此红色方 block 从回调 2 触发时的位置开始更改其目的地

这是正确的吗?

如何避免这种行为?我需要的是红色方 block 移动到第一个点,并且没有新的单击会改变它的方式。只有当方 block 完成它的移动时,我们才能选择新的点,它将移动到哪里

谢谢!

最佳答案

在点击处理程序中,您可以在开始动画之前立即使其自行删除,并在 onComplete 回调中重新附加自身:

const canvas = new fabric.Canvas('c');

let square = new fabric.Rect({left: 100,top: 100,width: 50,height: 50,fill: 'red' });

canvas.add(square);
const handler = function (options) {
//remove handler
this.off('mouse:down', handler);
let x = options.e.x;
let y = options.e.y;
square.animate ({ left: x, top: y }, {
onChange: canvas.requestRenderAll.bind(canvas),
onComplete: () => {
//reattach handler
this.on('mouse:down', handler);
},
duration: 2000
});
}
canvas.on('mouse:down', handler);
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.4.3/fabric.js"></script>
<canvas id='c' width="500" height="500"></canvas>

(为了测试目的,我放慢了动画速度)

关于javascript - 如何避免Fabric.JS中.animate方法的中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53469412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com