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应该怎样学
Apr 16 Javascript
Jquery升级新版本后选择器的语法问题
Jun 02 Javascript
javascript学习笔记(五)正则表达式
Apr 08 Javascript
js判断是否为ie的方法小结
Jan 13 Javascript
jQuery的one()方法用法实例
Jan 19 Javascript
bootstrap中使用google prettify让代码高亮的方法
Oct 21 Javascript
使用grunt合并压缩js和css文件的方法
Mar 02 Javascript
vue2.0实现前端星星评分功能组件实例代码
Feb 12 Javascript
ES6的异步终极解决方案分享
Jul 11 Javascript
原理深度解析Vue的响应式更新比React快
Apr 04 Javascript
js校验开始时间和结束时间
May 26 Javascript
javascript实现前端分页功能
Nov 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
php导入csv文件碰到乱码问题的解决方法
2014/02/10 PHP
CI(CodeIgniter)框架介绍
2014/06/09 PHP
js播放wav文件(源码)
2013/04/22 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
js 对小数加法精度处理示例说明
2013/12/27 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
js+css绘制颜色动态变化的圈中圈效果
2016/01/27 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
js设置文字颜色的方法示例
2016/12/30 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
基于webpack.config.js 参数详解
2018/03/20 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
老生常谈Python进阶之装饰器
2017/05/11 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
Python中的heapq模块源码详析
2019/01/08 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
Tahari ASL官方网站:高级设计师女装
2021/03/15 全球购物
自动化毕业生专业自荐书范文
2014/02/04 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
3的组成教学反思
2014/04/30 职场文书
认错检讨书
2014/10/02 职场文书
党员检讨书范文
2014/12/27 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers