详解通过变换矩阵实现canvas的缩放功能


Posted in HTML / CSS onJanuary 14, 2019

这篇文章主要介绍一种通过设置canvas的变换矩阵来实现canvas的缩放。

第一步就是监听鼠标的滚轮事件,在滚轮事件中根据鼠标的滚动以及基于前一次的变换,重新设置context的缩放和平移,核心代码如下:

let delta = this.deltaInst;
 delta.bind('zoom', (data) => {
 delta._transform.scale.forEach((s, i) => {
   delta._transform.scale[i] *= data.delta > 0? 2 : 1/2;
 });
 let offsetX = data.x - delta._transform.translate[0];
 let offsetY = data.y - delta._transform.translate[1];
 delta._transform.translate[0] += -(data.delta > 0? 1 : -1/2)*offsetX;
 delta._transform.translate[1] -=  (data.delta > 0? 1 : -1/2)*offsetY;
 delta.refreshAll();
});

这里假设每次缩放都都放2倍,也可以是其他缩放比例。

第一步根据滚动的方向在当前缩放比的基础上乘以2或者除以2;

第二步计算平移,基本思路是计算基于新鼠标位置缩放canvas上的点到心位置时,对canvas平移到什么位置是可以达到相同的效果。

下面看一下refreshAll的代码:

let ctx = this.context;
   let matrix = this.getTransformMatrix();
   ctx.save();
   ctx.transform(...matrix);
   //ctx.translate(...this._transform.translate);
   //ctx.scale(...this._transform.scale);
   if (!Array.isArray(shapes)) {
     shapes = [shapes];
   }
   shapes.forEach( (shape) => {
     shape.render(ctx);
   });
   ctx.restore();

代码中首先获取到基于之前计算的缩放值scale和平移值translate,得到一个变化矩阵 ,然后将矩阵中对应的值传递给context的transform方法,对画布进行给定的变换,之后进行前一次缩放完全一致的绘图操作,就和已得到缩放后的效果了~~

在上面的代码中,ctx.transform() 也可以完全用ctx.translate()和ctx.scale()方法代替,如代码中的注释部分所示,参数即为前面计算得到的值。

完整代码可参考github地址: https://github.com/helloweilei/delta

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3支持IE6, 7, and 8的边框border属性
Dec 28 HTML / CSS
用CSS3来实现社交分享按钮
Nov 11 HTML / CSS
CSS3实现背景透明文字不透明的示例代码
Jun 25 HTML / CSS
html5 touch事件实现页面上下滑动效果【附代码】
Mar 10 HTML / CSS
HTML5的结构和语义(3):语义性的块级元素
Oct 17 HTML / CSS
html5 Canvas绘制线条 closePath()实例代码
May 10 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
Jan 29 HTML / CSS
字中字效果的实现【html5实例】
May 03 HTML / CSS
html5简介_动力节点Java学院整理
Jul 07 HTML / CSS
使用canvas一步步实现图片打码功能的方法
Jun 17 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
Aug 19 HTML / CSS
css实现文章分割线样式的多种方法总结
Apr 21 HTML / CSS
html Table 表头固定的实现
Jan 22 #HTML / CSS
Html5如何唤起百度地图App的方法
Jan 27 #HTML / CSS
canvas学习笔记之绘制简单路径
Jan 28 #HTML / CSS
web页面录屏实现
Feb 12 #HTML / CSS
Canvas 文本转粒子效果的实现代码
Feb 14 #HTML / CSS
canvas学习笔记之2d画布基础的实现
Feb 21 #HTML / CSS
使用HTML5原生对话框元素并轻松创建模态框组件
Mar 06 #HTML / CSS
You might like
php如何获取文件的扩展名
2015/10/28 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
vue监听scroll的坑的解决方法
2017/09/07 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
详解JavaScript原型与原型链
2020/11/16 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
Python实现PyPDF2处理PDF文件的方法示例
2019/09/25 Python
Python换行与不换行的输出实例
2020/02/19 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
python实现单机五子棋
2020/08/28 Python
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
校园招聘策划书
2014/01/09 职场文书
大学校园活动策划书
2014/02/04 职场文书
幼儿评语大全
2014/04/30 职场文书
政府信息公开实施方案
2014/05/09 职场文书
开会通知
2015/04/20 职场文书
报案材料怎么写
2015/05/25 职场文书
志愿者工作心得体会
2016/01/15 职场文书