Android 图片加载之ImageLoad封装

前言

图片加载在我们平时的项目开发当中经常会用到,为了可以更好的在项目当中复用图片加载功能,把它封装成一个通用的库是很有必要的。

使用
Android 图片加载之ImageLoad封装_第1张图片
效果图.png
 ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(url).isCircle(true).imageView(imageViewOne).build());
 ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(urlTwo).isGray(true).imageView(imageViewTwo).build());
 ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(urlThree).imageHeight(1400).imageWidth(1600).imageView(imageViewThree).build());

三个请求分别实现三张图片的效果,第一张图片是圆角,第一张是图片变灰,第三张是设置图片显示的宽高

实现

主要由三个类组成

//图片代理类
ImageLoadProxy

//图片参数配置类
ImageLoadConfiguration

//图片加载接口类
ImageLoad

首先来看看ImageLoadProxy类

public class ImageLoadProxy {

    private static ImageLoadProxy mInstance;
    private ImageLoad mImageLoad;

    public static ImageLoadProxy getInstance() {
        if (mInstance == null) {
            synchronized (ImageLoadProxy.class) {
                if (mInstance == null) {
                    mInstance = new ImageLoadProxy();
                }
            }
        }
        return mInstance;
    }


    private ImageLoadProxy() {
        mImageLoad = new GlideImageLoad();
    }

    public void load(ImageLoadConfiguration imageLoadCfg) {
        mImageLoad.load(imageLoadCfg);
    }

ImageLoadProxy使用了单例模式,有个全局属性ImageLoad,ImageLoad是个接口,它的实例对象是在构造方法当中实现的

public ImageLoadProxy() {
      mImageLoad = new GlideImageLoad();
}

ImageLoad接口有个load方法,接口的实现类GlideImageLoad会重写load方法来加载图片,ImageLoadProxy的load方法内部就是调用了ImageLoad的load方法,我们来看看实现类GlideImageLoad

public class GlideImageLoad implements ImageLoad {

    @Override
    public void load(ImageLoadConfiguration imageLoadCfg) {
        GlideManager.load(imageLoadCfg);
    }
}

GlideManager.load(imageLoadCfg) 就是通过Glide库加载图片

ImageLoadProxy的load方法有个ImageLoadConfiguration参数,我们来看看ImageLoadConfiguration类

public class ImageLoadConfiguration {

    public final Context context;
    public final ImageView imageView;
    public final String url;
    public final int defaultImageResId;
    public final boolean isCircle;
    public final boolean isGray;
    public final int imageWidth;
    public final int imageHeight;

    public ImageLoadConfiguration(Builder builder) {
        context = builder.context;
        imageView = builder.imageView;
        url = builder.url;
        defaultImageResId = builder.defaultImageResId;
        isCircle = builder.isCircle;
        isGray = builder.isGray;
        imageWidth = builder.imageWidth;
        imageHeight = builder.imageHeight;
    }

    public static final class Builder {

        private Context context;
        private ImageView imageView;
        private String url;
        private int defaultImageResId;
        private boolean isCircle;
        private boolean isGray;
        private int imageWidth;
        private int imageHeight;

        public Builder(Context context) {
            this.context = context;
        }

        public Builder url(String url) {
            this.url = url;
            return this;
        }

        public Builder defaultImageResId(int defaultImageResId) {
            this.defaultImageResId = defaultImageResId;
            return this;
        }

        public Builder isCircle(boolean isCircle) {
            this.isCircle = isCircle;
            return this;
        }

        public Builder isGray(boolean isGray) {
            this.isGray = isGray;
            return this;
        }

        public Builder imageWidth(int imageWidth) {
            this.imageWidth = imageWidth;
            return this;
        }

        public Builder imageHeight(int imageHeight) {
            this.imageHeight = imageHeight;
            return this;
        }

        public Builder imageView(ImageView imageView) {
            this.imageView = imageView;
            return this;
        }

        public ImageLoadConfiguration build() {
            return new ImageLoadConfiguration(this);
        }

    }

ImageLoadConfiguration使用了Builder模式,可以自由的去组装不同的属性,然后根据属性值来实现图片加载的不同效果(实现模块的三个不同的调用就是案例)。

结束语

供业务层调用的ImageLoadProxy类是个代理类,它并没有去做加载图片的功能,而是使用ImageLoad接口的实现类来加载图片,这样做的好处是如果以后要使用其他开源库去加载图片,可以重新创建一个ImageLoad接口的实现类来加载图片,符合设计模式的开闭原则。

ImageLoadProxy,ImageLoad,ImageLoadConfiguration 三个类各司其职,
ImageLoadConfiguration 负责参数的配置,
ImageLoad 负责图片的加载,
ImageLoadProxy 负责调度

符合设计模式的单一职责原则,各自负责各自的功能

具体代码实现 https://github.com/chenpengfei88/ImageLoad

你可能感兴趣的:(Android 图片加载之ImageLoad封装)