图片加载库一直随着时间的推移不断地冒出来,Universal ImageLoader,Glide,picasso,fresco,每出一个更好的图片加载库,都得再接入一遍,而且很有可能需要修改先前的代码。封装就可以避免每次都修改代码的问题,业务方无需知道如何实现,只要调用统一不变的接口即可。而封装后的图片加载库可以做自我升级,更换不同的第三方图片加载库,都不会对已有代码有侵入,大大减少接入成本以及避免不必要的错误。每次升级后,不会修改原来的接口,而在非常必要的情况只可能增加少量的接口。

       SHImageView就是出于以上的考虑,应运而生。SHImageView是尚妆多个产品同时都在使用的图片加载库。一开始,不同产品用着不同的图片加载库,甚至一个产品也用着多套图片加载库,非常不方便管理和排查问题。借着Fresco的出现,开始创建统一的图片加载库,即SHImageView.  SH取自ShowJoy(尚妆)的头两个字母。

       SHImageView抱着简单易用的原则,让业务方写尽量少的代码来实现更多的功能,支持本地图片,网络图片,资源图片,支持webp,gif,支持圆形图。

一、SHImageView的使用


1、aar已上传Jcenter,只要如下gradle依赖即可

compile 'com.showjoy.android:image:1.0.1'

2、首先在application的onCreate里调用init

public class MainApplication extends Application {
    @Override
    public void onCreate() {
       super.onCreate();
        
       SHImageView.init(this);
    }
}

 3、xml布局简单示例

<com.showjoy.image.SHImageView
    android:id="@+id/demo_image_view"
    android:layout_width="150dp"
    android:layout_height="150dp" />

4、直接java代码里动态生成

imageView = new SHImageView(context);

5、设置图片

//网络图片
imageView.setImageUrl("http://t.cn/R5JfqHu");
//gif
//imageView.setImageUrl("http://sdcard/sample/xxx.gif");
//本地图片
//imageView.setImageUrl("file://sdcard/sample/xxx.jpg");
//直接设置res id,其他都不用管
public void setImageRes(int resId);

6、高级功能

//支持自适应宽高,即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/images/6f/6f272a87c964470b9e582bbc18073ffc.png.390x390.webp
// http://cdn1.showjoy.com/images/6f/6f272a87c964470b9e582bbc18073ffc.png.x.webp
interface CompressCallback {
    String getCompressedUrl(String url, int width, int height, boolean png2jpg);
    String getCompressedUrl(String url, boolean png2jpg);
}

7、缓存处理接口

//静态方法,用来手动清除内存里的缓存
SHImageView.clearMemoryCaches();

//静态方法,用来手动清除文件里的缓存
SHImageView.clearDiskCaches();

//静态方法,用来手动清除所有缓存
SHImageView.clearCaches();

8、混淆配置,参照fresco即可

#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>;
}

9、扩展

SHCircleImageView 圆形图片

包含SHImageView的接口,另外包含以下接口

//设置边框颜色
void setBorderColor(int color);

//设置边框宽度
void setBorderWidth(int width);


二、简单介绍SHImageView的实现

1、SHImageView依赖Fresco,支持webp,gif。

2、首先定义接口ISHImageView,定义提供给业务方调用的接口。

3、针对Fresco定义class FrescoImageView implement ISHImageView,实现已定义的接口

4、定义共业务方调用的类SHImageView,继承FrescoImageView。 SHGifImageView和SHCircleImageView同理,继承

FrescoCircleImageView和FrescoGifImageView。

5、日后需要更换图片加载库,只需要针对新的图片加载库定义相应的类ABCImageView实现接口ISHImageView。然后SHImageView 继承ABCImageView即可。


代码在github上,欢迎大家提出宝贵意见

https://github.com/ShowJoy-com/SHImageView


标签: none

评论已关闭