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 相关文章推荐
jquery+ajax验证不通过也提交表单问题处理
Dec 12 Javascript
jQuery+ajax实现动态执行脚本的方法
Jan 27 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
Aug 31 Javascript
无缝滚动的简单实现代码(推荐)
Jun 07 Javascript
bootstrap网格系统使用方法解析
Jan 13 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
Mar 10 Javascript
基于 Bootstrap Datetimepicker 联动
Aug 03 Javascript
vue根据进入的路由进行原路返回的方法
Sep 26 Javascript
对angular 监控数据模型变化的事件方法$watch详解
Oct 09 Javascript
如何解决js函数防抖、节流出现的问题
Jun 17 Javascript
vuex 动态注册方法 registerModule的实现
Jul 03 Javascript
JavaScript原生数组函数实例汇总
Oct 14 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下读取文本文件的代码
2008/07/02 PHP
php2html php生成静态页函数
2008/12/08 PHP
php中常用的预定义变量小结
2012/05/09 PHP
PHP常用开发函数解析之数组篇[未完结]
2012/07/30 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
JQuery中绑定事件(bind())和移除事件(unbind())
2015/02/27 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
深入探讨前端框架react
2015/12/09 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
详解如何运行vue项目
2019/04/15 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
python实现网页链接提取的方法分享
2014/02/25 Python
python实现ipsec开权限实例
2014/11/11 Python
Python中的生成器和yield详细介绍
2015/01/09 Python
Python实现读取并保存文件的类
2017/05/11 Python
python中的二维列表实例详解
2018/06/19 Python
python3 实现的对象与json相互转换操作示例
2019/08/17 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
财务会计专业毕业生自荐信
2013/10/19 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书