• 技术文章 >web前端 >H5教程

    详解canvas实现圆弧、圆环进度条的实例方法

    零下一度零下一度2017-05-27 15:26:02原创2175
    下面总结了自己在项目中的圆形进度条效果的实现方式,希望对大家有帮助:

    此方法通过canvas绘制圆形的方法来实现动态圆环进度条,直接上代码,疑问请看注释:

    HTML代码如下, 在页面里创建一个画布即可:

    <canvas id="canvas" width="300" height="300">
        <p>抱歉,您的浏览器不支持canvas</p>
     </canvas>

    JS分两大部分,
    第一部分实现整体功能,第二部分调用:
    第一部分:
      第一部分功能原理大概是,画两个圆,一个是底色圆,第二个是动态加载的圆弧,进度通过定时器加载;颜色加渐变色;

     function toCanvas(id ,progress){                canvas进度条
                    var canvas = document.getElementById(id),
                    ctx = canvas.getContext("2d"),
                    percent = progress,  最终百分比                circleX = canvas.width / 2,  中心x坐标                circleY = canvas.height / 2,  中心y坐标                radius = 100, 圆环半径                lineWidth = 5,  圆形线条的宽度                fontSize = 20; 字体大小
                     两端圆点
                    function smallcircle1(cx, cy, r) {
                        ctx.beginPath();                    //ctx.moveTo(cx + r, cy);                    ctx.lineWidth = 1;
                        ctx.fillStyle = '#06a8f3';
                        ctx.arc(cx, cy, r,0,Math.PI*2);
                        ctx.fill();
                    }                 function smallcircle2(cx, cy, r) {
                         ctx.beginPath();                     //ctx.moveTo(cx + r, cy);                     ctx.lineWidth = 1;
                         ctx.fillStyle = '#00f8bb';
                         ctx.arc(cx, cy, r,0,Math.PI*2);
                         ctx.fill();
                     }                 画圆
                     function circle(cx, cy, r) {
                         ctx.beginPath();                     //ctx.moveTo(cx + r, cy);                     ctx.lineWidth = lineWidth;
                         ctx.strokeStyle = '#eee';
                         ctx.arc(cx, cy, r, Math.PI*2/3, Math.PI * 1/3);
                         ctx.stroke();
                     }                 画弧线
                     function sector(cx, cy, r, startAngle, endAngle, anti) {
                         ctx.beginPath();                     //ctx.moveTo(cx, cy + r); // 从圆形底部开始画                     ctx.lineWidth = lineWidth;                     // 渐变色 - 可自定义
                         var linGrad = ctx.createLinearGradient(
                             circleX-radius-lineWidth, circleY, circleX+radius+lineWidth, circleY
                         );
                         linGrad.addColorStop(0.0, '#06a8f3');                     //linGrad.addColorStop(0.5, '#9bc4eb');                     linGrad.addColorStop(1.0, '#00f8bb');
                         ctx.strokeStyle = linGrad;                      圆弧两端的样式                     ctx.lineCap = 'round';                     圆弧                     ctx.arc(
                             cx, cy, r,
                             (Math.PI*2/3),                         (Math.PI*2/3) + endAngle/100 * (Math.PI*5/3),
                             false
                         );
                         ctx.stroke();
                     }                  刷新
                     function loading() {                     if (process >= percent) {
                             clearInterval(circleLoading);
                         }                      清除canvas内容                     ctx.clearRect(0, 0, circleX * 2, circleY * 2);                    中间的字                     ctx.font = fontSize + 'px April';
                         ctx.textAlign = 'center';
                         ctx.textBaseline = 'middle';
                         ctx.fillStyle = '#999';
                         ctx.fillText(parseFloat(process).toFixed(0) + '%', circleX, circleY);    
                      
                         圆形                     circle(circleX, circleY, radius);                     
                          圆弧                     sector(circleX, circleY, radius, Math.PI*2/3, process);
                         两端圆点                     smallcircle1(150+Math.cos(2*Math.PI/360*120)*100, 150+Math.sin(2*Math.PI/360*120)*100, 5);
                         smallcircle2(150+Math.cos(2*Math.PI/360*(120+process*3))*100, 150+Math.sin(2*Math.PI/360*(120+process*3))*100, 5);                     控制结束时动画的速度
                         if (process / percent > 0.90) {
                             process += 0.30;
                         } else if (process / percent > 0.80) {
                             process += 0.55;
                         } else if (process / percent > 0.70) {
                             process += 0.75;
                         } else {
                             process += 1.0;
                         }
                     }                 var process = 0.0;  进度
                     var circleLoading = window.setInterval(function () {
                         loading();
                     }, 20);
                         
                }
    第二部分,调用封装好的代码:
                toCanvas('canvas',50);

    【相关推荐】

    1. Canvas实现圆形进度条并显示数字百分比

    2. 利用CSS clip 实现音频播放圆环进度条教程实例

    3. 分享h5 canvas圆圈进度条的实例代码

    4. H5 canvas实现圆形动态加载进度实例

    以上就是详解canvas实现圆弧、圆环进度条的实例方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:分享h5 canvas圆圈进度条的实例代码 下一篇:H5动画--canvas绘制圆环百分比进度的实例
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• HTML5中canvas的使用总结• 为什么html5将主宰在线视频?• 为什么制定html5标准的网站奇丑无比?• HTML5引入的新数组TypedArray介绍_html5教程技巧• 到 2013 年底,WebGL 能发展到什么程度?
    1/1

    PHP中文网