Canvas 图片制作动画

Canvas入门文档推荐

菜鸟教程
W3cschool

这个是 做的其中一个动画,只是html案例,后来做了十个添加到项目里面了,另外实现了暂停、继续、背景音乐同步播放/同步暂停、最后还将动画转成了视频并合成了音乐实现上传下载;
(rg:下面的是es5语法,再严格模式下不能使用,需要稍微改造下)

<!DOCTYPE html>
<html>

<head>

    <title>老程-Canvas-旋转过渡</title>
    <style type="text/css">
        .out-div {
            text-align: center;
            padding-top: 30px;
        }

        canvas {
            border: 1px solid black;
        }
    </style>
</head>

<body>
    <div class="out-div">
        <canvas id="player" width="400" height="400">Your browser does not support the HTML5 canvas tag.</canvas>
    </div>
    <script>
        //图片数组
        var imgList = ["https://img.alicdn.com/bao/uploaded/i2/813529278/O1CN01Civq0P2IPNCmhRuKS_!!0-item_pic.jpg",
            "https://img.alicdn.com/bao/uploaded/i2/813529278/O1CN01iCxNOs2IPNCn4jyLf_!!0-item_pic.jpg",
            "https://img.alicdn.com/bao/uploaded/i4/813529278/O1CN01WvBYgD2IPNCqyAEWE_!!0-item_pic.jpg",
            "https://img.alicdn.com/bao/uploaded/i4/813529278/O1CN019jRGzx2IPNCqPBmjA_!!0-item_pic.jpg"
        ];
        //特效分析,动画分两段
        // 1、前一张图片放大
        // 2、第二张图片旋转放大进场(逆时针)
        function rotate() {
            var canvas = document.getElementById('player');
            ctx = canvas.getContext('2d');
            var width = canvas.width,
                height = canvas.height;
            var moveY = 1;

            function animation(img1, img2, callback) { //外方法
                moveY = -moveY
                var enlarge = 1.0;
                (function () { //内方法

                    let h1 = img1.height
                    let w1 = img1.width
                    let h2 = img2.height
                    let w2 = img2.width

                    if (enlarge >= 1.1) { //第二部分动作:第二张图片进场 (从上往下/从下往上)
                        var rotate = 0;
                        var dot = {
                            x: 100,
                            y: 100
                        };
                        var elg = 0.5;
                        (function () {
                            if (rotate >= 360 -14.4) {
                                return callback(); //回调外方法
                            }
                            rotate += 3.6*4;
                            dot.x -= 4;
                            dot.y -= 4;
                            elg += 0.02;
                            ctx.clearRect(0, 0, width, height);
                            ctx.drawImage(img1, 0, 0, w1, h1, 0, 0, width, height);
                            ctx.save()
                            let dotTemp={
                                x:dot.x+width * elg/2,
                                y:dot.y+height * elg/2
                            }
                            ctx.translate(dotTemp.x, dotTemp.y);
                            ctx.rotate(rotate * Math.PI / 180);
                            ctx.translate(-dotTemp.x, -dotTemp.y);
                            ctx.drawImage(img2, 0, 0, w2, h2, dot.x, dot.y, width * elg, height * elg)
                            ctx.restore()
                            setTimeout(arguments.callee, 40); //回调内方法
                        })();

                    } else { //第一部分动作:前一张图片放大
                        ctx.save();
                        ctx.scale(enlarge, enlarge);
                        enlarge += 0.002
                        ctx.drawImage(img1, 0, 0, w1, h1, -width * (enlarge - 1) / 2, -height * (enlarge - 1) / 2,
                            width, height);
                        ctx.restore();
                        setTimeout(arguments.callee, 40); //回调内方法
                    }
                })();
            }
            var i = 0;
            (function () {
                animation(imgList[i], imgList[i += 1] || imgList[i = 0], arguments.callee);
            })();
        }


        //--------------------------------------------------------------------------------------------------------------------------------------------
        var imgLoaded = 0;
        var onload = function () { //加载网络图片
            imgLoaded++;
            if (imgLoaded == imgList.length) {
                rotate(); //全部加载完成调用动画
            };
        }
        for (var i = imgList.length; i--;) {
            var img = new Image(); // 创建一个<img>元素
            img.addEventListener('load', onload)
            img.src = imgList[i]; // 设置图片源地址
            imgList[i] = img; //加载完成后数组直接存图片对象
        }
    </script>
</body>

</html>

这个动画的效果如下
在这里插入图片描述
项目功能思路整理

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#老程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值