在Fabric js中的两个对象之间添加动画

use*_*101 5 javascript fabricjs

我有一个非常基本的应用程序,让你创建形状并用线连接它们.为此,您将执行以下操作.

Example

1. Click new animation
2. add rectangle
3. add child
4. add circle
Run Code Online (Sandbox Code Playgroud)

您可以移动形状,拖动和调整大小.我想知道是否可以在两个对象之间添加动画.因此,例如,一个小的圆形圆球将在两个物体之间的线上生成动画.我已经在结构js的动画页面上检查了演示,但不确定是否可以从对象b进行.

这是FIDDLE.

Mat*_*son 5

我不知道你是否可以在结构中使用内置的动画功能,因为你说这些对象可能会自己移动.但你可以使用一些数学手动轻松地制作这样的东西:

在此输入图像描述

你可以把它当作一个在0和1之间振荡的波来处理.这个函数的正确公式是:

在此输入图像描述

  • 当"角度"为0或2π的倍数时,振幅为0,因此球位于对象1的中心
  • 当"角度"是π的倍数时,幅度为1,球位于物体2的中心
  • 当振幅为0.5时,球位于两个物体之间

您可以根据时间,任何期间或持续时间增加角度.

var animateBallBetweenObjects = function (obj1, obj2) {

    // Add the "ball"

    var circle = new fabric.Circle({
        radius: 10,
        fill: 'blue',
        left: obj1.getCenterPoint().x,
        top: obj1.getCenterPoint().y,
        originX: 'center',
        originY: 'middle',
        selectable: false
    });

    canvas.add(circle);

    var period = 1000;
    var amplitude = 0;
    var angle = 0;
    var prevTime = Date.now();

    var loop = function () {

        // Calculate the new amplitude

        var now = Date.now();
        var elapsed = now - prevTime;
        prevTime = now;
        angle += Math.PI * (elapsed / (period * 0.5));
        amplitude = 0.5 * (Math.sin(angle - (0.5 * Math.PI)) + 1);

        // Set the new position

        var obj1Center = obj1.getCenterPoint();
        var obj2Center = obj2.getCenterPoint();

        circle.setLeft(obj1Center.x + (amplitude * (obj2Center.x - obj1Center.x)));
        circle.setTop(obj1Center.y + (amplitude * (obj2Center.y - obj1Center.y)));
        canvas.renderAll();

        requestAnimationFrame(loop);
    }

    // Animate as fast as possible

    requestAnimationFrame(loop);
};
Run Code Online (Sandbox Code Playgroud)

FIDDLE在这里.