头闻号

济南顺源化工有限公司

醌类|醇类|烃类|胺|净水絮凝剂|混凝土添加剂

首页 > 新闻中心 > 科技常识:详解通过变换矩阵实现canvas的缩放功能
科技常识:详解通过变换矩阵实现canvas的缩放功能
发布时间:2024-09-22 03:58:40        浏览次数:5        返回列表

今天小编跟大家讲解下有关详解通过变换矩阵实现canvas的缩放功能 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了有关详解通过变换矩阵实现canvas的缩放功能 的相关资料,希望小伙伴们看了有所帮助。

这篇文章主要介绍一种通过设置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

以上就是本文的全部内容 希望对大家的学习有所帮助 也希望大家多多支持爱蒂网。

来源:爱蒂网