图片加载库的封装
来源:互联网 发布:大学生网络诈骗图片 编辑:程序博客网 时间:2024/04/24 05:20
一、原因
常用的图片加载库有很多,一个项目中也会用到不同的图片加载库,对这些图片加载库进行封装可以非常高效地在各个库之间进行切换,这也是所谓的策略模式,这个模式和回调接口差不多,都是通过接口对象可以调用不同实现类的方法。
二、实现
(1)首先建立一个策略接口,用来链接调用类和具体实现类
public interface IImageLoaderstrategy { void showImage(@NonNull ImageLoaderOptions options); void cleanMemory(Context context); // 在application的oncreate中初始化 void init(Context context);}
(2)我们在主Activity中是这么调用的
public class MainActivity extends AppCompatActivity { private ImageView img1,img2; private String url="http://img3.duitang.com/uploads/item/201501/12/20150112210307_aFwta.png"; // private String urlGif="http://img2.imgtn.bdimg.com/it/u=2938769139,1872984641&fm=214&gp=0.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); img1= (ImageView) findViewById(R.id.img_1); img2= (ImageView) findViewById(R.id.img_2); ImageLoaderManager.getInstance().showImage(ImageLoaderManager.getDefaultOptions(img1,url)); ImageLoaderManager.getInstance().showImage(ImageLoaderManager.getDefaultOptions(img2,url)); }}
(3)建立一个ImageLoaderManager,来管理下载和初始化,这个也是继承接口类,在init中现在不同的图片加载实现类
通过获得的实现类的实例来进行
public class ImageLoaderManager implements IImageLoaderstrategy { private static final ImageLoaderManager INSTANCE=new ImageLoaderManager(); private IImageLoaderstrategy loaderstrategy; private ImageLoaderManager(){ } public static ImageLoaderManager getInstance(){ return INSTANCE; } public void setImageLoaderStrategy(IImageLoaderstrategy strategy){ loaderstrategy=strategy; } /* * 可创建默认的Options设置,假如不需要使用ImageView , * 请自行new一个Imageview传入即可 * 内部只需要获取Context */ public static ImageLoaderOptions getDefaultOptions(@NonNull View container,@NonNull String url){ return new ImageLoaderOptions.Builder(container,url).isCrossFade(true).blurImage(false).build(); } @Override public void showImage(@NonNull ImageLoaderOptions options) { if (loaderstrategy != null) { loaderstrategy.showImage(options); } } @Override public void cleanMemory(Context context) { loaderstrategy.cleanMemory(context); } // 在application的oncreate中初始化 @Override public void init(Context context) { loaderstrategy=new FrescoImageLoader();// loaderstrategy=new GlideImageLoader(); loaderstrategy.init(context); }}
(4)建立一个ImageLoaderOptions,建立了一个静态内部类,可以通过类名来直接调用,这里在外部类的构造方法中
ImageLoaderOptions在初始化的时候会给他传递builder的参数,而builder是静态内部类,我们建立builder的时候可以通过链式的方式来将参数传递到builder中,然后再通过builder传递到ImageLoaderOptions中,最后在buidler中返回ImageLoaderOptions的实例,就可以了。
截取部分代码
import com.bumptech.glide.request.target.BaseTarget;/** * Created by Administrator on 2017/3/20 0020. */public class ImageLoaderOptions { private View viewContainer; // 图片容器 private String url; // 图片地址 private Integer resource; // 图片地址 private ImageLoaderOptions (Builder builder ){ this.asGif=builder.asGif; this.errorDrawable=builder.errorDrawable; this.holderDrawable=builder.holderDrawable; this.imageSize=builder.mImageSize; } public BaseTarget getTarget() { return target; } public Integer getResource() { return resource; } public boolean isBlurImage() { return blurImage; } public View getViewContainer() { return viewContainer; } public String getUrl() { return url; } public final static class Builder{ private int holderDrawable=-1; // 设置展位图 private View mViewContainer; // 图片容器 public Builder(@NonNull View v, @NonNull String url){ this.url=url; this.mViewContainer=v; } public Builder(@NonNull View v, @NonNull Integer resource){ this.resource=resource; this.mViewContainer=v; } } //对应重写图片size public final static class ImageSize{ private int width=0; private int height=0; public ImageSize(int width, int heigh){ this.width=width; this.height=heigh; } public int getHeight() { return height; } public int getWidth() { return width; } } //对应磁盘缓存策略 public enum DiskCacheStrategy{ All,NONE,SOURCE,RESULT,DEFAULT }}
(5)最后通过定义不同的图片加载类来实现接口,我们得到实现类的实例就行了
三、总结
注意链式结构的实现方式
尊重作者,尊重原创,参考文章:
https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650823490&idx=1&sn=073d98a1de5837c33875e66a0ec05aa7&chksm=80b78fdcb7c006cae47601546e8b2def5644b3ea9a30675faec129015f6366a2490e2ec500f1&mpshare=1&scene=1&srcid=0714VsaET515YXDNnAZ1F5VF&pass_ticket=Y40IlOCri%2F%2BmzInJp2qIfwhe0xTS8UR2zOVF7G8WddJJ%2FPxC%2BKqYRHhTL858dQJm#rd
阅读全文
1 0
- 图片加载库的封装
- Android图片加载库的封装实战
- Android图片加载库的封装实战
- Google图片加载库Glide的简单封装GlideUtils
- Google图片加载库Glide的简单封装GlideUtils
- 关于LruCache和图片加载的封装
- IOS 图片加载封装
- 封装Android加载网络图片
- Glide圆形图片加载封装
- android学习之路(六)---- 图片加载库的优化、封装
- [安卓开发] Glide图片加载库的简单封装使用
- 组件化思想之图片加载库picasso的用法及封装
- Android24_LruCache缓存处理及异步加载图片类的封装
- iOS经典讲解之异步加载图片类的封装
- Android27_LruCache缓存处理及异步加载图片类的封装
- 浅谈Glide加载图片的框架和封装
- LruCache缓存处理及异步加载图片类的封装
- 一个基于GLide加载图片的封装开源框架
- 个税税率表2017
- MongoDB相关文章索引(1)
- Tensorflow手写数字识别在android中的实现
- phpstorm License Server激活
- 获取积分
- 图片加载库的封装
- 用java实现操作系统的前趋图
- 【Shell】Shell语法总结以及简易内存条的实现
- 什么是(不是)DevOps,我们如何实现DevOps?
- Fatfs 移植的那些事
- H
- oracle 返回表函数
- 最大似然估计 (MLE) 最大后验概率(MAP)
- Android开发之滚动控件RecyclerView