Android框架思考–工具类(图片库选择—glide、Picasso切换)
我们在设计一个项目框架的时候,除了选定基本的骨架如MVC、MVP等之外,还有诸如网络库的选择、图片处理库的选择,选定一个适合我们项目的库之外,针对解耦以及可替换方面的考虑,如何接入进我们的项目中也就需要考虑一番了。本文从一个图片库入手,整理一下我对这方面的思考。
场景设定
项目前期选定glide作为图片加载库,然后再项目中期,领导要求(不讨论原因)图片加载库切换成Picasso库,并且以后也有可能要被换成其他的诸如image-loader、Fresco或者volley等图片加载库,所以在设计图片加载逻辑时需要兼容这些可能变动的需求。
分析过程
要实现上述目标,减少后续代码改动范围,所以在使用的地方直接使用glide或者Picasso库的加载方法会使后续替换图片库的工作量变得巨大而且也容易出现遗漏和方法的错误,因此就要求在具体使用的地方不能出现具体图片库的代码,所以基本的就需要使用工厂模式来实现该功能。工厂模式在使用时关注功能有哪些,具体功能实现由具体的特定工厂(glide、Picasso等)来实现。
功能分析
基本的图片工具库,需要满足以下方法(特殊的需求如高斯模糊处理等暂不讨论)
- 展示一个基本的网络库
- 加载图片时占位图
- 加载失败的占位图
- 图片显示尺寸的限定
- 图片显示样式处理(拉伸、占满、等比缩放等,这个需求每一个图片加载库都可以自动根据imageview的属性自动适应,不需要额外做处理)
- 图片圆角处理
- 图片加载过程的状态监听
以上是设计一个图片加载模块要考虑基本的功能,其他的特殊需求可以根据项目要求具体再加,诸如图片缓存策略、图片滤镜等,这些展开说内容就过多了。
根据上面的需求分析,可以抽离出以下几个类:
- 配置文件类
package com.kotlin.anonyper.testapplication.image;
import android.widget.ImageView;
/**
* Application
* Created by anonyper on 2018/4/2.
*/
public class ImageConfig {
int defaultRes;//默认占位符
int failRes;//失败占位符
int radius;// 圆角
ImageView.ScaleType scaleType;//图片展示样式
int width = -1;//图片宽
int height = -1;//图片高
/**
* 构造函数
*
* @param defaultRes
* @param failRes
* @param radius
* @param width
* @param height
* @param scaleType
*/
public ImageConfig(int defaultRes, int failRes, int radius, int width, int height, ImageView.ScaleType scaleType) {
this.defaultRes = defaultRes;
this.failRes = failRes;
this.radius = radius;
this.width = width;
this.height = height;
this.scaleType = scaleType;
}
public ImageConfig(int defaultRes, int failRes, int radius, int width, int height) {
this(defaultRes, failRes, radius, width, height, ImageView.ScaleType.FIT_CENTER);
}
public ImageConfig(int defaultRes, int failRes, int width, int height) {
this(defaultRes, failRes, 0, width, height);
}
public ImageConfig(int defaultRes, int failRes, int radius) {
this(defaultRes, failRes, radius, -1, -1, ImageView.ScaleType.FIT_CENTER);
}
public ImageConfig(int defaultRes, int failRes) {
this(defaultRes, failRes, 0);
}
public ImageConfig(int defaultRes) {
this(defaultRes, -1);
}
public int getDefaultRes() {
return defaultRes;
}
public void setDefaultRes(int defaultRes) {
this.defaultRes = defaultRes;
}
public int getFailRes() {
return failRes;
}
public void setFailRes(int failRes) {
this.failRes = failRes;
}
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
public ImageView.ScaleType getScaleType() {
return scaleType;
}
public void setScaleType(ImageView.ScaleType scaleType) {
this.scaleType = scaleType;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
- 加载过程监听类
package com.kotlin.anonyper.testapplication.image;
/**
* 图片加载过程的回调
* 回调监听这些方法不一定所有的库都有
* Application
* Created by anonyper on 2018/4/2.
*/
public interface ImageLoadProcessInterface {
/**
* 开始加载
*/
void onLoadStarted();
/**
* 资源准备妥当
*/
void onResourceReady();
/**
* 资源已经释放
*/
void onLoadCleared();
/**
* 资源加载失败
*/
void onLoadFailed();
}
- 加载接口类
package com.kotlin.anonyper.testapplication.image;
import android.content.Context;
import android.widget.ImageView;
/**
* 图片加载的接口
* Application
* Created by anonyper on 2018/4/2.
*/
public interface ImageLoadInterface {
/**
* 显示路径中的图片(网络、文件中)
*
* @param mContext
* @param view
* @param url