最近在整理项目中用到的图片框架,因为很多的原因,项目从2014年开始的1.0版本迭代到现在,经历了无数个版本与功能,图片加载框架也从UIL(Universal-Image-Loader)切换到fresco。众所周知,freco是需要继承DraweeView才能显示图片,而ImageLoader是采用系统的ImageView显示,如果要把ImageLoader替换成freco的工作量可想而知。
正所谓吃一堑长一智,有了这次替换的教训,反映出了我们项目架构上的不足,使用第三方框架时必须要封装好方便日后替换与维护,避免过多的入侵项目内的代码。
封装目标
1.简单易用,使用越简单越好
2.易扩展易替换,支持主流的图片处理框架fresco、picasso、glide等快速替换
实现
一、fresco需要继承DraweeView才能显示图片,所以我们要新建一个继承DraweeView的ImageDraweeView
public class ImageDraweeView extends SimpleDraweeView{
public ImageDraweeView(Context context, GenericDraweeHierarchy hierarchy) {
super(context, hierarchy);
}
public ImageDraweeView(Context context) {
super(context);
setBackgroundColor(Color.TRANSPARENT);
}
public ImageDraweeView(Context context, AttributeSet attrs) {
super(context, attrs);
setBackgroundColor(Color.TRANSPARENT);
}
public ImageDraweeView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setBackgroundColor(Color.TRANSPARENT);
}
}
二、一些参数设置
1.设置加载中图片
private int mDefaultPic;
/**
* 设置加载中显示图片
* @param defaultPic
* @return
*/
public ImageDraweeView withPlaceholderImage(int defaultPic) {
this.mDefaultPic = defaultPic;
return this;
}
2.显示图片
/**
* 显示图片
*
* @param url
*/
public void displayImage(String url) {
//fresco
GenericDraweeHierarchy hierarchy = getHierarchy();
if (mDefaultPic != 0) {
hierarchy.setPlaceholderImage(mDefaultPic);
}
setImageURI(url);
//glide
RequestManager requestManager = Glide.with(getContext());
if (mDefaultPic != 0) {
RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(mDefaultPic);
requestManager
.applyDefaultRequestOptions(requestOptions);
}
requestManager
.load(url)
.into(this);
//picasso
RequestCreator requestCreator = Picasso.with(getContext()).load(url);
if (mDefaultPic != 0) {
requestCreator.placeholder(mDefaultPic);
}
requestCreator.into(this);
}
还有其他比如圆角图片等就不一一列举了,和加载中图片一样的方法设置即可