Колесо Мышь Zoom ломает Панорамирование - PullRequest
0 голосов
/ 11 ноября 2019

Я использовал учебник Zoom / Pan на веб-странице Fabric. По какой-то причине, когда я вхожу, панорамирование больше не работает. Если я сделаю первый поворот, это нормально.

http://fabricjs.com/fabric-intro-part-5

Я очень новичок в использовании Vue и Javascript в целом. Я попытался добавить операторы рендеринга в нескольких местах и ​​тому подобное. Я уверен, что моя реализация где-то не так.

<template>
  <div class="home">
    <link rel="stylesheet" href="https://bootswatch.com/4/superhero/bootstrap.min.css">
    <h1> Hello </h1>
    <canvas id="c"></canvas>
  </div>
</template>
<script>
import { fabric } from 'fabric';
// @ is an alias to /src
// import HelloWorld from '@/components/HelloWorld.vue';

export default {
  name: 'projects',
  data: () => ({
    canvas: null,
    lastPosX: 0,
    lastPosY: 0,
    viewportTransform: null,
    isDragging: false,
    selection: false,
  }),
  components: {

  },
  computed: {

  },
  mounted() {
    // create a rectangle object
    this.canvas = new fabric.Canvas('c', { width: 800, height: 600 });
    const rect = new fabric.Rect({
      left: 100,
      top: 100,
      fill: 'red',
      width: 20,
      height: 20,
    });
    this.canvas.on('mouse:down', opt => this.mouseDown(opt));
    this.canvas.on('mouse:move', opt => this.mouseMove(opt));
    this.canvas.on('mouse:wheel', opt => this.mouseWheel(opt));
    this.canvas.on('mouse:up', opt => this.mouseUp(opt));
    this.viewportTransform = this.canvas.viewportTransform;
    const bgImage = 'https://source.unsplash.com/random';
    this.canvas.setBackgroundImage(bgImage, this.canvas.renderAll.bind(this.canvas), {
      top: 0,
      left: 0,
      originX: 'left',
      originY: 'top',
      scaleX: 1,
      scaleY: 1,
    });
    this.canvas.renderAll();
    // "add" rectangle onto canvas
    this.canvas.add(rect);
  },
  methods: {
    mouseWheel(opt) {
      const delta = opt.e.deltaY;
      // const pointer = this.canvas.getPointer(opt.e);
      let zoom = this.canvas.getZoom();
      zoom += delta / 200;
      if (zoom > 20) zoom = 20;
      if (zoom < 0.01) zoom = 0.01;
      this.canvas.zoomToPoint({ x: opt.e.offsetX, y: opt.e.offsetY }, zoom);
      opt.e.preventDefault();
      opt.e.stopPropagation();
      this.lastPosX = opt.e.clientX;
      this.lastPosY = opt.e.clientY;
      // this.canvas.requestRenderAll();
    },
    mouseDown(opt) {
      // const evt = opt.e;
      const { e: evt } = opt;
      if (evt.altKey === true) {
        console.log(evt);
        this.canvas.selection = false;
        this.isDragging = true;
        this.canvas.selection = false;
        this.lastPosX = evt.clientX;
        this.lastPosY = evt.clientY;
      }
    },
    mouseMove(opt) {
      if (this.isDragging) {
        const { e } = opt;
        // const e = opt.e;
        // console.log(e.clientX, this.lastPosX);
        this.viewportTransform[4] += e.clientX - this.lastPosX;
        this.viewportTransform[5] += e.clientY - this.lastPosY;
        this.canvas.renderAll();
        this.lastPosX = e.clientX;
        this.lastPosY = e.clientY;
      }
    },
    mouseUp(opt) {
      console.log(opt);
      this.isDragging = false;
      this.canvas.selection = true;
      this.canvas.forEachObject(obj => this.makeSelectable(obj));
    },
    makeSelectable(obj) {
      // this.canvas.selection = true;
      obj.selectable = true; // eslint-disable-line no-param-reassign
      obj.setCoords();
    },
  },
};
</script>

Панорамирование должно работать после масштабирования, но я как-то сломал его.

...