canvas图形放大缩小鼠标拖拽

2 篇文章 0 订阅

canvas图形放大缩小鼠标拖拽

在网上找的都是放大缩小,或者鼠标拖拽,没有两者都满足的
一开始我天真的以为两个合并就可以了,但其实当鼠标松开和点击的时候,坐标原点是会变的,就是每次拖拽都是清除之前,放大缩小也是,所以那个原点很不好确定,
主要思路就是保存之前的原点坐标

过程比较麻烦,意会一下就好了,直接上代码

var that = this;

      var canvas = document.getElementById('myDiv')
      var ctx = canvas.getContext('2d')
      let obj = {
          fontX: 0,
          fontY: 0,
          fontZoom: 1,
          curZoom: 1,
          translateX: 0,
          translateY: 0,
          z:1,
          movex:0,
          movey:0,
          x:0,
          y:0,
          zoom(offsetX, offsetY, z) {
              console.log('zoom')
              ctx.clearRect(0,0,1300,640)
              ctx.save()
              ctx.translate(obj.x, obj.y)
              ctx.save()
              this.curZoom = this.fontZoom + obj.z
              console.log(this.curZoom,'缩放比例')
              this.translateX = offsetX - (offsetX - this.translateX) * this.curZoom / this.fontZoom  
              this.translateY = offsetY - (offsetY - this.translateY) * this.curZoom / this.fontZoom 
              ctx.translate(this.translateX, this.translateY)
              ctx.scale(this.curZoom, this.curZoom);
              that.toDraw()
              ctx.restore()
              ctx.restore()
              this.fontY = offsetY
              this.fontX = offsetX
              this.fontZoom =this.fontZoom + obj.z
          },
          mou(offsetX, offsetY){
          //   console.log('mou')
            ctx.clearRect(0,0,1300,640)
            ctx.save()
            console.log(offsetX, offsetY,this.translateX,this.translateY)
            ctx.translate(offsetX+this.translateX, offsetY+this.translateY)
            ctx.scale(this.curZoom, this.curZoom);
            that.toDraw()
            // if(isDrop){
            ctx.restore()
            // }
          }
      }
      console.log(document.getElementById('myDiv'))
      document.getElementById('myDiv').addEventListener('mousewheel', (e) => {
          obj.z = e.deltaY > 0 ? -0.1 : 0.1
          obj.zoom(e.offsetX, e.offsetY, obj.z)
      })
      var isDrop = false;
      document.getElementById('myDiv').onmousedown = function(e){
        isDrop = true
        var clientX = e.clientX
        var clientY = e.clientY
        document.getElementById('myDiv').onmousemove=function(e){
          if(isDrop){
            obj.movex = e.clientX -clientX + obj.x
            obj.movey = e.clientY -clientY + obj.y
            // console.log(e.clientX -clientX,obj.x)
            obj.mou(obj.movex,obj.movey)
          }
         
          document.getElementById('myDiv').onmouseup = function(){
            isDrop = false; 
            obj.x = obj.movex
            obj.y = obj.movey
            console.log('停止了')

          }
        }
      }

toDraw的函数自己写一个随便画个圆圈啥的都行,看卡效果就好,上面就是关键代码

panZoom这个插件也行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值