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 相关文章推荐
js小技巧--自动隐藏红叉叉
Aug 13 Javascript
JavaScript 创建运动框架的实现代码
May 08 Javascript
js截取固定长度的中英文字符的简单实例
Nov 22 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
May 27 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
Sep 26 Javascript
jQuery Validate插件自定义验证规则的方法
Dec 27 Javascript
vue双向数据绑定原理探究(附demo)
Jan 17 Javascript
遍历json获得数据的几种方法小结
Jan 21 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
Feb 14 Javascript
vue-cli+webpack项目 修改项目名称的方法
Feb 28 Javascript
js防抖和节流的深入讲解
Dec 06 Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 Javascript
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
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
中止javascript执行的方法
2014/02/14 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
bootstrap table复杂操作代码
2016/11/01 Javascript
js实现密码强度检验
2017/01/15 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[03:37]2015国际邀请赛第四日现场精彩集锦
2015/08/08 DOTA
[45:06]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第二场 11.28
2020/12/02 DOTA
Python3中条件控制、循环与函数的简易教程
2017/11/21 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
opencv python如何实现图像二值化
2020/02/03 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
后勤人员岗位职责
2013/12/17 职场文书
关于逃课的检讨书
2014/01/23 职场文书
英语国培研修感言
2014/02/13 职场文书
眼镜促销方案
2014/03/15 职场文书
实习指导老师评语
2014/04/26 职场文书
反四风对照检查材料
2014/09/22 职场文书
先进事迹材料范文
2014/12/29 职场文书
高三英语教学计划
2015/01/23 职场文书
世界地球日活动总结
2015/02/09 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
2021/06/18 MySQL
Android中的Launch Mode详情
2022/06/05 Java/Android