zoukankan      html  css  js  c++  java
  • canvas加载进度条

    <!DOCTYPE html>
    <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        
        <title>Progress Bar</title>
    
        <script type="text/javascript">
            var i = 0;
            var res = 0;
            var context = null;
            var total_width = 300;/*宽度*/
            var total_height = 34;/*高度*/
            var initial_x = 20;
            var initial_y = 20;
            var radius = total_height/2;
            window.onload = function() {
                var elem = document.getElementById('myCanvas');
                if (!elem || !elem.getContext) {
                    return;
                }
    
                context = elem.getContext('2d');
                if (!context) {
                    return;
                }
    
                // set font
                context.font = "16px Verdana";
    
                // Blue gradient for progress bar
                var progress_lingrad = context.createLinearGradient(0,initial_y+total_height,0,0);
                progress_lingrad.addColorStop(0, '#4DA4F3');/*加载完下面的颜色*/
                progress_lingrad.addColorStop(0.4, '#ADD9FF');/*加载完中间的颜色*/
                progress_lingrad.addColorStop(1, '#9ED1FF');/*加载完上面的颜色*/
                context.fillStyle = progress_lingrad;
    
                //draw();
                res = setInterval(draw, 30);
            }
    
            function draw() {
                i+=1;
                // Clear everything before drawing
                context.clearRect(initial_x-5,initial_y-5,total_width+15,total_height+15);
                progressLayerRect(context, initial_x, initial_y, total_width, total_height, radius);
                progressBarRect(context, initial_x, initial_y, i, total_height, radius, total_width);
                progressText(context, initial_x, initial_y, i, total_height, radius, total_width );
                if (i>=total_width) {
                    clearInterval(res);
                }
            }
            function roundRect(ctx, x, y, width, height, radius) {
                ctx.beginPath();
                ctx.moveTo(x + radius, y);
                ctx.lineTo(x + width - radius, y);
                ctx.arc(x+width-radius, y+radius, radius, -Math.PI/2, Math.PI/2, false);
                ctx.lineTo(x + radius, y + height);
                ctx.arc(x+radius, y+radius, radius, Math.PI/2, 3*Math.PI/2, false);
                ctx.closePath();
                ctx.fill();
            }
            function roundInsetRect(ctx, x, y, width, height, radius) {
                ctx.beginPath();
                // Draw huge anti-clockwise box
                ctx.moveTo(1000, 1000);
                ctx.lineTo(1000, -1000);
                ctx.lineTo(-1000, -1000);
                ctx.lineTo(-1000, 1000);
                ctx.lineTo(1000, 1000);
                ctx.moveTo(x + radius, y);
                ctx.lineTo(x + width - radius, y);
                ctx.arc(x+width-radius, y+radius, radius, -Math.PI/2, Math.PI/2, false);
                ctx.lineTo(x + radius, y + height);
                ctx.arc(x+radius, y+radius, radius, Math.PI/2, 3*Math.PI/2, false);
                ctx.closePath();
                ctx.fill();
            }
    
            function progressLayerRect(ctx, x, y, width, height, radius) {
                ctx.save();
                // Set shadows to make some depth
                ctx.shadowOffsetX = 2;
                ctx.shadowOffsetY = 2;
                ctx.shadowBlur = 5;
                ctx.shadowColor = '#666';
    
                 // Create initial grey layer
                ctx.fillStyle = 'rgba(189,189,189,1)';
                roundRect(ctx, x, y, width, height, radius);
    
                // Overlay with gradient
                ctx.shadowColor = 'rgba(0,0,0,0)'
                var lingrad = ctx.createLinearGradient(0,y+height,0,0);
                lingrad.addColorStop(0, 'rgba(255,255,255, 0.1)');
                lingrad.addColorStop(0.4, 'rgba(255,255,255, 0.7)');
                lingrad.addColorStop(1, 'rgba(255,255,255,0.4)');
                ctx.fillStyle = lingrad;
                roundRect(ctx, x, y, width, height, radius);
    
                ctx.fillStyle = 'white';
                //roundInsetRect(ctx, x, y, width, height, radius);
    
                ctx.restore();
            }
            function progressBarRect(ctx, x, y, width, height, radius, max) {
                // var to store offset for proper filling when inside rounded area
                var offset = 0;
                ctx.beginPath();
                if (width<radius) {
                    offset = radius - Math.sqrt(Math.pow(radius,2)-Math.pow((radius-width),2));
                    ctx.moveTo(x + width, y+offset);
                    ctx.lineTo(x + width, y+height-offset);
                    ctx.arc(x + radius, y + radius, radius, Math.PI - Math.acos((radius - width) / radius), Math.PI + Math.acos((radius - width) / radius), false);
                }
                else if (width+radius>max) {
                    offset = radius - Math.sqrt(Math.pow(radius,2)-Math.pow((radius - (max-width)),2));
                    ctx.moveTo(x + radius, y);
                    ctx.lineTo(x + width, y);
                    ctx.arc(x+max-radius, y + radius, radius, -Math.PI/2, -Math.acos((radius - (max-width)) / radius), false);
                    ctx.lineTo(x + width, y+height-offset);
                    ctx.arc(x+max-radius, y + radius, radius, Math.acos((radius - (max-width)) / radius), Math.PI/2, false);
                    ctx.lineTo(x + radius, y + height);
                    ctx.arc(x+radius, y+radius, radius, Math.PI/2, 3*Math.PI/2, false);
                }
                else {
                    ctx.moveTo(x + radius, y);
                    ctx.lineTo(x + width, y);
                    ctx.lineTo(x + width, y + height);
                    ctx.lineTo(x + radius, y + height);
                    ctx.arc(x+radius, y+radius, radius, Math.PI/2, 3*Math.PI/2, false);
                }
                ctx.closePath();
                ctx.fill();
                if (width<max-1) {
                    ctx.save();
                    ctx.shadowOffsetX = 1;
                    ctx.shadowBlur = 1;
                    ctx.shadowColor = '#666';
                    if (width+radius>max)
                      offset = offset+1;
                    ctx.fillRect(x+width,y+offset,1,total_height-offset*2);
                    ctx.restore();
                }
            }
            function progressText(ctx, x, y, width, height, radius, max) {
                ctx.save();
                ctx.fillStyle = 'white';
                var text = Math.floor(width/max*100)+"%";
                var text_width = ctx.measureText(text).width;
                var text_x = x+width-text_width-radius/2;
                if (width<=radius+text_width) {
                    text_x = x+radius/2;
                }
                ctx.fillText(text, text_x, y+22);
                ctx.restore();
            }
        </script>
    
    </head>
    <body>
        <p>
            <canvas id="myCanvas" width="800" height="150"></canvas>
        </p>
    </body>
    </html>
  • 相关阅读:
    解决线程安全问题——同步方法
    Console Add Item –Java使用eBay API SDK刊登商品 详解
    解决Eclipse中新建jsp文件ISO8859-1 编码问题
    struts.xml配置详解
    public class Ex2
    ax2+bx+c=0的根的算法
    猜随机数
    中国的个税计算方法
    Javascript String类的属性及方法
    CSS各个浏览器Hack的写法
  • 原文地址:https://www.cnblogs.com/binmengxue/p/5461551.html
Copyright © 2011-2022 走看看