继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

HTML5开发之canvas实现元素图片镜像翻转动画效果的方法

FFIVE
关注TA
已关注
手记 435
粉丝 70
获赞 459

一、Canvas图片水平镜像翻转效果预览

  您可以狠狠的点击这里:canvas图片水平镜像翻转动画demo

  demo页面中点击图片动画效果可见。

  二、Canvas上实现图片镜像翻转的实现

  CSS中要想实现元素的翻转效果,比较简单,例如我们希望某一张图片水平镜像翻转,只需要一行CSS就可以了:

  img{

  transform:scaleX(-1);

  }

  或者:

  img{

  transform:scale(-1,1);

  }

  但是在canvas中,则要麻烦一些,麻烦的并不是无法翻转,而是坐标系的定位。

  在Canvas中,如下代码可以实现资源的水平镜像翻转(假设context是Canvas的2d上下文):

  context.scale(-1,1);

  或者使用setTransformAPI直接矩阵变换:

  context.setTransform(-1,0,0,1,0,0);

  然而,翻转虽然实现了,但是Canvas中元素定位就出了很大的问题。这是因为Canvas的坐标变换系和CSS不一样,因此,如果我们想实现居中翻转效果,需要在翻转之前将目标元素的中心点移动到变换轴上。

  拿水平翻转距离,在scale之前先translate位移变换后的水平偏移,然后就能看到一直居中翻转的效果了。

  语言苍白,拿图示意一下。

  canvas默认的变化坐标系是左上角。

  因此,如果水平scale为1,0.5,0,-0.5,-1时候的最终位置如下图示意:

webp

  于是可以得到应当偏移的水平距离公式:

  distance=(canvas.width–image.width*scale)/2;

  于是,最终镜像绘制图片的关键代码变成这样(假设水平缩放大小是scale):

  //坐标参考调整

  context.translate((canvas.width-image.width*scale)/2,0);

  context.scale(scale,1);

  context.drawImage(image,0,0);

  //坐标参考还原

  context.setTransform(1,0,0,1,0,0);

  如何增加动画效果呢?

  我们可以借助Tween.js,https://github.com/zhangxinxu/tween

  里面有各种缓动算法,借助方便调用的Math.animation()方法,就能轻松实现我们想要的效果啦!

  Math.animation(form,to,duration,easing,callback);

  动画JS如下:

  varcanvas=document.querySelector('canvas');

  varcontext=canvas.getContext('2d');

  //动画进行

  Math.animation(1,-1,600,'Quad.easeInOut',function(value,isEnding){

  //清除画布内容

  context.clearRect(0,0,canvas.width,canvas.height);

  //调整坐标

  context.translate((canvas.width-canvas.width*value)/2,0);

  //调整缩放

  context.scale(value,1);

  //绘制此时图片

  context.drawImage(eleImg,0,0);

  //坐标参考还原

  context.setTransform(1,0,0,1,0,0);

  });

  其实canvas这东西,玩的前端并不多,受众有限,不比流行技术。希望以后有小伙伴搜索到相关问题的时候可以提供帮助。



作者:扣丁学堂
链接:https://www.jianshu.com/p/998709334c4f


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP