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模仿微信打飞机小游戏
Aug 20 Javascript
javascript数据结构之双链表插入排序实例详解
Nov 25 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
Jan 04 Javascript
纯JS焦点图特效实例(可一个页面多用)
Dec 07 Javascript
js实现无缝滚动图
Feb 22 Javascript
带你快速理解javascript中的事件模型
Aug 14 Javascript
在vue中通过axios异步使用echarts的方法
Jan 13 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
Aug 24 jQuery
微信小程序实现多选框全选与取消全选功能示例
May 14 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
Sep 24 Javascript
JavaScript常用工具函数库汇总
Sep 17 Javascript
js轮播图之旋转木马效果
Oct 13 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 实现多服务器共享 SESSION 数据
2009/08/15 PHP
关于PHP中Object对象的笔记分享
2011/06/28 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
5 cool javascript apps
2007/03/24 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
安装PyInstaller失败问题解决
2019/12/14 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
2020/04/07 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
python定义具名元组实例操作
2021/02/28 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
Nordgreen美国官网:在线购买极简主义斯堪的纳维亚手表
2019/07/24 全球购物
美国购物网站:Clickhere2shop
2021/01/28 全球购物
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
幼儿园教师培训制度
2014/01/16 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
酒店餐厅2014重阳节活动策划方案
2014/09/16 职场文书
滞留工资返还协议书
2014/10/19 职场文书
刑事和解协议书范本
2014/11/19 职场文书
2015年安全月活动总结
2015/03/26 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js
利用Java连接Hadoop进行编程
2022/06/28 Java/Android