• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    在canvas上实现元素图片镜像翻转动画效果的方法

    一、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);

    或者使用 setTransform API直接矩阵变换:

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

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

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

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

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

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

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

    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如下:

    var canvas = document.querySelector('canvas');
    var context = 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这东西,玩的前端并不多,受众有限,不比流行技术。然,古语有云,不以善小而不为,希望以后有小伙伴搜索到相关问题的时候可以提供帮助。

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

    上一篇:HTML5 新表单类型示例代码
    下一篇:浅谈html5与APP混合开发遇到的问题总结
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    在canvas上实现元素图片镜像翻转动画效果的方法 在,canvas,上,实现,元素,图片,