HTML5 canvas绘制倒计时+环形进度条

需求:

1.页面在进入时后台会提供一个固定时间和固定百分比,例如:18小时16分30秒,25%
2.页面要求在进入时,有环形进度条从0推进到25%的效果,进度条旁的显示进度的黄色方块要始终保持跟随进度条最前方如图
3.环形进度条中间计时器,要从获取到 具体时间后开始倒计时

设计图:

JS代码如下:

//补零
function setDigit(num, n)
{
var str=‘‘+num;
if(str.length<n)
{
str=‘0‘+str;
}
return str;
}
//设定时间
function reDate(year, month, day, hour, minute, second){
var obj=new Date();
obj.setFullYear(parseInt(year));
obj.setMonth(parseInt(month)-1);
obj.setDate(parseInt(day));
obj.setHours(parseInt(hour));
obj.setMinutes(parseInt(minute));
obj.setSeconds(parseInt(second));
return obj.getTime();
}
//倒计时
function timeReduce(timesum,obj){
var iHour=setDigit(parseInt(timesum/3600),2);
timesum%=3600;

var iMin=setDigit(parseInt(timesum/60),2);
timesum%=60;

var iSec=setDigit(parseInt(timesum),2);

obj.innerHTML=iHour+‘:‘+iMin+‘:‘+iSec;
}
//百分比背景
function drawPerBack(context,centerX, centerY,iUsePi, width, height, radius, type,scale){
if(0<iUsePi && iUsePi<(Math.PI*0.5))
{
x=centerX+200*Math.cos(iUsePi)+22;
y=centerY+200*Math.sin(iUsePi)-5;
leftTri(context, x, y);
}else if((Math.PI/2)<iUsePi && iUsePi <Math.PI)
{
x=centerX+200*Math.cos(iUsePi)-105;
y=centerY+200*Math.sin(iUsePi)-28;
rightTri(context, x, y);
}else if(Math.PI<iUsePi && iUsePi<(Math.PI*1.5))
{
x=centerX+200*Math.cos(iUsePi)-98;
y=centerY+200*Math.sin(iUsePi)-35;
rightTri(context, x, y);
}
else{
x=centerX+200*Math.cos(iUsePi)+28;
y=centerY+200*Math.sin(iUsePi)-20;
leftTri(context, x, y);
}
context.save();
context.beginPath();
context.moveTo(x, y+radius);
context.lineTo(x, y+height-radius);
context.quadraticCurveTo(x, y+height, x+radius, y+height);
context.lineTo(x+width-radius, y+height);
context.quadraticCurveTo(x+width, y+height, x+width, y+height-radius);
context.lineTo(x+width, y+radius);
context.quadraticCurveTo(x+width, y, x+width-radius, y);
context.lineTo(x+radius, y);
context.quadraticCurveTo(x, y, x, y+radius);
context[type + ‘Style‘] = ‘#ffad2d‘ || params.color;
context.closePath();
context[type]();
context.font = "bold 23pt Arial";
context.fillStyle="#fff206";
context.fillText((scale*100).toFixed(0)+"%", x+12, y+33);
context.restore();
}
//灰色圈
function circle2(canvas,context,centerX,centerY,r){
context.clearRect(0, 0, canvas.width, canvas.height);
context.save();
context.lineWidth = 20;
context.strokeStyle = "#db5c39";
context.beginPath();
context.arc(centerX,centerY,r, 0, Math.PI*2, false);
context.stroke();
context.closePath();
context.restore();
}
//黄色弧线
function yellArc(context,centerX,centerY,r,iUsePi){
context.save();
context.strokeStyle = "#fff206";
context.lineWidth = 20;
context.lineCap="round";
context.beginPath();
context.arc(centerX, centerY,r, -Math.PI/2, iUsePi, false);
context.stroke();
context.closePath();
context.restore();
}
//左边三角
function leftTri(context, x, y) {
context.save();
context.beginPath();
context.moveTo(x+1,y+11);
context.lineTo(x+1,y+33);
context.lineTo(x-10,y+22);
context.fillStyle="#ffad2d";
context.closePath();
context.fill();
context.restore();
}
//右边三角
function rightTri(context, x, y) {
context.save();
context.beginPath();
context.moveTo(x+79,y+11);
context.lineTo(x+79,y+33);
context.lineTo(x+90,y+22);
context.fillStyle="#ffad2d";
context.closePath();
context.fill();
context.restore();
}

function JinDu1(timer,obj,r,timeTxt,inPer,iDateEnd,iDateStart,iRemain,rad){
var context = obj.getContext(‘2d‘),
centerX = obj.width/2,
centerY = obj.height/2;

var oDateNow=new Date();
var iRest=(iDateEnd-oDateNow.getTime())/1000;
var iUsed=(oDateNow.getTime()-iDateStart)/1000;
var scale=iUsed/iRemain;
if((inPer/100)<scale)
{
iUsePi=-Math.PI/2+rad*iRemain*inPer/100;
}else if((inPer/100)>scale)
{
inPer=100*scale;
clearInterval(timer);
return false;
}
//灰色圈 
circle2(obj,context,centerX,centerY,r); 
if(iRest<0)
{
return;

//倒计时
timeReduce(iRest,timeTxt);
//黄色圈
yellArc(context,centerX,centerY,r,iUsePi); 
//百分比
drawPerBack(context,centerX, centerY,iUsePi, 80, 44, 10, ‘fill‘, inPer/100); 
}

function JinDu2(obj,r,timeTxt,inPer,iDateEnd,iDateStart,iRemain,rad){
var context = obj.getContext(‘2d‘),
centerX = obj.width/2, 
centerY = obj.height/2; 
var oDateNow=new Date();
var iRest=(iDateEnd-oDateNow.getTime())/1000;
var iUsed=(oDateNow.getTime()-iDateStart)/1000;
var scale=iUsed/iRemain; 
if((inPer/100)<scale)
{
return false;
}else if((inPer/100)>scale)
{
inPer=100*scale;
var iUsePi=-Math.PI/2+rad*iUsed;
}
//灰色圈 
circle2(obj,context,centerX,centerY,r); 
if(iRest<0)
{
return;

//倒计时
timeReduce( iRest, timeTxt);
//黄色外圈
yellArc(context,centerX,centerY,r,iUsePi); 
//百分比
drawPerBack(context,centerX, centerY,iUsePi, 80, 44, 10, ‘fill‘, scale);
}

window.onload = function(){
var canvas = document.getElementById(‘canvas‘);
var oTime = document.getElementById(‘time‘);
var oPer = document.getElementById(‘perTxt‘);
var iDateEnd=reDate(2017,4,6,18,0,0);
var iDateStart=reDate(2017,4,2,18,15,10);
var iRemain=(iDateEnd-iDateStart)/1000;
var rad = Math.PI*2/iRemain;
var inPer=0;
var timer1=null;
var timer2=null;
timer1=setInterval(function(){
inPer += 0.2;
JinDu1(timer1,canvas,200,oTime,inPer,iDateEnd,iDateStart,iRemain,rad);
},10);
JinDu2(canvas,200,oTime,inPer,iDateEnd,iDateStart,iRemain,rad);
timer2=setInterval(function(){
JinDu2(canvas,200,oTime,inPer,iDateEnd,iDateStart,iRemain,rad);
},1000);
}

以上代码还需优化,如那里不对,还请广大码农指教!

时间: 2024-10-12 13:23:42

HTML5 canvas绘制倒计时+环形进度条的相关文章

应用Canvas实现圆环形进度条

调用方式如:timer("createCanvas",0,20,100);  表示使圆环(id为createCanvas)从0动态填充至20%,每隔0.1秒填充1%. 定时器函数 /*  * 执行定时任务  * id:画布id  * start:初始百分比  * end:结束百分比  * interval:时间间隔  */ function timer(id,start,end,interval){     window.setTimeout(function(){         c

HTML5 Canvas绘制环形进度条

最近比较迷恋canvas,加之做了一个个人网站,有用到环形进度条,记录下来. canvas中没有直接绘制圆的方法,但有一个绘制弧线的context.arc方法, 下面讲下用该方法如何绘制出图片效果. arc()方法介绍 context.arc(x,y,r,sAngle,eAngle,counterclockwise); 参数说明: x: 圆的中心的 x 坐标 y: 圆的中心的 y 坐标 r: 圆的半径 sAngle: 起始角,以弧度计.(弧的圆形的三点钟位置是 0 度) eAngle: 结束角,

用初中数学知识撸一个canvas环形进度条

周末好,今天给大家带来一款接地气的环形进度条组件vue-awesome-progress.近日被设计小姐姐要求实现这么一个环形进度条效果,大体由四部分组成,分别是底色圆环,进度弧,环内文字,进度圆点.设计稿截图如下: 我的第一反应还是找现成的组件,市面上很多组件都实现了前3点,独独没找到能画进度圆点的组件,不然稍加定制也能复用.既然没有现成的组件,只有自己用vue + canvas撸一个了. 效果图 先放个效果图,然后再说下具体实现过程,各位看官且听我慢慢道来. 安装与使用 源码地址,欢迎sta

仿MIUI音量变化环形进度条实现

Android中使用环形进度条的业务场景其实蛮多的,比如下载文件的时候使用环形进度条,会给用户眼前一亮的感觉:再比如我大爱的MIUI系统,它的音量进度条就是使用环形进度条,尽显小米"为发烧而生"的宗旨.今天就为大家揭开那些高大上设计背后的故事,让我们也来实现如此酷炫的效果. 其实环形进度条只是一个稍稍复杂点的自定义控件,看过前段时间<Android自定义控件>系列的同学,理解起来会更加容易.还没看过的同学,出门右转,查看历史消息,再回头看今天的内容,会更加容易上手. 一.定

页面效果:圆形进度条 环形进度条

环形进度条(1.5秒之内倒计时) 效果做的比较粗糙,就是css的 clip属性,先切右边一半,再切左边一半.根据三角函数计算y高度 http://www.w3school.com.cn/cssref/pr_pos_clip.asp css的clip属性 <script src="http://cdn.bootcss.com/jquery/1.12.1/jquery.min.js"></script> <script type="text/java

使用html5 canvas绘制圆形或弧线

注意:本文属于<html5 Canvas绘制图形入门详解>系列文章中的一部分.如果你是html5初学者,仅仅阅读本文,可能无法较深入的理解canvas,甚至无法顺畅地通读本文.请点击上述链接以了解使用html5 canvas绘制图形的完整内容. 在html5中,CanvasRenderingContext2D对象也提供了专门用于绘制圆形或弧线的方法,请参考以下属性和方法介绍: arc(x, y, radius, startRad, endRad, anticlockwise) 在canvas画

自定义环形进度条

自定义环形进度条 效果图: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 package com.qiao.circleprogress_forexample; import android.app.Activity; impo

html5 Canvas绘制图形入门详解

html5,这个应该就不需要多作介绍了,只要是开发人员应该都不会陌生.html5是「新兴」的网页技术标准,目前,除IE8及其以下版本的IE浏览器之外,几乎所有主流浏览器(FireFox.Chrome.Opera.Safari.IE9+)都已经开始支持html5了.除此之外,在移动浏览器市场上,众多的移动浏览器也纷纷展开关于「html5的支持能力以及性能表现」的军备竞赛.html作为革命性的网页技术标准,再加上众多浏览器厂商或组织的鼎力支持,可以想见,html5将会成为未来网页技术的领头羊. ht

利用jQuery和CSS实现环形进度条

html代码 1 <div class="circle" style="left:0"> 2 <div class="pie_left"><div class="left"></div></div> 3 <div class="pie_right"><div class="right"></div&