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

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);
};



时间: 2024-11-08 03:57:26

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

GridView实现一个图片加多个文本框

GridView的使用是很简单的,API Demo中有例子,但是要实现复杂的GridView,就需要自定义了. 今天我们要实现如下的效果: 先说它的布局,它是由gridview和grid_item两部分组成. main.xml   <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android="http://schemas.android.com/apk/res/androi

每日一题_JavaScript.利用纯JavaScript Dom Core实现一个图片轮播效果 ?

具体需求:1. 页面加载后每隔2秒自动从轮播图片2. 鼠标悬停或是点击页面中小图片时,大图片自动跟随切换,并且停止轮播3. 鼠标离开小图片时,图片重新开始轮播 实现思路: 具体代码: html <!DOCTYPE html> <html>     <head>         <meta charset="utf-8" />         <title>Js实现图片轮播</title>         <l

二 Java利用等待/通知机制实现一个线程池

接着上一篇博客的 一Java线程的等待/通知模型 ,没有看过的建议先看一下.下面我们用等待通知机制来实现一个线程池 线程的任务就以打印一行文本来模拟耗时的任务.主要代码如下: 1  定义一个任务的接口. 1 /* 2 * 任务的接口 3 */ 4 public interface Task { 5 void doSomething(); 6 } 2  实现一个具体的任务. 1 /* 2 * 具体的任务 3 */ 4 public class PrintTask implements Task{

imagepool前端图片加载管理器(JavaScript图片连接池)

前言 imagepool是一款管理图片加载的JS工具,通过imagepool可以控制图片并发加载个数. 对于图片加载,最原始的方式就是直接写个img标签,比如:<img src="图片url" />. 经过不断优化,出现了图片延迟加载方案,这回图片的URL不直接写在src属性中,而是写在某个属性中,比如:<img src="" data-src="图片url" />.这样浏览器就不会自动加载图片,等到一个恰当的时机需要加载

详谈高大上的图片加载框架Glide

在Android设备上,加载网络图片一直是一个头疼的问题,因为Android设备种类繁多(当然最主要的是配置),处理的稍不周到轻则应用卡顿,严重者就会出现OOM的,导致程序挂掉.现如今网络上有很多图片库,如 Universal-Image-Loader,Picasso,Fresco,Glide等等.相信列举出的这几个库大家都不陌生,这也是目前最火的图片库了.由于个人的喜好原因(主要是别人介绍说Glide库比较NB),所以就开始研究学习Glide. Glide库和Picasso库有极大的相似性,编

从代码分析Android-Universal-Image-Loader的图片加载、显示流程

从UNIVERSAL IMAGE LOADER. PART 3(四个DisplayImage重载方法详解)中,我们学习了Android-Universal-Image-Loader(以下简称UIL)中四个DisplayImage重载方法的使用,如果你还没有学习,最好先返回去看看,不然可能不理解这篇文章.在这篇文章中我们将主要探讨Android-Universal-Image-Loader的主要流程和这些流程相关的类的分析. 我们先了解一下UIL加载图片的流程(可以通过查看ImageLoader.

LrcCache和DiskLruCache相结合打造图片加载框架

LrcCache和DiskLruCache相结合打造图片加载框架 1概述 这几在研究图片加载的方面的知识,在网上看了一下前辈们写的文章,受到了一些启发,于是综合多方面的知识,将这些整合起来,自己边写了一个图片加载框架.说到图片加载最容易出问题的就是OOM就是内存溢出,所以一定要限制加载图片时使用的内存,这就使用到Android提供的缓存类LruCache,关于LruCache的知识这里不再赘述,大家自行学习.但是如果图片非常的多而且频繁操作的话,加上LruCache的缓存空间有限,缓存就不得不经

图片加载框架之ImageLoader

Android开发中,多少会接触到异步加载图片,或者加载大量图片的问题,而加载图片我们常常会遇到许多的问题,比如说图片的错乱,OOM等问题,对于这些问题解决起来会比较吃力,比较著名的就是Universal-Image-Loader,该项目可以在于Github搜索到. 特征: 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置 支持图

一起写一个Android图片加载框架

本文会从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,并在内存占用与加载图片所需时间这两个方面与主流图片加载框架之一Universal Image Loader做出比较,来帮助我们量化这个框架的性能.通过开发这个框架,我们可以进一步深入了解Android中的Bitmap操作.LruCache.LruDiskCache,让我们以后与Bitmap打交道能够更加得心应手.若对Bitmap的大小计算及inSampleSize计算还不太熟悉,请参考这里:高效加载Bit