Canvas 的进度条操作及代码

canvas需要进度条么?答案显然是肯定的。我们的页面如果放到服务器上,图片的下载将是相当漫长的一个过程。如果我们不进行预加载就开始执行动画的话,那么用户肯定看不到理想的效果。

今天和大家探讨canvas动画框架之图片预加载,如上图的进度条,这可不是假的进度条,是真正能够实时获取图片加载进度的进度条。

为什么想要做这个进度条呢?canvas需要进度条么?答案显然是肯定的。我们的页面如果放到服务器上,图片的下载将是相当漫长的一个过程。如果我们不进行预加载就开始执行动画的话,那么用户肯定看不到理想的效果。

那么我们就来看看canvas图片预加载的实现

/*star  
 *loading模块  
 *实现图片的预加载,并显示进度条  
 *参数:图片数组对象,加载完成的回调函数  
 */  
function loadImages(sources,callback){      
    var loadedImages = 0;      
    var numImages = 0;    
    ctx.font='14px bold';  
    ctx.lineWidth=5;  
    var clearWidth=canvas.width;  
    var clearHeight=canvas.height;  
    // get num of sources      
    for (var src in sources) {      
        numImages++;      
    }      
    for (var src in sources) {      
        images[src] = new Image();  
        //当一张图片加载完成时执行      
        images[src].onload = function(){   
            //重绘一个进度条  
            ctx.clearRect(0,0,clearWidth,clearHeight);  
            ctx.fillText('Loading:'+loadedImages+'/'+numImages,200,280);  
            ctx.save();  
            ctx.strokeStyle='#555';  
            ctx.beginPath();  
            ctx.moveTo(200,300);  
            ctx.lineTo(600,300);  
            ctx.stroke();  
            ctx.beginPath();  
            ctx.restore();  
            ctx.moveTo(200,300);  
            ctx.lineTo(loadedImages/numImages*400+200,300);    
            ctx.stroke();  
            //当所有图片加载完成时,执行回调函数callback  
            if (++loadedImages >= numImages) {      
                callback();      
            }      
        };    
        //把sources中的图片信息导入images数组    
        images[src].src = sources[src];      
    }      
}      
//定义预加载图片数组对象,执行loading模块  
window.onload = function(){      
    var sources = {      
        PaperBoy1: "images/run/PaperBoy1.png",      
        PaperBoy2: "images/run/PaperBoy2.png",   
        PaperBoy3: "images/run/PaperBoy3.png",      
        PaperBoy4: "images/run/PaperBoy4.png",    
        PaperBoy5: "images/run/PaperBoy5.png",      
        PaperBoy6: "images/run/PaperBoy6.png",    
        PaperBoy7: "images/run/PaperBoy7.png",      
        PaperBoy8: "images/run/PaperBoy8.png",    
        PaperBoy9: "images/run/PaperBoy9.png",      
        PaperBoy10: "images/run/PaperBoy10.png",    
        PaperBoy11: "images/run/PaperBoy11.png",      
        PaperBoy12: "images/run/PaperBoy12.png",     
        PaperBoy13: "images/run/PaperBoy13.png",      
        PaperBoy14: "images/run/PaperBoy14.png",   
        PaperBoy15: "images/run/PaperBoy15.png",      
        PaperBoy16: "images/run/PaperBoy16.png",    
        PaperBoy17: "images/run/PaperBoy17.png",      
        PaperBoy18: "images/run/PaperBoy18.png",    
        PaperBoy19: "images/run/PaperBoy19.png",      
        PaperBoy20: "images/run/PaperBoy20.png",    
        PaperBoy21: "images/run/PaperBoy21.png",      
        PaperBoy22: "images/run/PaperBoy22.png",    
        PaperBoy23: "images/run/PaperBoy23.png",      
        PaperBoy24: "images/run/PaperBoy24.png",   
        _Street:'images/_Street.png',  
        AD:'images/AD.png',  
        building:'images/building.png',  
        cloud:'images/cloud.png'  
    };      
    //执行图片预加载,加载完成后执行main  
    loadImages(sources,main);      
};     
/*end*/ 

当windows.onload发生后,我们定义一个存储着所有图片信息的对象sources,然后把它传入loadImages这个方法里。

重点是看看loadImages这个方法,它有两个参数,一个是存储的图片信息的sources,一个是回调函数callback(一旦图片加载完毕,即执行callback。我们这里执行的是main函数,意味着动画开始初始化)

总图片数我们存在numImages里面:

// 首先遍历数组,计算出总图片数      
    for (var src in sources) {      
        numImages++;      
    }     

其实这个方法的核心就是给每张图片添加一个onload事件。

当每张图片加载完成后,我们做了三件事:

1.计算出加载完成图片与总图片的百分比;

2.然后画出一个用户可见的进度条,告诉用户加载的进度;

3.做判断看图片是否加载完,如加载完了就执行callback,否则返回error。

结构如下:

//当一张图片加载完成时执行  
  images[src].onload = function(){  
  //计算出加载图片数,并根据总图片数,算出百分比  
   //画出进度条  
   //if图片加载完毕,则执行callback
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凭空起惊雷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值