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类继承机制的原理分析
Sep 12 Javascript
javascript中callee与caller的用法和应用场景
Dec 08 Javascript
javascript实现的一个带下拉框功能的文本框
May 08 Javascript
jquery中one()方法的用法实例
Jan 16 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
Apr 27 Javascript
jQuery树插件zTree使用方法详解
May 02 jQuery
js实现登录与注册界面
Nov 01 Javascript
Vue cli+mui 区域滚动的实例代码
Jan 25 Javascript
在layui.use 中自定义 function 的正确方法
Sep 16 Javascript
原生js实现商品筛选功能
Oct 28 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
Nov 05 Javascript
详解JavaScript中Arguments对象用途
Aug 30 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开发者的10个技巧
2011/02/25 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
jquery div 居中技巧应用介绍
2012/11/24 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
Vue 使用中的小技巧
2018/04/26 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
tornado框架blog模块分析与使用
2013/11/21 Python
Python生成随机MAC地址
2015/03/10 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
Python中super的用法实例
2015/05/28 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Python迭代器iterator生成器generator使用解析
2019/10/24 Python
如何基于Python创建目录文件夹
2019/12/31 Python
python实现吃苹果小游戏
2020/03/21 Python
django项目中新增app的2种实现方法
2020/04/01 Python
Python之变量类型和if判断方式
2020/05/05 Python
使用HTML5捕捉音频与视频信息概述及实例
2018/08/22 HTML / CSS
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
北美Newegg打造的全球尖货海购平台:tt海购
2018/09/28 全球购物
会计电算化毕业生自荐信
2014/03/03 职场文书
党员创先争优承诺书
2014/03/26 职场文书
贷款委托书怎么写
2014/08/02 职场文书
研修心得体会
2014/09/04 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书