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中URL编码函数代码
Jan 11 Javascript
JavaScript中的函数重载深入理解
Aug 04 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 Javascript
详解javascript高级定时器
Dec 31 Javascript
easyui datagrid 大数据加载效率慢,优化解决方法(推荐)
Nov 09 Javascript
Angular学习笔记之angular的$filter服务浅析
Nov 12 Javascript
使用async-validator编写Form组件的方法
Jan 10 Javascript
JS字符串去除连续或全部重复字符的实例
Mar 08 Javascript
jQuery超简单遮罩层实现方法示例
Sep 06 jQuery
javacript replace 正则取字符串中的值并替换【推荐】
Sep 13 Javascript
JavaScript指定断点操作实例教程
Sep 18 Javascript
原生JavaScript实现拖动校验功能
Sep 29 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版)
2006/10/09 PHP
如何在PHP中使用Oracle数据库(1)
2006/10/09 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
PHP递归算法的简单实例
2019/02/28 PHP
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python科学计算之NumPy入门教程
2017/01/15 Python
python中单下划线_的常见用法总结
2018/07/10 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
Python列表list排列组合操作示例
2018/12/18 Python
对python判断是否回文数的实例详解
2019/02/08 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
python绘制汉诺塔
2021/03/01 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
岗位竞聘演讲稿
2014/01/10 职场文书
兽医医药专业求职信
2014/07/27 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书