>炫酷的计时器效果Canvas绘图与动画<

>炫丽的计时器效果Canvas绘图与动画<

虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识。

现在,我要介绍的计时器是十分炫酷的,使用画布完成。

喜欢html5和喜欢炫酷特效的同学可以收藏一下。

-----------------------------------------华丽的分割线----------------------------------------------------

首先,介绍一下文件的效果。

看起来是非常的炫酷的。

-----------------------------------------下面是代码部分,代码注释得很清楚了,就不多废话了----------------------------------------------------

index.html ->

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>炫丽的计时器效果-Canvas绘图与动画-</title>
<script src="js/countdown.js"></script>
<script src="js/digit.js"></script>
</head>
<body style="height:100%;width:100%;">
<canvas id="canvas" style="height:100%;width:100%;"></canvas>
</body>
</html>

countdown.js ->

var window_width = 1440;/*页面的宽度*/
var window_height = 900;/*页面的高度*/
var radius = 8;/*小球的半径*/
var margin_top = 60;/*元素的上外边距*/
var margin_left = 30;/*元素的左外边距*/

var curShowTimeSeconds = 0;/*获取当天的秒数*/

var balls = [];/*小球的集合*/
const colors = ["#33b5e5","#0099cc","#aa66cc","#9933cc","#99cc00","#669900","#ffbb33","#ff8800","#ff4444","#cc0000"];/*颜色集合*/

window.onload = function(){
/*判断是否支持canvas,
 * 初始化页面*/
    window_width = document.body.clientWidth;
    window_height = document.body.clientHeight;


    margin_left = Math.round(window_width/10);
    radius = Math.round(window_width*4/5/108)-1;

    margin_top = Math.round(window_height/5);

    /*获取canvas对象*/
    var canvas = document.getElementById("canvas");    
    /*判断浏览器是否支持Canvas*/
    if(canvas.getContext("2d")){
        var context = canvas.getContext("2d");
        /*使用context绘制*/
    }else{
        alert("当前浏览器不支持Canvas,请更换浏览器后再试");
    }

    canvas.width = window_width;
    canvas.height = window_height;

    curShowTimeSeconds = getCurrentShowTimeSeconds();
    setInterval(function(){
        render(context);
        update();
    },50);
}

function getCurrentShowTimeSeconds(){
    /*获取当天的秒数*/
    var curTime = new Date();
    var ret = curTime.getHours()*3600 + curTime.getMinutes()*60 + curTime.getSeconds();

    return ret;
}

function update(){
/*负责数据的改变*/

    var nextShowTimeSeconds = getCurrentShowTimeSeconds();

    var nextHours = parseInt(nextShowTimeSeconds/3600);
    var nextMinutes = parseInt((nextShowTimeSeconds-nextHours*3600)/60);
    var nextSeconds = nextShowTimeSeconds%60;

    var curHours = parseInt(curShowTimeSeconds/3600);
    var curMinutes = parseInt((curShowTimeSeconds-curHours*3600)/60);
    var curSeconds = 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(nextSeconds%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 count = 0;
    for(var i=0;i<balls.length;i++){
        if(balls[i].x+radius>0 && balls[i].x - radius < window_width){
            balls[count++] = balls[i];
        }
    }
    while(balls.length>Math.min(300,count)){
        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,  //取-1或者1
                    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-hours*3600)/60);
    var seconds = curShowTimeSeconds%60;

    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();
            }
        }
    }
}

digit.js ->

/*绘图的坐标*/
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]
        ]/*:*/
    ];

 ------------------------------如果大家喜欢,请加关注,谢谢------------------------------------

 

posted @ 2016-07-13 10:54  时光之梦  阅读(1095)  评论(0编辑  收藏  举报