canvas 绘制多个方框【基于vue】

1.dom

 <canvas 
 	width="640" 
 	height="480" 
 	id="paint_canvas"
 	ref="paint_canvas"
 	@mousedown.left="leftMouseClick($event)"
 	@mousemove="mouseMovePaint($event)"
 	@mouseup="mouseUpPaint($event)"
 	></canvas>

2.methods

 /**
  * 监听鼠标按键 获取起始位置
  * @param e 元素
  */
  leftMouseClick(e) {
   this.beginPiant = true;
   if (e.offsetX || e.layerX) {
    let x = e.offsetX === undefined ? e.layerX : e.offsetX;
    let y = e.offsetY === undefined ? e.layerY : e.offsetY;
    this.startPaint = [x, y];
    }
  },
  /**
   * 监听鼠标移动 获取移动位置
   * @param e 元素
   */
  mouseMovePaint(e) {
      if (e.offsetX || e.layerX) {
          let x = e.offsetX === undefined ? e.layerX : e.offsetX;
          let y = e.offsetY === undefined ? e.layerY : e.offsetY;
          this.endPaint = [x, y];
      }
      if (this.beginPiant && this.paintReact) {
          this.paintCanvas(this.startPaint, this.endPaint);
      }
  },
 /**
   * 监听鼠标抬起 获取结束位置
   * @param e 元素
   */
  mouseUpPaint(e) {
      if (e.offsetX || e.layerX) {
          let x = e.offsetX === undefined ? e.layerX : e.offsetX;
          let y = e.offsetY === undefined ? e.layerY : e.offsetY;
          this.endPaint = [x, y];
      }

      this.paintArr.push({
          start_x: this.startPaint[0],
          start_y: this.startPaint[1],
          end_x: this.endPaint[0],
          end_y: this.endPaint[1],
      });
      this.beginPiant = false;
  },
   /**
   * 按下左键绘制矩形框
   */
  paintCanvas(startPoint, endpoint) {
      let cxt = this.$refs.paint_canvas;
      let c = cxt.getContext("2d");
      let w = endpoint[0] - startPoint[0];
      let h = endpoint[1] - startPoint[1];
      c.strokeStyle = "#9F0B18";
      c.lineWidth = 3;

      // 清除过程中上一阶段的矩形
      c.clearRect(0, 0, cxt.width, cxt.height);

      // 绘制已保存的矩形
      this.paintArr.forEach((val) => {
          c.strokeRect(val.start_x, val.start_y, val.end_x - val.start_x, val.end_y - val.start_y);
          c.beginPath();
          c.fillStyle="#9F0B18";
          c.arc(val.end_x, val.start_y, 12, 0, Math.PI * 2, false);//圆
          c.fill();
          c.stroke();
      });
      c.beginPath();
      c.strokeRect(startPoint[0], startPoint[1], w, h);
      c.arc(endpoint[0], startPoint[1], 12, 0, Math.PI * 2, false);//圆
      c.fillStyle="#9F0B18";
      c.fill();
      c.stroke();
      c.closePath();
  },

3.效果图(圆形是为了画按钮,还没画完)

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值