微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

canvas基础绘制-绚丽倒计时的实例

效果图:

html:

rush:xhtml;"> <Meta charset="UTF-8"> ball

digit_1.js在之前的 canvas基础绘制-倒计时 中有贴

countdown.js:

var endTime = new Date();//const声明变量,不可修改,必须声明时赋值;
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 = document.body.clientHeight;

RADIUS = Math.round(WINDOW_WIDTH*4/5/108)-1;

MARGIN_TOP = Math.round(WINDOW_HEIGHT/5);
MARGIN_LEFT = Math.round(WINDOW_WIDTH/10);

var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");

canvas.width = WINDOW_WIDTH;
canvas.height = WINDOW_HEIGHT;

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

};

function getCurrentShowTimeSeconds() {
var curTime = new Date();//获取目前时间;
var ret = endTime.getTime()-curTime.getTime();
ret = Math.round(ret/1000);//获取秒数差值;
return ret>=0?ret:0;
}

rush:xhtml;"> 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),parseInt(curHours%10));
}

if(parseInt(curMinutes/10)!=parseInt(nextMinutes/10)){
addBalls(MARGIN_LEFT+39(RADIUS+1),parseInt(curMinutes/10));
}
if(parseInt(curMinutes%10)!=parseInt(nextMinutes%10)){
addBalls(MARGIN_LEFT+54
(RADIUS+1),parseInt(curMinutes%10));
}

if(parseInt(curSeconds/10)!=parseInt(nextSeconds/10)){
addBalls(MARGIN_LEFT+78(RADIUS+1),parseInt(curSeconds/10));
}
if(parseInt(curSeconds%10)!=parseInt(nextSeconds%10)){
addBalls(MARGIN_LEFT+93
(RADIUS+1),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){
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>Math.min(300,cnt)){
balls.pop();
}
}

rush:xhtml;"> 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,//pow(x,y),x 的 y 次幂;ceil()可对一个数进行上舍入;
vy: -5,color: colors[Math.floor(Math.random() colors.length)]//floor()对一个数进行下舍入
};
balls.push(aBall);
}
}
}
}
function render(cxt) {
//每一帧都要对动画进行刷新,不然就会新的旧的叠在一起;
cxt.clearRect(0,WINDOW_WIDTH,WINDOW_HEIGHT);//对一个矩形空间里的动画进行刷新;
//倒计时的时间绘制
var hours = parseInt(curShowTimeSeconds/3600);
var minutes = parseInt((curShowTimeSeconds-hours
3600)/60);
var seconds = curShowTimeSeconds%60;

renderDigit(MARGIN_LEFT,parseInt(hours/10),cxt);
renderDigit(MARGIN_LEFT+15(RADIUS+1),parseInt(hours%10),cxt);
renderDigit(MARGIN_LEFT+30
(RADIUS+1),10,cxt);
renderDigit(MARGIN_LEFT+39(RADIUS+1),parseInt(minutes/10),cxt);
renderDigit(MARGIN_LEFT+54
(RADIUS+1),parseInt(minutes%10),cxt);
renderDigit(MARGIN_LEFT+69(RADIUS+1),cxt);
renderDigit(MARGIN_LEFT+78
(RADIUS+1),parseInt(seconds/10),cxt);
renderDigit(MARGIN_LEFT+93*(RADIUS+1),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,2*Math.PI,true);
cxt.closePath();

cxt.fill();
}
}

function renderDigit(x,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),2 * Math.PI);
cxt.closePath();

cxt.fill();

}
}
}
}

以上这篇canvas基础绘制-绚丽倒计时的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐