重拾Canvas动画(未完成)

学习前端到现在已经接触了四种动画的形式,他们分别是:
1.CSS3
2.JS
3.SVG
4.Canvas

CSS3:功能强大,使用Animation、Transition、Transform可以完成许多变换动画,其中的Preserve-3d也能制作3D动画

JS:主要通过抓取元素进行定时的移位操作来完成动画

SVG:最擅长制作线条动画,比如用CSS3你很难完成一个画一个圆圈的动画,而使用SVG的Stroke-dashoffset、Stroke-dasharray、Stroke-opacity并结合CSS3可以快速的完成线条动画,画圆Loading动画变得很简单

Canvas:是Html5的新增元素,Canvas作为一个容器,承载区域内的像素,使用 JS 可以对其进行像素操作,Canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。

下面就开始Canvas的学习

实例:简单的随机粒子动画

将会用到:
1.面向对象的思想
2.JS内置Math对象
3.碰撞判断
4.RequestAnimationFrame回调函数

window.onload=function(){
    var cv = document.getElementById('canvas');
    var ct = cv.getContext('2d');
    var cArray = new Array();
    var cx = null;
    var cy = null;
    var cr = null;
    var rgba = null;
    var xs = null;//x-axis speed
    var ys = null;//y-axis speed
    var od = 0.004 //opacity descent
    var obj = null;
    setInterval(function(){
        //生成小球超过100个,清空前50个
        if(cArray.length>=100){
            var newArray = cArray.slice(50,100);
            cArray = null;
            cArray = newArray;
        }
        //随机生成小球的参数
        cx = 250+Math.floor(-50+Math.random()*101);
        cy = 250+Math.floor(-50+Math.random()*101);
        cr = 5+Math.floor(-2+Math.random()*11);
        rgba = "rgba("+Math.floor(Math.random()*256)
        +","+Math.floor(Math.random()*256)
        +","+Math.floor(Math.random()*256);
        xs = -2+Math.random()*4;
        ys = -2+Math.random()*4;
        if(xs!=0||ys!=0){
            obj = {
                "x": cx,
                "y": cy,
                "r": cr,
                "rgba":rgba,
                "xs":xs,
                "ys":ys,
                "op":1//opacity
            }
            cArray.push(obj);   
        }
    },100)
    function draw(obj){
        //画圆涂色
        ct.beginPath();
        ct.fillStyle=obj.rgba+","+obj.op+")";
        ct.arc(obj.x,obj.y,obj.r,0,2*Math.PI);
        ct.fill();
        ct.closePath();
    }
    function modify(obj){
        //触碰边界设置速度为反方向
        if((obj.x+obj.r>=cv.width)||(obj.x-obj.r<=0)){
            obj.xs *= -1;
        }
        if((obj.y+obj.r>=cv.height)||(obj.y-obj.r<=0)){
            obj.ys *= -1;
        }
        obj.x+=obj.xs;
        obj.y+=obj.ys;
        //不透明度递减
        obj.op-=od;
    }
    function animation(){
        ct.clearRect(0,0,cv.width,cv.height);
        for(var i=0;i<cArray.length;i++){
            modify(cArray[i]);
            draw(cArray[i]);
        }
        window.requestAnimationFrame(animation);
    }
    window.requestAnimationFrame(animation);
}

实例2:动态绘制饼状图

var cv = document.getElementById("canvas");
    var ct = cv.getContext("2d");
    var cw = cv.width;
    var ch = cv.height;
    var setArr = [
        {
            scale:0.2,
            color:"red"
        },
        {
            scale:0.1,
            color:"green"
        },
        {
            scale:0.3,
            color:"yellow"
        },
        {
            scale:0.15,
            color:"purple"
        },
        {
            scale:0.25,
            color:"orange"
        }
    ]
    function draw(startRadian,endRadian,color){
        ct.beginPath();
        ct.moveTo(cw/2,ch/2);
        ct.lineTo(cw/2+150*Math.cos(startRadian),ch/2+150*Math.sin(startRadian));
        ct.arc(cw/2,ch/2,150,startRadian,endRadian);
        ct.lineTo(cw/2,ch/2);
        ct.fillStyle=color;
        ct.fill();
        ct.closePath();
        ct.beginPath();
        ct.arc(cw/2,ch/2,100,0,2*Math.PI);
        ct.lineTo(cw/2,ch/2);
        ct.fillStyle="white";
        ct.fill();
        ct.closePath();
    }
//  draw(0,30/180*Math.PI,"red");
    var speed = 2/180*Math.PI;
    var color = null;
    var section = new Array();
    var sum_scale = 0;
    var sum_radian = 0;
    for(var i=0;i<setArr.length;i++){
        sum_scale += setArr[i].scale*2*Math.PI;
        var obj ={
            sumScale : sum_scale,
            color : setArr[i].color
        }
        section.push(obj);
    }
    var startRadian = 0;
    var endRadian = 0;
    var stop = null;
    function animation(){
        console.log(stop)
        endRadian += speed;
        if(endRadian>=2*Math.PI){
            window.cancelAnimationFrame(stop);
            console.log("stop")
        }
        for(var i = 0;i<section.length;i++){
            if(endRadian<=section[i].sumScale){
                color = section[i].color;
                draw(startRadian,endRadian,color);
                break;
            }
        }
//      draw(startRadian,endRadian,"red");
        startRadian = endRadian - 0.01;
        stop = window.requestAnimationFrame(animation);
    }
    stop = window.requestAnimationFrame(animation);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,548评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,497评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,990评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,618评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,618评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,246评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,819评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,725评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,268评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,356评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,488评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,181评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,862评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,331评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,445评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,897评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,500评论 2 359

推荐阅读更多精彩内容