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 相关文章推荐
尽可能写&quot;友好&quot;的&quot;Javascript&quot;代码
Jan 09 Javascript
dojo 之基础篇(三)之向服务器发送数据
Mar 24 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
jQuery滚动新闻实现代码
Jun 26 Javascript
AngularJS 简单应用实例
Jul 28 Javascript
Javascript发送AJAX请求实例代码
Aug 21 Javascript
vue制作加载更多功能的正确打开方式
Oct 12 Javascript
jQuery延迟执行的实现方法
Dec 21 Javascript
详解axios在node.js中的post使用
Apr 27 Javascript
JS尾递归的实现方法及代码优化技巧
Jan 19 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
Jun 15 Javascript
vue-drawer-layout实现手势滑出菜单栏
Nov 19 Vue.js
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与MySQL交互使用详解
2006/10/09 PHP
一步一步学习PHP(3) php 函数
2010/02/15 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
jQuery UI AutoComplete 自动完成使用小记
2010/08/21 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
部署Python的框架下的web app的详细教程
2015/04/30 Python
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
pandas中的series数据类型详解
2019/07/06 Python
Python操作Sonqube API获取检测结果并打印过程解析
2019/11/27 Python
django在开发中取消外键约束的实现
2020/05/20 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
技术人员面试提纲
2013/11/28 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
品牌推广策划方案
2014/05/28 职场文书
教师个人读书活动总结
2014/07/08 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
2014年政教处工作总结
2014/12/20 职场文书
党建工作汇报材料
2014/12/24 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
asyncio异步编程之Task对象详解
2022/03/13 Python