分享一下使用knova插件进行缩放和拖拽遇到的问题及解决方案

最近使用了一个新的ai标注工具,遇到了一些问题分享给大家

问题

在项目中在对图形进行缩放或者拖拽后再进行绘制矩形时发现鼠标点击的位置和实际出现在图形中的位置不一致,废话不多说。先上代码

drawRectangle() {
      this.temporary = +new Date() + ''
      const Rect = new Konva.Rect()
      console.log(this.stage)
      let initPosition = null
      const onMousedown = ({ evt }) => {
        if (!Rect || evt.ctrlKey || evt.metaKey || evt.button !== 0) return
        initPosition = {
          x: evt.offsetX - this.attrs.x * this.attrs.scaleX,
          y: evt.offsetY - this.attrs.y * this.attrs.scaleY
        }
        Rect.setAttrs({ ...initPosition, stroke: 'gray', id: this.temporary, name: 'Rect' })
        this.layerRect.add(Rect)
        this.stage.on('mousemove', onMouseMove)
        window.addEventListener('mouseup', onMouseUp)
      }
      const onMouseMove = ({ evt }) => {
        if (!Rect || !initPosition) return
        let x = initPosition.x
        let y = initPosition.y
        const RelativePointerPosition = this.stage.getRelativePointerPosition()
        const width = Math.abs(initPosition.x - RelativePointerPosition.x)
        const height = Math.abs(initPosition.y - RelativePointerPosition.y)
        if (RelativePointerPosition.x < x) {
          x = RelativePointerPosition.x
        }
        if (RelativePointerPosition.y < y) {
          y = RelativePointerPosition.y
        }
        const width = Math.abs(initPosition.x - evt.offsetX)
        const height = Math.abs(initPosition.y - evt.offsetY)
        if (evt.offsetX < x) {
           x = evt.offsetX
        }
        if (evt.offsetY < y) {
          y = evt.offsetY
        }
        Rect.setAttrs({
          width,
          x,
          y,
          height
        })
      }
      const onMouseUp = () => {
        // Remove event listener
        this.stage?.off('mousemove', onMouseMove)
        window.removeEventListener('mouseup', onMouseUp)
        this.stage.off('mousedown', onMousedown)
        window.removeEventListener('mouseup', onMouseUp)
        if (!Rect) return
        const labelWidth = Rect.getSize().width
        const labelHeight = Rect.getSize().height
        const newShape = {
          type: 'rect',
          x: Rect.getPosition().x,
          y: Rect.getPosition().y,
          id: this.temporary,
          width: labelWidth,
          height: labelHeight
        }
        Rect.setAttrs(newShape)
        this.currentOperationStatus = '0'
        this.isAddRectDialog = true
      }
      this.stage.on('mousedown', onMousedown)
      this.stage.on('mousemove', onMouseMove)
    }

这是原来的代码,下面是改进后的代码

drawRectangle() {
      this.temporary = +new Date() + ''
      const Rect = new Konva.Rect()
      console.log(this.stage)
      let initPosition = null
      const onMousedown = ({ evt }) => {
        if (!Rect || evt.ctrlKey || evt.metaKey || evt.button !== 0) return
        const RelativePointerPosition = this.stage.getRelativePointerPosition()
        initPosition = {
          x: RelativePointerPosition.x,
          y: RelativePointerPosition.y
        }
        Rect.setAttrs({ ...initPosition, stroke: 'gray', id: this.temporary, name: 'Rect' })
        this.layerRect.add(Rect)
        this.stage.on('mousemove', onMouseMove)
        window.addEventListener('mouseup', onMouseUp)
      }
      const onMouseMove = ({ evt }) => {
        if (!Rect || !initPosition) return
        let x = initPosition.x
        let y = initPosition.y
        const RelativePointerPosition = this.stage.getRelativePointerPosition()
        console.log('鼠标位置变化了', RelativePointerPosition)
        const width = Math.abs(initPosition.x - RelativePointerPosition.x)
        const height = Math.abs(initPosition.y - RelativePointerPosition.y)
        if (RelativePointerPosition.x < x) {
          x = RelativePointerPosition.x
        }
        if (RelativePointerPosition.y < y) {
          y = RelativePointerPosition.y
        }
        Rect.setAttrs({
          width,
          x,
          y,
          height
        })
      }
      const onMouseUp = () => {
        // Remove event listener
        this.stage?.off('mousemove', onMouseMove)
        window.removeEventListener('mouseup', onMouseUp)
        this.stage.off('mousedown', onMousedown)
        window.removeEventListener('mouseup', onMouseUp)
        if (!Rect) return
        const labelWidth = Rect.getSize().width
        const labelHeight = Rect.getSize().height
        const newShape = {
          type: 'rect',
          x: Rect.getPosition().x,
          y: Rect.getPosition().y,
          id: this.temporary,
          width: labelWidth,
          height: labelHeight
        }
        Rect.setAttrs(newShape)
        this.currentOperationStatus = '0'
        this.isAddRectDialog = true
      }
      this.stage.on('mousedown', onMousedown)
      this.stage.on('mousemove', onMouseMove)
    }

这里面主要用到了 getRelativePointerPosition() 这个函数,它是用来获取鼠标再这个舞台中的相对位置的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值