关键词:
效果图:
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在页... 查看详情