vue canvas绘制矩形并解决由clearRec带来的闪屏问题


Posted in Javascript onSeptember 02, 2019

起因:在cavnas绘制矩形时 鼠标移动一直在监测中,所以鼠标移动的轨迹会留下一个个的矩形框,

要想清除矩形框官方给出了ctx.clearRect() 但是这样是把整个画布给清空了,因此需要不断

向画布展示新的图片,这样就出现了不断闪屏的问题。

那么怎么解决呢?

microsoft提供了双缓冲图形技术,可以点击看看这边文章。

具体就是画图的时候做两个canvas层,一个临时层 一个显示层,鼠标的监听事件放在显示层处理,

每次清空的时候只清空临时层,这样就可以解决闪屏问题了。

部分代码如下:

<!--临时层-->
<canvas id="customPositionImg2" ref="table2"  style=" display:none;"></canvas>
<!--显示层 增加鼠标按下,移动,松开事件-->
<canvas id="customPositionImg" ref="table"  @mousedown="mousedown" @mousemove="mousemove" @mouseup="mouseup" style=""></canvas>

显示层展示图片:

//因为项目是dialog展示自定义画板,所以图片展示就写在了dialog打开的钩子里,如果需要直接复制
vue.nextTick里面的代码就行
show () {
   vue.nextTick(_ => {
     let customCanvas =this.$refs.table;// canvas显示层
     this.customstyle ='';
     customCanvas.height = 740;
     customCanvas.width = 1460;
     this.customcxt = customCanvas.getContext("2d");
     let img = new Image();
     img.src = this.imgSrc;
     let that = this;
     img.onload = function () {
       that.customRwidth = customCanvas.width / img.width; //原图与展示图片的宽高比
       that.customRheight = customCanvas.height / img.height;
       that.customcxt.drawImage(img, 0, 0, customCanvas.width, customCanvas.height); 
     };

   })

},

鼠标操作事件

//鼠标按下时执行
mousedown(e){
  this.isMouseDownInCanvas = true;
  // 鼠标按下时开始位置与结束位置相同 防止鼠标在画完矩形后 点击图画形成第二个图形
  this.endX = e.offsetX;
  this.endY = e.offsetY;
  this.startX = e.offsetX;
  this.startY = e.offsetY;

},
//鼠标移动式时执行
mousemove(e){
  if (this.isMouseDownInCanvas){ // 当鼠标有按下操作时执行
    console.log( e.offsetX,e.offsetY);
    if((this.endX != e.offsetX)||( this.endY != e.offsetY)){
      this.endX = e.offsetX;
      this.endY = e.offsetY;
      let wwidth = this.endX - this.startX;
      let wheigth = this.endY - this.startY;
      let tempCanvas = this.$refs.table2; // canvas临时层
      let tempCtx = tempCanvas.getContext('2d');
      tempCanvas.width = 1460; tempCanvas.height = 740; // 设置宽高
      // 清除临时层指定区域的所有像素
      tempCtx.clearRect(0, 0, 1460, 740);
      // 重新展示图片
      let img = new Image();
      img.src = this.imgSrc;
      let that = this;
      img.onload = function () {
        that.customcxt.drawImage(img, 0, 0,1460, 740);
      };
      this.customcxt.strokeStyle=" #00ff00"; //矩形框颜色
      this.customcxt.lineWidth="2"; //矩形框宽度
      this.customcxt.strokeRect(this.startX,this.startY,wwidth,wheigth); //绘制矩形
    }else{



//鼠标按下静止时显示矩形的大小。
      let wwidth2 = this.endX - this.startX;
      let wheigth2 = this.endY - this.startY;
      this.customcxt.strokeRect(this.startX,this.startY,wwidth2,wheigth2)
    }
  }
},
//鼠标松开时执行
mouseup(e){
  this.isMouseDownInCanvas = false;

// 绘制最终的矩形框
  let wwidth = this.endX - this.startX;
  let wheigth = this.endY - this.startY;
  this.customcxt.strokeRect(this.startX,this.startY,wwidth,wheigth)
},

总结

以上所述是小编给大家介绍的vue cavnas绘制矩形并解决由clearRec带来的闪屏问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript检测浏览器的缩放状态实现代码
Sep 28 Javascript
仅30行代码实现Javascript中的MVC
Feb 15 Javascript
Bootstrap项目实战之子栏目资讯内容
Apr 25 Javascript
使用jQuery处理AJAX请求的基础学习教程
May 10 Javascript
bootstrap模态框垂直居中效果
Dec 03 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
详解vue-cli开发环境跨域问题解决方案
Jun 06 Javascript
原生JS+Canvas实现五子棋游戏
May 28 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
Oct 21 Javascript
js实现购物车功能
Jun 12 Javascript
vue两个组件间值的传递或修改方式
Jul 04 Javascript
jquery+css实现Tab栏切换的代码实例
May 14 jQuery
layui数据表格跨行自动合并的例子
Sep 02 #Javascript
Vue form表单动态添加组件实战案例
Sep 02 #Javascript
小程序和web画三角形实现解析
Sep 02 #Javascript
vue-cli随机生成port源码的方法
Sep 02 #Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 #Javascript
layui 数据表格 点击分页按钮 监听事件的实例
Sep 02 #Javascript
js中比较两个对象是否相同的方法示例
Sep 02 #Javascript
You might like
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP安全技术之 实现php基本安全
2010/09/04 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
javascript 数组操作详解
2015/01/29 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
jQuery extend()详解及简单实例
2017/05/06 jQuery
vue实现a标签点击高亮方法
2018/03/17 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
Python re模块介绍
2014/11/30 Python
浅析Python基础-流程控制
2016/03/18 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
Django框架模板用法入门教程
2019/11/04 Python
python已协程方式处理任务实现过程
2019/12/27 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
python实现Thrift服务端的方法
2021/04/20 Python