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 相关文章推荐
PNG背景在不同浏览器下的应用
Jun 22 Javascript
javascript jscroll模拟html元素滚动条
Dec 18 Javascript
JavaScript中“基本类型”之争小结
Jan 03 Javascript
Javascript对象属性方法汇总
Nov 21 Javascript
简单选项卡 js和jquery制作方法分享
Feb 26 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
Mar 31 Javascript
js实现Select列表内容自动滚动效果代码
Aug 20 Javascript
js简单正则验证汉字英文及下划线的方法
Nov 28 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
jQuery+pjax简单示例汇总
Apr 21 jQuery
基于vue如何发布一个npm包的方法步骤
May 15 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 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 ftp文件上传函数(基础版)
2010/06/03 PHP
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
通过JS来判断页面控件是否获取焦点
2014/01/03 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
Js实现自定义右键行为
2015/03/26 Javascript
JS拖拽插件实现步骤
2015/08/03 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Python 正则表达式的高级用法
2016/12/04 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
Python telnet登陆功能实现代码
2020/04/16 Python
python全栈开发语法总结
2020/11/22 Python
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
EJB面试题
2015/07/28 面试题
工商企业管理应届生求职信
2013/11/03 职场文书
欢迎领导标语
2014/06/27 职场文书
个人买房协议书范本
2014/10/06 职场文书
2014年科协工作总结
2014/12/09 职场文书
北京英文导游词
2015/02/12 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
卖车协议书范文
2016/03/23 职场文书
python如何为list实现find方法
2022/05/30 Python