Android平台的图片加载库一直随着时间的推移不断地冒出来,Universal ImageLoader,Glide,picasso,fresco,每出一个更好的图片加载库,都得再接入一遍,并且颇有可能须要修改先前的代码。封装就能够避免每次都修改代码的问题,业务方无需知道如何实现,只要调用统一不变的接口便可。而封装后的图片加载库能够作自我升级,更换不一样的第三方图片加载库,都不会对已有代码有侵入,大大减小接入成本以及避免没必要要的错误。每次升级后,不会修改原来的接口,而在很是必要的状况只可能增长少许的接口。java
SHImageView就是出于以上的考虑,应运而生。SHImageView是尚妆多个产品同时都在使用的图片加载库。一开始,不一样产品用着不一样的图片加载库,甚至一个产品也用着多套图片加载库,很是不方便管理和排查问题。借着Fresco的出现,开始建立统一的图片加载库,即SHImageView. SH取自ShowJoy(尚妆)的头两个字母。android
SHImageView抱着简单易用的原则,让业务方写尽可能少的代码来实现更多的功能。git
compile 'com.showjoy.android:image:1.0.1'
public class MainApplication extends Application { @Override public void onCreate() { super.onCreate(); SHImageView.init(this); } }
<com.showjoy.image.SHImageView android:id="@+id/demo_image_view" android:layout_width="150dp" android:layout_height="150dp" />
imageView = new SHImageView(context);
//网络图片 imageView.setImageUrl("http://t.cn/R5JfqHu"); //本地图片 imageView.setImageUrl("file://sdcard/sample/xxx.jpg"); //直接设置res id,其余都不用管 public void setImageRes(int resId);
//支持自适应宽高,即wrap_content,在setImageUrl以前调用, imageView.setWrapContentEnable(true); //支持监听加载结果 public void setImageUrl(String url, ISHImageLoadListener loadListener); public void setImageUrl(String url, int width, int height, ISHImageLoadListener loadListener); public void setImageRes(int resId, ISHImageLoadListener loadListener); //能够注入压缩接口,支持webp,已修复一些机型webp透明变黑的问题 imageView.setCompressCallback(CompressCallback compressCallback); //设置压缩的时候,是否将png转成jpg public void setCompressPng2Jpg(boolean png2jpg)
CompressCallback定义, 当经过getLayoutParams()能够获取width和height时,调用第一个接口,不然调用第二个接口。经过修改url后缀来达到下载压缩后的图片,这个须要本身公司图片服务器的支持。如,图片服务器支持后经过如下连接就能够获取对应尺寸或者等比压缩的图片:http://cdn1.showjoy.com/image... http://cdn1.showjoy.com/image...github
interface CompressCallback { String getCompressedUrl(String url, int width, int height, boolean png2jpg); String getCompressedUrl(String url, boolean png2jpg); }
//静态方法,用来手动清除内存里的缓存 SHImageView.clearMemoryCaches(); //静态方法,用来手动清除文件里的缓存 SHImageView.clearDiskCaches(); //静态方法,用来手动清除全部缓存 SHImageView.clearCaches();
#fresco -keep class com.facebook.imagepipeline.gif.** { *; } -keep class com.facebook.imagepipeline.webp.** { *; } -keep @com.facebook.common.internal.DoNotStrip class * -keepclassmembers class * { @com.facebook.common.internal.DoNotStrip *; } -dontwarn okio.** -dontwarn javax.annotation.** -keepclassmembers class * { native <methods>; }
SHCircleImageView 圆形图片web
包含SHImageView的接口,另外包含如下接口缓存
//设置边框颜色 void setBorderColor(int color); //设置边框宽度 void setBorderWidth(int width);
SHGifImageView 动态图服务器
包含SHImageView的接口, 使用方法一致网络
一、SHImageView依赖Fresco,支持webp,gif。app
二、首先定义接口ISHImageView,定义提供给业务方调用的接口。ide
三、针对Fresco定义class FrescoImageView implement ISHImageView,实现已定义的接口
四、定义共业务方调用的类SHImageView,继承FrescoImageView。 SHGifImageView和SHCircleImageView同理,继承
FrescoCircleImageView和FrescoGifImageView。
五、往后须要更换图片加载库,只须要针对新的图片加载库定义相应的类ABCImageView实现接口ISHImageView。而后SHImageView 继承ABCImageView便可。
目前SHImageView已在尚妆旗下多个App使用,会持续优化。代码在github上,欢迎你们提出宝贵意见。
https://github.com/ShowJoy-co...