canvas绘制坐标点连线/动态改变宽度导致canvas渲染失败


现在需要根据坐标点绘制对应的连线,于是考虑采用canvas来完成对应的功能。

原图:

效果图:

一、有关canvas

是HTML5中重要的元素,和audio、video元素类似完全不需要任何外部插件就能够运行。Canvas中文翻译就是”画布”.它提供了强大的图形的处理功能(绘制,变换,像素处理…)。但是需要注意,canvas 元素本身并不绘制图形,它只是相当于一张空画布。如果开发者需要向 canvas 上绘制图形,则必须使用 JavaScript 脚本进行绘制。

菜鸟教程

Canvas 基础

二、绘制图案

<el-main style="background-color: #f8f8f9 ">
        <div class="align-center mb-10">
          <el-button type size="medium" @click="handleAdjustSize(0.75)">缩小1.5</el-button>
          <el-button type size="medium" @click="handleAdjustSize(0.5)">缩小2</el-button>
          <el-button type size="medium" @click="handleAdjustSize(1.5)">放大1.5</el-button>
          <el-button type size="medium" @click="handleAdjustSize(2)">放大2</el-button>
        </div>
        <img
          :src="src"
          :width="imageListData.imageWidth"
          :height="imageListData.imageHeight"
          class="absolute"
          alt
        />
        <canvas
          id="myCanvas"
          :width="imageListData.imageWidth"
          :height="imageListData.imageHeight"
          style="position:absolute"
        ></canvas>
      </el-main>

js代码:

//初始化
    initCanvas() {
      let canvas = document.getElementById('myCanvas')
      let ctx = canvas.getContext('2d')
      ctx.strokeStyle = 'red'
      let pointsLength = this.points.length
      ctx.moveTo(this.points[0][0], this.points[0][1]) //起点
      this.points.forEach(val => {
        ctx.lineTo(val[0], val[1])
      }) //根据坐标点连接成线
      let lastPointX = this.points[pointsLength - 1][0] //最后一个点的坐标x
      let lastPointY = this.points[pointsLength - 1][1] //最后一个点的坐标y
      ctx.lineTo(lastPointX + 50, lastPointY - 50)
      ctx.lineTo(lastPointX + 80, lastPointY - 50)
      ctx.stroke()

      //开始画圆
      ctx.fillStyle = 'red'
      ctx.beginPath()
      ctx.arc(
        lastPointX + 100,
        lastPointY - 50,
        20,
        -lastPointX - 100,
        2 * Math.PI
      )
      ctx.fill()
      ctx.closePath()
      ctx.fillStyle = '#fff'
      ctx.font = '14px Arial'
      ctx.fillText('零值', lastPointX + 85, lastPointY - 45)
    },

坐标点:

   points: [],
   newPoints: [
        [119, 261],
        [118, 262],
        [118, 272],
        [117, 273],
        [117, 276],
        [113, 280],
        [102, 280],
        ],//部分坐标
     imageListData: {
     imageHeight: 480,
     imageWidth: 640
      }, //图片的大小
     picSize: {
        maxSize: '', //放大的尺寸
        minSize: '' //缩小的尺寸
      } //图片的尺寸

三、放大缩小功能

调用方法:

 this.handleAdjustSize(1)
//调整结果的大小
    handleAdjustSize(size) {
      this.points = []
      //调整图片和帆布的大小
      this.imageListData.imageWidth *= size
      this.imageListData.imageHeight *= size
      //调整坐标点的大小
      this.newPoints.forEach(val => {
        val[0] *= size
        val[1] *= size
        this.points.push([val[0], val[1]])
      })
      
      setTimeout(() => {
        this.initCanvas();
      }, 100);//解决动态改变canvas宽度之后渲染元素,会导致渲染失败
    },

四、canvas清空画布的三种方式

1.由于canvas每当高度或宽度被重设时,画布内容就会被清空,因此可以通过重置画布的宽高来清空:

function clearCanvas()
{  
    var c=document.getElementById("myCanvas");  
    var cxt=c.getContext("2d");  
    c.height=c.height;  
} 

2.使用clearRect方法:

function clearCanvas()
{
	var c=document.getElementById("myCanvas");
	var cxt=c.getContext("2d");
	cxt.clearRect(0,0,c.width,c.height);
}

3.类似于方法2,可以用某一特定颜色填充画布,从而达到清空的目的:

function clearCanvas()
{
	var c=document.getElementById("myCanvas");
	var cxt=c.getContext("2d");
	
	cxt.fillStyle="#000000";
	cxt.beginPath();
	cxt.fillRect(0,0,c.width,c.height);
	cxt.closePath();
}

参考链接:html5清空画布方法

五、动态改变宽度导致canvas渲染失败

动态改变宽度的时候,就会清空画布,清空画布的时候,canvas重新渲染就会出现问题。
这里表现出来的问题就是需要再次点击查看图片,才会出现对应的放大缩小绘制出来的效果的功能。

解决方法:
动态改变canvas宽度之后渲染元素,会导致渲染失败。。。加个定时器就好了

setTimeout()

延时加载下。。我用的是100毫秒完全没问题

多写几个if判断也是没问题的

 setTimeout(() => {
        this.initCanvas();
      }, 100);//解决动态改变canvas宽度之后渲染元素,会导致渲染失败

参考链接:canvas动态改变宽度导致canvas渲染失败

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

echo忘川

谢谢老板们

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值