xUtils系列之BitmapUtils

BitmapUtils支持对三种形式的图片资源进行加载,
分别是assets图片,sdcard图片和网络图片,使用LRU(最近最少使用算法),
通过磁盘缓存,程序缓存来避免OOM问题.


对于res里的图片,程序运行时就加载在内存中了,所以没必要使用BitmapUtils了


据作者解释,BitmapUtils没有采用单例模式,这样可以采用不同的默认配置来加载不同的图片.
BitmapUtils一共有两种配置BitmapGlobalConfig和BitmapDisplayConfig
BitmapGlobalConfig主要配置磁盘缓存路径,程序缓存大小(这个大小在源码中有限制),
BitmapDisplayConfig主要配置异步加载未完成时临时显示的图片,加载失败的图片,显示图片的最大Size,
加载图片动画,图片是否翻转,是否显示原图(不建议使用)等.


具体配置可以查看BitmapUtils中的源码,但是我本人觉得没有必要自己配置,默认的就挺好的.


下面是BitmapUtils简单的使用:

BitmapUtils bitmapUtils = new BitmapUtils(this);
// 加载网络图片
bitmapUtils.display(testImageView, "http://bbs.lidroid.com/static/image/common/logo.png");

// 加载本地图片(路径以/开头, 绝对路径)
bitmapUtils.display(testImageView, "/sdcard/test.jpg");

// 加载assets中的图片(路径以assets开头)
bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");

// 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));
listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener));

除此之外,我们可以给被加载的图片增加BitmapLoadCallBack,接收图片加载的各种状态,从而增加自己的处理:
testBitmapUtils.display(testImageView, "assets/img/wallpaper.jpg",new BitmapLoadCallBack(){......});
以下是BitmapLoadCallBack的接口定义:

public abstract class BitmapLoadCallBack {

    /**
     * Call back when start loading.
     *
     * @param container
     * @param uri
     * @param config
     */
    public void onPreLoad(T container, String uri, BitmapDisplayConfig config) {
    }

    /**
     * Call back when start loading.
     *
     * @param container
     * @param uri
     * @param config
     */
    public void onLoadStarted(T container, String uri, BitmapDisplayConfig config) {
    }

    /**
     * Call back when loading.
     *
     * @param container
     * @param uri
     * @param config
     * @param total
     * @param current
     */
    public void onLoading(T container, String uri, BitmapDisplayConfig config, long total, long current) {
    }

    /**
     * Call back when bitmap has loaded.
     *
     * @param container
     * @param uri
     * @param bitmap
     * @param config
     */
    public abstract void onLoadCompleted(T container, String uri, Bitmap bitmap, BitmapDisplayConfig config, BitmapLoadFrom from);

    /**
     * Call back when bitmap failed to load.
     *
     * @param container
     * @param uri
     * @param drawable
     */
    public abstract void onLoadFailed(T container, String uri, Drawable drawable);

    private BitmapSetter bitmapSetter;

    public void setBitmapSetter(BitmapSetter bitmapSetter) {
        this.bitmapSetter = bitmapSetter;
    }

    public void setBitmap(T container, Bitmap bitmap) {
        if (bitmapSetter != null) {
            bitmapSetter.setBitmap(container, bitmap);
        } else if (container instanceof ImageView) {
            ((ImageView) container).setImageBitmap(bitmap);
        } else {
            container.setBackgroundDrawable(new BitmapDrawable(container.getResources(), bitmap));
        }
    }

    public void setDrawable(T container, Drawable drawable) {
        if (bitmapSetter != null) {
            bitmapSetter.setDrawable(container, drawable);
        } else if (container instanceof ImageView) {
            ((ImageView) container).setImageDrawable(drawable);
        } else {
            container.setBackgroundDrawable(drawable);
        }
    }

    public Drawable getDrawable(T container) {
        if (bitmapSetter != null) {
            return bitmapSetter.getDrawable(container);
        } else if (container instanceof ImageView) {
            return ((ImageView) container).getDrawable();
        } else {
            return container.getBackground();
        }
    }
}


以下是BitmapUtils的关键函数:
public  void display(T container, String uri, BitmapDisplayConfig displayConfig, BitmapLoadCallBack callBack) {
	if (container == null) {
		return;
	}

	if (callBack == null) {
		callBack = new DefaultBitmapLoadCallBack();
	}

	if (displayConfig == null || displayConfig == defaultDisplayConfig) {
		displayConfig = defaultDisplayConfig.cloneNew();
	}

	// Optimize Max Size
	BitmapSize size = displayConfig.getBitmapMaxSize();
	displayConfig.setBitmapMaxSize(BitmapCommonUtils.optimizeMaxSizeByView(container, size.getWidth(), size.getHeight()));

	container.clearAnimation();

	if (TextUtils.isEmpty(uri)) {
		callBack.onLoadFailed(container, uri, displayConfig.getLoadFailedDrawable());
		return;
	}

	// start loading
	callBack.onPreLoad(container, uri, displayConfig);

	// find bitmap from mem cache.
	Bitmap bitmap = globalConfig.getBitmapCache().getBitmapFromMemCache(uri, displayConfig);

	if (bitmap != null) {
		callBack.onLoadStarted(container, uri, displayConfig);
		callBack.onLoadCompleted(
				container,
				uri,
				bitmap,
				displayConfig,
				BitmapLoadFrom.MEMORY_CACHE);
	} else if (!bitmapLoadTaskExist(container, uri, callBack)) {

		final BitmapLoadTask loadTask = new BitmapLoadTask(container, uri, displayConfig, callBack);

		// get executor
		PriorityExecutor executor = globalConfig.getBitmapLoadExecutor();
		File diskCacheFile = this.getBitmapFileFromDiskCache(uri);
		boolean diskCacheExist = diskCacheFile != null && diskCacheFile.exists();
		if (diskCacheExist && executor.isBusy()) {
			executor = globalConfig.getDiskCacheExecutor();
		}
		// set loading image
		Drawable loadingDrawable = displayConfig.getLoadingDrawable();
		callBack.setDrawable(container, new AsyncDrawable(loadingDrawable, loadTask));

		loadTask.setPriority(displayConfig.getPriority());
		loadTask.executeOnExecutor(executor);
	}
}


你可能感兴趣的:(xUtils)