圆进度条

<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>circleProgress using Canvas</title>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<style>
tr.label {
font-weight: bold;
text-align: center;
}

tr.circle {
text-align: center;
}

tr.code {
vertical-align: top;
}
</style>
<script type="text/javascript">
(function (window) {
var requestAnimationFrame = (function () {
return window.requestAnimationFrame ||
function (cb) {
return window.setTimeout(cb, 1000 / 60);
};
})();

var cancelAnimationFrame = (function () {
return window.cancelAnimationFrame ||
window.clearTimeout;
})();

var circleProgress = function (options) {
if (options.progress !== 0) {
options.progress = options.progress || 100;
}
if (options.duration !== 0) {
options.duration = options.duration || 1000;
}
options.fps = 60; // requestAnimationFrame / cancelAnimationFrame
options.color = options.color || ‘rgb(52, 145, 204)‘;
options.bgColor = options.bgColor || ‘rgb(230, 230, 230)‘;
options.textColor = options.textColor || ‘black‘;
options.progressWidth = options.progressWidth || 0.25; //r
options.fontScale = options.fontScale || 0.4; //r

options.toFixed = options.toFixed || 0;
var canvas = document.getElementById(options.id);
if (canvas == null || canvas.getContext == null) {
return;
}
options.width = canvas.width;
options.height = canvas.height;
options.context = canvas.getContext(‘2d‘);

var step = function () {
if (options.current < options.progress && options.duration > 0) {
drawCircleProgress(options);
options.current += options.progress * (1000 / options.fps) / options.duration;
canvas.setAttribute(‘data-requestID‘, requestAnimationFrame(step));
} else {
options.current = options.progress;
drawCircleProgress(options);
canvas.removeAttribute(‘data-requestID‘);
}
};

cancelAnimationFrame(canvas.getAttribute(‘data-requestID‘));
options.current = 0;
step();
};

var drawCircleProgress = function (options) {
var ctx = options.context;
var width = options.width;
var height = options.height;
var current = options.current;
var color = options.color;
var bgColor = options.bgColor;
var textColor = options.textColor;
var progressWidth = options.progressWidth;
var fontScale = options.fontScale;

var x = width / 2;
var y = height / 2;
var r1 = Math.floor(Math.min(width, height) / 2);
var r2 = Math.floor(r1 * (1 - progressWidth));
var startAngle = -Math.PI / 2;
var endAngle = startAngle + Math.PI * 2 * current / 100;
var fontSize = Math.floor(r1 * fontScale);

ctx.save();
ctx.clearRect(0, 0, width, height);

ctx.beginPath();
if (current > 0) {
ctx.arc(x, y, r1, startAngle, endAngle, true);
ctx.arc(x, y, r2, endAngle, startAngle, false);
} else {
ctx.arc(x, y, r1, 0, Math.PI * 2, true);
ctx.arc(x, y, r2, Math.PI * 2, 0, false);
}
ctx.closePath();
ctx.fillStyle = bgColor;
ctx.fill();

ctx.beginPath();
ctx.arc(x, y, r1, startAngle, endAngle, false);
ctx.arc(x, y, r2, endAngle, startAngle, true);
ctx.closePath();
ctx.fillStyle = color;
ctx.fill();

ctx.fillStyle = textColor;
ctx.font = ‘‘ + fontSize + ‘px arial‘;
ctx.textBaseline = ‘middle‘;
ctx.textAlign = ‘center‘;
ctx.fillText(‘‘ + current.toFixed(options.toFixed) + ‘%‘, x, y);
ctx.restore();
};

window.circleProgress = circleProgress;

})(this);

</script>
</head>
<body>
<a href="#" onclick="showMe();">Show me!</a>
<table>
<tr class="label">
<td>1. Default options</td>
<td>2. Custom options</td>
</tr>
<tr class="circle">
<td>
<canvas id="circle-progress-default" width="200" height="200"></canvas>
</td>
<td>
<canvas id="circle-progress-custom" width="200" height="200"></canvas>
</td>
</tr>
<tr class="code">
<td>
<pre>
circleProgress({
id: ‘circle-progress-default‘
});
</pre>
</td>
<td>
<pre>
circleProgress({
id: ‘circle-progress-custom‘,
progress: 70, // default: 100
duration: 2000, // default: 1000
color: ‘red‘, // default: ‘rgb(52, 145, 204)‘
bgColor: ‘green‘, // default: ‘rgb(230, 230, 230)‘
textColor: ‘blue‘, // default: ‘black‘
progressWidth: 0.15, // default: 0.25 (r)
fontScale: 0.5, // default: 0.4 (r)
toFixed: 1 // default: 0
});
</pre>
</td>
</tr>
<tr class="label">
<td>3. Zero progress</td>
<td>4. No animation</td>
</tr>
<tr class="circle">
<td>
<canvas id="circle-progress-zero" width="200" height="200"></canvas>
</td>
<td>
<canvas id="circle-progress-no-animation" width="200" height="200"></canvas>
</td>
</tr>
<tr class="code">
<td>
<pre>
circleProgress({
id: ‘circle-progress-zero‘,
progress: 0 // default: 100
});
</pre>
</td>
<td>
<pre>
circleProgress({
id: ‘circle-progress-no-animation‘,
duration: 0 // default: 1000
});
</pre>
</td>
</tr>
</table>
<script type="text/javascript">
var showMe = function () {
circleProgress({
id: ‘circle-progress-default‘
});
circleProgress({
id: ‘circle-progress-custom‘,
progress: 70, // default: 100
duration: 2000, // default: 1000
color: ‘red‘, // default: ‘rgb(52, 145, 204)‘
bgColor: ‘green‘, // default: ‘rgb(230, 230, 230)‘
textColor: ‘blue‘, // default: ‘black‘
progressWidth: 0.15, // default: 0.25 (r)
fontScale: 0.5, // default: 0.4 (r)
toFixed: 1 // default: 0
});
circleProgress({
id: ‘circle-progress-zero‘,
progress: 0 // default: 100
});
circleProgress({
id: ‘circle-progress-no-animation‘,
duration: 0 // default: 1000
});
};
showMe();
</script>
</body>
</html>

时间: 2024-10-16 19:53:32

圆进度条的相关文章

图解CSS3制作圆环形进度条的实例教程

圆环形进度条制作的基本思想还是画出基本的弧线图形,然后CSS3中我们可以控制其旋转来串联基本图形,制造出部分消失的效果,下面就来带大家学习图解CSS3制作圆环形进度条的实例教程 首先,当有人说你能不能做一个圆形进度条效果出来时,如果是静态完整圆形进度条,那么就很简单了: .circleprogress{        width: 160px;        height: 160px;        border:20px solid red;        border-radius: 50

android自定义圆形进度条,实现动态画圆效果

自定义圆形进度条效果图如下:应用场景如动态显示分数等. view的自定义属性如下attr.xml <?xml version="1.0" encoding="UTF-8"?> <resources> <declare-styleable name="ArcProgressbar">         <!-- 圆环起始角度-->         <attr name="startAng

基于HT for Web矢量实现HTML5文件上传进度条

在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条,矢量在<矢量Chart图表嵌入HTML5网络拓扑图的应用>一文中已经讲述了关于setCompType()方法的应用,今天我们用setImage()方法充分利用系统中定义好的矢量资源来实现文件上传进度条,我们先来看下效果图: 从效果图可以看到,向服务器上传了一个mp4文件,并在最下方显示

Andorid自定义圆形渐变色进度条的从实现到开源

信自己也是一种信仰. 写在前面的话 3月初我在自定义控件概述中挖下的几个坑,前一段时间已经基本填完了,自定义控件的几种实现方式也分别写了demo来进行说明.今天我们来聊一聊如何把自己封装一个圆形渐变色进度条控件开源到github,并且上传到jcenter方便别人远程依赖.先看下效果图: 连接github并提交新项目 前提条件: 安装Git客户端(下载地址) 有GitHub账号 创建新项目并提交到Github: 在AndroidStudio中新建一个项目 配置Git:Settings -> Ver

HTML5 Canvas绘制环形进度条

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

自定义圆形进度条

关于控件呢,我想大家应该都很熟悉了吧,android应用开发MVC架构中,控件担任着至关重要的作用,感觉可以说是基于控件的事件模型人机交互的基础吧.这种特性感觉在wpf开发中体现得更为直接,感兴趣的同学可以去了解一下.而android框架自身就已经给我们提供了很多控件.那么问题来了?为什么有那么多控件可以用,你还要去屑自定义控件呢?是因为大家闲的蛋疼吗?显然不是.个人认为只要有两方面吧,要么是觉得有些原生控件是在是丑得难以忍受(即使是在你已经自定义了他的shape,圆角,selector等一系列

Android自定义View——圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

两种CSS3圆环进度条详解

晚上睡觉之前,我抽了1个多小时,研究了一下圆环进度条,结合从网上查阅的资料,我终于掌握了两种圆环的生成方法. 这次的效果就是单纯的CSS3效果,也没有写具体的JS,等以后有时间在好好整理一下吧~. 第一种:通过overflow溢出隐藏的方式: 这种方法好处在于容易理解,只需要一层一层的嵌套,即可得到效果,但是实现起来较为繁琐,HTML的结构也比较冗余. 先看HTML结构: <div class="circle-one"> <div class="circle

C#自定义控件 ————进度条

先看看样式 一个扇形的进度条 对外公开的方法和属性 事件 value_change;//值改变时触发的事件progress_finshed;//进度条跑完时触发的事件 属性 Max_value//最大值 Min_value//最小值 Current_value//当前值设置 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Dra