码迷,mamicode.com
首页 > 编程语言 > 详细

Canvas---Canvas图像加载、利用javascript回调机制实现一个图片加载器

时间:2015-03-02 17:00:02      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:canvas   html5   javscript   图片加载   web   

canvas的drawImage方法有个缺点,就是当图片还未加载完成时调用它将无效。

当然,在高速运转的游戏主循环中,可以直接忽略这个问题,或者用 img.complete == true来做下判断。

在游戏循环之外的地方,可以用 img.onload = function (){};这样的回调解决。

但是,如果需要实现预先大量图片的加载,并且将加载进度告知用户,这时就需要一个图片加载器。

一.图片加载器原理

1.对于每张图片,开启对应的一个线程去负责加载,加载完成后修改一个变量的值-loadedNum

2.额外开启一个线程,监控loadedNum与needLoadNum的值,当加载全部完成时,调用回调函数。

3.由于javascript没有传统意义的线程机制,所以要使用setInterval模拟这些操作。

二.图片加载器的使用

        var canvas = document.getElementById("canvas");
        var context = canvas.getContext("2d");
        //canvas自适应
        MikuScaleUtil.rejustCanvas(canvas);
        //图片加载器
        MikuImageManager.addImg("girl01","http://www.dm123.cn/ecms/d/file/2015-02-01/ae20761d9c6ff6e87989634a586a1906.jpg");
        MikuImageManager.addImg("girl02","http://www.dm123.cn/ecms/d/file/2015-02-04/c6913e96129402d88f344e1c7b8e3c8e.jpg");
        MikuImageManager.addImg("girl03","http://www.dm123.cn/ecms/d/file/2015-02-03/071624b53ca02eca0d5696b7759f9b2e.jpg");
        MikuImageManager.addImg("girl04","http://www.dm123.cn/ecms/d/file/2015-02-03/4ef08ed1842579ff38244479b1b721ba.jpg");
        MikuImageManager.initImgs(loadImage,main);
        //主函数
        function main(){
            context.drawImage(MikuImageManager.getImg("girl01"),0,0);
        }
        function loadImage(loaded,total){
            console.log(loaded+"|"+total);
        }

1.使用addImg方法添加图片链接到加载器中

2.调用initImgs(loadImage,main);方法起动加载器

loadImage这个回调函数是,每隔50毫秒调用一次,输出当前已经加载图片的数量与总数。可以用它来更新进度条。

main这个回调是,当加载完成后调用。

3.getImg(name),方法可以使用之前取得名字获取图片对象。

三.效果图:

技术分享


四.源代码

//工具类01-图片管理工具
function MikuImageManager(){};
//私用属性
MikuImageManager._imgArray = new Array();
MikuImageManager._loadedNum = 0;
//公有方法
MikuImageManager.addImg = function(name,src){
    var img = new Image();
        img.src = src;
        img.name = name;
        img.loaded = false;
    MikuImageManager._imgArray.push(img);
};
MikuImageManager.getImg = function(name){
    var target ;
    MikuImageManager._imgArray.forEach(function(img){
        if(img.name == name){
            target = img;
        }
    });
    return target;
};
MikuImageManager.initImgs = function(onLoadCallBack,loadOvercallBack){
    MikuImageManager._imgArray.forEach(function(img){
        MikuImageManager._loadImg(img);
    });
    var timer = setInterval(function(){
        //console.log(MikuImageManager._loadedNum+"|"+MikuImageManager._imgArray.length);
        onLoadCallBack(MikuImageManager._loadedNum,MikuImageManager._imgArray.length);
        if(MikuImageManager._loadedNum === MikuImageManager._imgArray.length){
            //console.log("全部图片加载完成");
            clearInterval(timer);
            //回调
            loadOvercallBack();
        }
    },50);
};
//私有方法
MikuImageManager._loadImg = function(img){
    var checkTime = 0;
    //设置定时器
    var timer = setInterval(function(){
        checkTime = checkTime + 50;
        //console.log("加载耗时:"+img.name+"|"+checkTime);
        //如果图片加载完成
        if(img.complete == true){
            MikuImageManager._loadedNum ++;
            //console.log("加载完成:"+img.name);
            //清除定时器
            clearInterval(timer);
        }
    },50);
};
















Canvas---Canvas图像加载、利用javascript回调机制实现一个图片加载器

标签:canvas   html5   javscript   图片加载   web   

原文地址:http://blog.csdn.net/mikuscallion/article/details/44017907

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!