前言
图片加载在我们平时的项目开发当中经常会用到,为了可以更好的在项目当中复用图片加载功能,把它封装成一个通用的库是很有必要的。
使用
效果图.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 负责调度
符合设计模式的单一职责原则,各自负责各自的功能
网友评论