В предыдущей статье мы добавили на холст события мыши, благодаря чему узнали, как обрабатывать события, происходящие из-за взаимодействия пользователя с мышь.

Когда мы пишем canvas.on() и присоединяем события к холсту, это означает, что конкретное событие ограничено этим экземпляр холста.

Таким образом, если бы у нас было два холста, экземплярами которых были скажем, canvas1 и canvas2, мы могли бы прикрепить к ним разные обработчики событий, не наткнувшись на ошибку. . Это связано с тем, что экземпляры уважаюттолько события, назначенные им.

      var canvas1 = new fabric.Canvas("canvas1", {
        backgroundColor: "black",
        isDrawingMode: false,
      });

      var canvas2 = new fabric.Canvas("canvas2", {
        backgroundColor: "red",
        isDrawingMode: false,
      });

      canvas1.on("mouse:down", () => {
        console.log("This is canvas1");
      });

      canvas2.on("mouse:down", () => {
        console.log("This is canvas2");
      });

Прикрепите прослушиватели событий к объектам

Слушатель событий «перекоса»

Точно так же, как мы можем прикрепить прослушиватели событий к экземплярам холста с помощью метода on(), мы можем сделать то же самое с другими объектами холста. Итак, это означает, что приведенный ниже код полностью действителен:

      var skewFunction = function () {
        canvas.renderAll();
        tri.animate("strokeWidth", "+=8", {
          onChange: canvas.renderAll.bind(canvas),
          easing: fabric.util.ease.easeOutExpo,
        });
      };

      tri.on("skewing", skewFunction);

В приведенном выше коде tri — это экземпляр треугольника, к которому я добавил прослушиватель событий skewing. Кроме того, я создал обработчик событий под названием skewFunction, который будет вызываться каждый раз, когда мы наклоняем треугольник.

Примечание. Вы можете наклонить объект на холсте, нажав клавишу Shift и перетащив элементы управления.

skewFunction inturn — это функция, которая анимирует треугольник. Когда мы говорим tri.animate и передаем ему аргументы strokeWidth и +=8, это означает, что его ширина обводки будет увеличивается на 8 каждый раз, когда происходит перекос.

Вот полный код:

    var canvas = new fabric.Canvas("canvas", {
        backgroundColor: "black",
        isDrawingMode: false,
      });

      // Initiating a triangle instance
      var tri = new fabric.Triangle({
        top: 20,
        left: 90,
        width: 80,
        height: 200,
        fill: "blue",
        stroke: "white",
        strokeWidth: 1,
      });

      // Adding the tri instance to the canvas
      canvas.add(tri);

      // This is the event handler
      var skewFunction = function () {
        canvas.renderAll();
        tri.animate("strokeWidth", "+=8", {
          onChange: canvas.renderAll.bind(canvas),
          easing: fabric.util.ease.easeOutExpo,
        });
      };

      // when skewing event occurs, call skewFunction
      tri.on("skewing", skewFunction);

Увеличение радиуса круга при его перемещении

Вместо создания обработчика мы можем использовать старую добрую стрелочную функцию вот так:

      // Initiating a circle instance
      var circle = new fabric.Circle({
        top: 20,
        left: 90,
        radius: 6,
        fill: "#e6e6fa",
        stroke: "#9966cc",
        strokeWidth: 16,
      });

      // Adding the circle instance to the canvas
      canvas.add(circle);

      // Using an arrow function in the second argument
      circle.on("moving", () => {
        canvas.renderAll();
        circle.animate("radius", "+=7", {
          onChange: canvas.renderAll.bind(canvas),
          easing: fabric.util.ease.easeOutSine,
        });
      });

Это похоже на предыдущий пример, за исключением того, что радиусувеличивается на 7 всякий раз, когда мы перемещаем кругна холсте. Поскольку изначально радиус был равен 6, при перемещении его один раз его радиус изменится на 13, и он будет только увеличиваться при перемещении. !

Надеюсь, вы уловили идею. Другие прослушиватели событий также могут быть прикреплены к экземплярам объектов, подобным этому. То есть это будут выделено, снято выделение, перемещение, наклон, вращение, изменение и т. д.