Увеличьте / уменьшите холст в pdf-ридере, чтобы координаты мыши изменили свою позицию - PullRequest
0 голосов
/ 29 мая 2019

В настоящее время я реализую функцию размещения холста поверх pdf в pdf-reader, чтобы мы могли рисовать поверх холста, чтобы pdf, в котором размещен холст, можно было увеличивать и уменьшать в значительной степени, и яНеобходимо убедиться, что холст также должен изменить размер в соответствии с PDF, чтобы рисунок поверх него оставался нетронутым, для изменения размера холста я использую canvas.style.width , drawing.style.height чтобы изменить его размер при pdf-resizes.

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

enter image description here

Я использую RxJS для рисования и захвата событий, но я не могу понятьКак позаботиться о положении мыши в итоге, я хочу, чтобы координаты масштабировались в соответствии с изменением размера холста.

  private captureEvents(canvasEl: HTMLCanvasElement) {
    // this will capture all mousedown events from the canvas element
    this.drawingSubscription = fromEvent(canvasEl, 'mousedown')
      .pipe(
        switchMap((e) => {

          // after a mouse down, we'll record all mouse moves
          return fromEvent(canvasEl, 'mousemove')
            .pipe(
              // we'll stop (and unsubscribe) once the user releases the mouse
              // this will trigger a 'mouseup' event
              takeUntil(fromEvent(canvasEl, 'mouseup').do((event: WheelEvent) => {
                console.log('e', e.type, e);
                const prevPos = {
                  x: null,
                  y: null
                };
                this.coordinatesArray[this.file.current_slide - 1].push(prevPos);
                console.log('coordinatesArray', this.coordinatesArray);
              })),
              // we'll also stop (and unsubscribe) once the mouse leaves the canvas (mouseleave event)
              takeUntil(fromEvent(canvasEl, 'mouseleave')),
              // pairwise lets us get the previous value to draw a line from
              // the previous point to the current point
              pairwise()
            )
        })
      )
      .subscribe((res: [MouseEvent, MouseEvent]) => {
        const rect = canvasEl.getBoundingClientRect();
        // previous and current position with the offset
        const prevPos = {
          x: res[0].clientX - rect.left,
          y: res[0].clientY - rect.top
        };

        const currentPos = {
          x: res[1].clientX - rect.left,
          y: res[1].clientY - rect.top
        };

        this.coordinatesArray[this.file.current_slide - 1].push(prevPos);
        // console.log('coordinatesArray', this.coordinatesArray);
        this.drawOnCanvas(prevPos, currentPos);
      });
  } 

Более того, я не генерирую новый холст при каждом увеличении / уменьшении, я простомодифицирующийэто высота / ширина согласно размерам страницы, поверх которой она присутствует.

enter image description here

1 Ответ

0 голосов
/ 29 мая 2019

Я в конце концов решил это, потратив на это много времени. Я разместил ответ в соответствующей ветке, который будет полезен для других, сталкивающихся с подобной проблемой.

https://stackoverflow.com/a/56363476/5763627

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...