zoukankan      html  css  js  c++  java
  • canvas小案列-绚丽多彩的倒计时

    本次随笔中,我将实现一个绚丽的倒计时效果,这个效果主要是结合canvas和js实现的,具体代码如下

    index.html文件

    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body style="height:100%">
    <canvas id="canvas" style="height:100%">
    </canvas>
    
    <script src="digit.js"></script>
    <script src="countdown.js"></script>
    </body>
    </html>

    接着书写digit.js文件,这个文件中主要是一个三维数组,观察可以发现,总共有十个二维数组,分别对应1...9和:

    digit =
        [
            [
                [0,0,1,1,1,0,0],
                [0,1,1,0,1,1,0],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [0,1,1,0,1,1,0],
                [0,0,1,1,1,0,0]
            ],//0
            [
                [0,0,0,1,1,0,0],
                [0,1,1,1,1,0,0],
                [0,0,0,1,1,0,0],
                [0,0,0,1,1,0,0],
                [0,0,0,1,1,0,0],
                [0,0,0,1,1,0,0],
                [0,0,0,1,1,0,0],
                [0,0,0,1,1,0,0],
                [0,0,0,1,1,0,0],
                [1,1,1,1,1,1,1]
            ],//1
            [
                [0,1,1,1,1,1,0],
                [1,1,0,0,0,1,1],
                [0,0,0,0,0,1,1],
                [0,0,0,0,1,1,0],
                [0,0,0,1,1,0,0],
                [0,0,1,1,0,0,0],
                [0,1,1,0,0,0,0],
                [1,1,0,0,0,0,0],
                [1,1,0,0,0,1,1],
                [1,1,1,1,1,1,1]
            ],//2
            [
                [1,1,1,1,1,1,1],
                [0,0,0,0,0,1,1],
                [0,0,0,0,1,1,0],
                [0,0,0,1,1,0,0],
                [0,0,1,1,1,0,0],
                [0,0,0,0,1,1,0],
                [0,0,0,0,0,1,1],
                [0,0,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [0,1,1,1,1,1,0]
            ],//3
            [
                [0,0,0,0,1,1,0],
                [0,0,0,1,1,1,0],
                [0,0,1,1,1,1,0],
                [0,1,1,0,1,1,0],
                [1,1,0,0,1,1,0],
                [1,1,1,1,1,1,1],
                [0,0,0,0,1,1,0],
                [0,0,0,0,1,1,0],
                [0,0,0,0,1,1,0],
                [0,0,0,1,1,1,1]
            ],//4
            [
                [1,1,1,1,1,1,1],
                [1,1,0,0,0,0,0],
                [1,1,0,0,0,0,0],
                [1,1,1,1,1,1,0],
                [0,0,0,0,0,1,1],
                [0,0,0,0,0,1,1],
                [0,0,0,0,0,1,1],
                [0,0,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [0,1,1,1,1,1,0]
            ],//5
            [
                [0,0,0,0,1,1,0],
                [0,0,1,1,0,0,0],
                [0,1,1,0,0,0,0],
                [1,1,0,0,0,0,0],
                [1,1,0,1,1,1,0],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [0,1,1,1,1,1,0]
            ],//6
            [
                [1,1,1,1,1,1,1],
                [1,1,0,0,0,1,1],
                [0,0,0,0,1,1,0],
                [0,0,0,0,1,1,0],
                [0,0,0,1,1,0,0],
                [0,0,0,1,1,0,0],
                [0,0,1,1,0,0,0],
                [0,0,1,1,0,0,0],
                [0,0,1,1,0,0,0],
                [0,0,1,1,0,0,0]
            ],//7
            [
                [0,1,1,1,1,1,0],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [0,1,1,1,1,1,0],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [0,1,1,1,1,1,0]
            ],//8
            [
                [0,1,1,1,1,1,0],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [1,1,0,0,0,1,1],
                [0,1,1,1,0,1,1],
                [0,0,0,0,0,1,1],
                [0,0,0,0,0,1,1],
                [0,0,0,0,1,1,0],
                [0,0,0,1,1,0,0],
                [0,1,1,0,0,0,0]
            ],//9
            [
                [0,0,0,0],
                [0,0,0,0],
                [0,1,1,0],
                [0,1,1,0],
                [0,0,0,0],
                [0,0,0,0],
                [0,1,1,0],
                [0,1,1,0],
                [0,0,0,0],
                [0,0,0,0]
            ]//:
        ];

    最后实现整个效果的代码书写在countdown.js中

    var WINDOW_WIDTH=1024;
    var WINDOW_HEIGHT=768;
    var RADIUS=8;
    var MARGIN_TOP=60;
    var MARGIN_LEFT=30;
    var endTime=new Date();
    endTime.setTime(endTime.getTime()+3600*1000);
    
    var curShowTimeSeconds=0;
    var balls=[];
    const colors=["#33b5E5","#0099cc","#aa66cc","#9933cc","#99cc00","#669900","#FFBB33","#FF8800","#FF4444","#cc0000"];
    window.onload=function(){
        WINDOW_WIDTH=document.body.clientWidth;
        WINDOW_HEIGHT=768;
        
        MARGIN_LEFT=Math.round(WINDOW_WIDTH/10);
        RADIUS=Math.round(WINDOW_WIDTH*4/5/108)-1;
        MARGIN_TOP=Math.round(WINDOW_HEIGHT/5);
        var canvas=document.getElementById("canvas");
        var context=canvas.getContext("2d");
        canvas.width=WINDOW_WIDTH;;
        canvas.height=WINDOW_HEIGHT;
        
        curShowTimeSeconds=getCurrentShowTimeSeconds();
        setInterval(
          function(){
              render(context);
              update();
          },
          50
        
        
        );
        
    }
    function getCurrentShowTimeSeconds(){
        var curTime=new Date();
        var ret=endTime.getTime()-curTime.getTime();
        ret=Math.round(ret/1000);
        return ret>0? ret:0;
        
    }
    function update(){
        var nextShowTimeSeconds=getCurrentShowTimeSeconds();
        var nextHours=parseInt(nextShowTimeSeconds/3600);
        var nextMinutes=parseInt(nextShowTimeSeconds/60%60);
        var nextSeconds=parseInt(nextShowTimeSeconds%60);
        
        var curHours=parseInt(curShowTimeSeconds/3600);
        var curMinutes=parseInt(curShowTimeSeconds/60%60);
        var curSeconds=parseInt(curShowTimeSeconds%60);
        if(nextSeconds!=curSeconds){
            if(parseInt(curHours/10)!=parseInt(nextHours/10)){
                addBalls(MARGIN_LEFT+0,MARGIN_TOP,parseInt(curHours/10));
            }
            if(parseInt(curHours%10)!=parseInt(nextHours%10)){
                addBalls(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(curHours%10));
            }
            if(parseInt(curMinutes/10)!=parseInt(nextMinutes/10)){
                addBalls(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(curMinutes/10));
            }
            if(parseInt(curMinutes%10)!=parseInt(nextMinutes%10)){
                addBalls(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(curMinutes%10));
            }
            if(parseInt(curSeconds/10)!=parseInt(nextSeconds/10)){
                addBalls(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(curSeconds/10));
            }
            if(parseInt(curSeconds%10)!=parseInt(nextSeconds%10)){
                addBalls(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(curSeconds%10));
            }
            curShowTimeSeconds=nextShowTimeSeconds;
        }
        updateBalls();
    }
    function updateBalls(){
        for(var i=0;i<balls.length;i++){
        balls[i].x+=balls[i].vx;
        balls[i].y+=balls[i].vy;
        balls[i].vy+=balls[i].g;
        if(balls[i].y>=WINDOW_HEIGHT-RADIUS){
            balls[i].y=WINDOW_HEIGHT-RADIUS;
            balls[i].vy=-balls[i].vy*0.75;
        }
    }
    var cnt=0;
    for(var i=0;i<balls.length;i++)
        if(balls[i].x+RADIUS>0&&balls[i].x-RADIUS<WINDOW_WIDTH)
            balls[cnt++]=balls[i];
        while(balls.length>cnt){
            balls.pop();
        }
    
    }
    function addBalls(x,y,num){
        for(var i=0;i<digit[num].length;i++)
            for(var j=0;j<digit[num][i].length;j++)
                if(digit[num][i][j]==1){
                    var aBall={
                        x:x+j*2*(RADIUS+1)+(RADIUS+1),
                        y:y+i*2*(RADIUS+1)+(RADIUS+1),
                        g:1.5+Math.random(),
                        vx:Math.pow(-1,Math.ceil(Math.random()*1000))*4,
                        vy:-5,
                        color:colors[Math.floor(Math.random()*colors.length)]
                    }
                    balls.push(aBall);
                }    
    }
    function render(cxt){
        cxt.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT);
        var hours=parseInt(curShowTimeSeconds/3600);
        var minutes=parseInt(curShowTimeSeconds/60%60);
        var seconds=parseInt(curShowTimeSeconds%60);
        //var hours=12;
        //var minutes=34;
        // var seconds=56;
        renderDigit(MARGIN_LEFT,MARGIN_TOP,parseInt(hours/10),cxt);
        renderDigit(MARGIN_LEFT+15*(RADIUS+1),MARGIN_TOP,parseInt(hours%10),cxt);
        renderDigit(MARGIN_LEFT+30*(RADIUS+1),MARGIN_TOP,10,cxt);
        renderDigit(MARGIN_LEFT+39*(RADIUS+1),MARGIN_TOP,parseInt(minutes/10),cxt);
        renderDigit(MARGIN_LEFT+54*(RADIUS+1),MARGIN_TOP,parseInt(minutes%10),cxt);
        renderDigit(MARGIN_LEFT+69*(RADIUS+1),MARGIN_TOP,10,cxt);
        renderDigit(MARGIN_LEFT+78*(RADIUS+1),MARGIN_TOP,parseInt(seconds/10),cxt);
        renderDigit(MARGIN_LEFT+93*(RADIUS+1),MARGIN_TOP,parseInt(seconds%10),cxt);
        for(var i=0;i<balls.length;i++){
            cxt.fillStyle=balls[i].color;
            cxt.beginPath();
            cxt.arc(balls[i].x,balls[i].y,RADIUS,0,2*Math.PI,true);
            cxt.closePath();
            cxt.fill();
        }
    }
    function renderDigit(x,y,num,cxt){
    cxt.fillStyle = "rgb(0,102,153)";
    
        for( var i = 0 ; i < digit[num].length ; i ++ )
            for(var j = 0 ; j < digit[num][i].length ; j ++ )
                if( digit[num][i][j] == 1 ){
                    cxt.beginPath();
                    cxt.arc( x+j*2*(RADIUS+1)+(RADIUS+1) , y+i*2*(RADIUS+1)+(RADIUS+1) , RADIUS , 0 , 2*Math.PI )
                    cxt.closePath()
                    cxt.fill()
                }
    }

    大家赶快来试验一下吧!

  • 相关阅读:
    Leetcode No.108 Convert Sorted Array to Binary Search Tree(c++实现)
    Leetcode No.88 Merge Sorted Array(c++实现)
    Leetcode No.66 Plus One(c++实现)
    pandas数据排序(series排序 & DataFrame排序)
    pandas的settingwithWaring报警
    pandas对缺失值的处理
    pandas的数据统计函数
    pandas 新增数据列(直接赋值、apply,assign、分条件赋值)
    pandas数据查询(数值、列表、区间、条件、函数)
    pandas数据读取(DataFrame & Series)
  • 原文地址:https://www.cnblogs.com/yuaima/p/5038137.html
Copyright © 2011-2022 走看看