canvas基础绘制-绚丽倒计时

喵嘻嘻 喵嘻嘻     2022-09-19     217

关键词:

效果图:

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ball</title>
    <script src="digit_1.js"></script>
    <script src="countdown.js"></script>
</head>
<body style="height: 100%;">
<canvas id="canvas" style="height: 100%"></canvas>
</body>
</html>

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

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

 

canvas基础绘制-倒计时(上)

 效果:html:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>digit</title></head><body><canvasid="canvas"></canvas><scrip 查看详情

canvas基础绘制-倒计时(下)

digit_1.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], 查看详情

炫丽的倒计时效果canvas绘图与动画基础(代码片段)

前言想要在自己做的网页中,加入canvas动画效果,但是发现模板各种调整不好,觉得还是要对canvas有所了解,才可以让自己的网页变得狂拽炫酷吊炸天!一、绘制基础1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8"&... 查看详情

自定义控件paint,canvas基础用法-path函数大全,canvas绘制基本几何图形(代码片段)

接触Android一段时间之后发现自定义控件是一个很好玩的东西,可以绘制出各种绚丽的UI,成就感十足呀,同时自定义控件也是应用开发必备技能,以前总想着写一些常用的控件可以提供给别人使用,后来发现&#... 查看详情

更新——canvas画布动画效果之实现倒计时

...anvas画布的基础部分,以及实现了一个由7*10点阵图显示的倒计时的基本架构。上次的效果如下图所示,仅仅只是一个时间的静态显示而已:今天呢,小W想实现就是,让它开始倒计时!效果先给大家看一下:Canvas画布用于图形的... 查看详情

炫丽的倒计时效果canvas绘图与动画基础

digit.js1digit=[2[3//04[0,0,1,1,1,0,0],5[0,1,1,0,1,1,0],6[1,1,0,0,0,1,1],7[1,1,0,0,0,1,1],8[1,1,0,0,0,1,1],9[1,1,0,0,0,1,1],10[1,1,0,0,0,1,1],11[1,1,0,0,0,1,1],12[0,1,1,0,1,1,0],13[0,0,1,1,1,0,0]14],1 查看详情

canvas基础绘制-arc

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>arc</title></head><body><canvasid="canvas"style="border:1pxsolid#ddd;"></canvas& 查看详情

canvas基础

绘制矩形的四种方式:1.手动绘制2.使用canvas提供的绘制矩形API,ctx.rect(x,y,width,height);ctx.stroke();参数分别表示,x轴坐标,y轴坐标,矩形宽度,矩形高度3.ctx.strokeRect(x,y,width,height);参数同上4.ctx.strokeRect(x,y,width,height);参数同上第3,4种方法只... 查看详情

android绘图基础--canvas和drawable

参考技术AGithub链接画2D图形有两种方法:Canvas实际上是封装了各种draw方法的类,调用draw方法把图形绘制到底层的Surface上,即绘制在Window上。这个例子中构造了两个Canvas和一个Bitmap,分别调用其draw方法,先是mCanvas往Bitmap里绘制... 查看详情

使用canvas实现超绚丽的旋转正方形

自己无意中的一个小“bug”,却让动画变得超绚丽==所以,不要害怕出bug,谁知道bug不会开出一朵绚丽的花呢?<!DOCTYPEhtml><htmllang="en"><head><metacharset="utf-8"><title></title><style>body{text-align:center;} 查看详情

canvas的基础学习(代码片段)

1、创建canvas<canvasid="canvas"></canvas>varcanvas=document.getElementById(‘canvas‘)varcontext=canvas.getContext(‘2d‘)使用context进行绘制2、线可以设置的状态:(1)context.lineWidth(2)context.strokeStyle(3)context.fillStyle(4)context.lineCap=butt|round|square(5)line... 查看详情

12canvas画布-基础

二、线条的绘制和填充在canvas中,各个图像绘制代码可以通过beginPath()和closePath()这两个函数进行包裹,主要用于分割各个画图,表示开始和结束。线条的绘制主要调用方法是moveTo(x,y)、lineTo(x,y)、stroke()、arc()、arcTo()、fill(),使... 查看详情

canvas画布基础知识

<canvas></canvas>标签用于绘制图像(通过脚本,通常是JavaScript)。<canvas>元素本身并没有绘制能力(它仅仅是图形的容器)-您必须使用脚本来完成实际的绘图任务。getContext()方法可返回一个对象,该对象提供了用于在... 查看详情

canvas绘画时钟及倒计时时钟

...谢谢哟!我是super喵二(程序媛),大家一起成长!!!倒计时时钟(先放效果图)(好吧我这里不是倒计时,是普通时钟,不过一会放上代码里不仅有倒计时也有时间,自行发现):大概思路:1、0-9的数字以及冒号绘制,定义... 查看详情

canvas图形绘制

前面的话  前面分别介绍了canvas的基础用法和进阶用法,本文将使用canvas的各种语法进行图形绘制 绘制线条【绘制线条】  下面来尝试绘制一段线条<canvasid="drawing"style="border:1pxsolidblack"><p>Thecanvaselementisnotsupported... 查看详情

canvas的基础使用。

目录:创建canvas。绘制直线、多边形和七巧板。绘制弧和圆。(有些图过于宽,被挤压了。可以去相册【canvas用到的图。】看原图。) 创建canvas。HTML5的新标签<canvas></canvas>在使用时会添加id,通过id来获取canvas元素... 查看详情

学习canvas基础-绘制矩形(代码片段)

学习Canvas基础-绘制矩形canvas提供了三个API,分别是:1.绘制矩形rect(起点X,起点Y,绘制的矩形width,绘制的矩形height)但该方法不会出实际效果,需要配合fill()和stroke()方法让其显现。2.绘制一个填充的... 查看详情

图形基础篇02#指令式绘图系统:如何用canvas绘制层次关系图?(代码片段)

说明【跟月影学可视化】学习笔记。如何用Canvas绘制几何图形?1.Canvas元素和2D上下文Canvas元素上的width和height属性不等同于Canvas元素的CSS样式的属性。这样分开能更方便地适配不同的显示设备。CSS属性中的宽高影响Canvas在页... 查看详情