將Fresco封裝成簡單易用的SHImageView

Android平臺的圖片加載庫一直隨着時間的推移不斷地冒出來,Universal ImageLoader,Glide,picasso,fresco,每出一個更好的圖片加載庫,都得再接入一遍,並且頗有可能須要修改先前的代碼。封裝就能夠避免每次都修改代碼的問題,業務方無需知道如何實現,只要調用統一不變的接口便可。而封裝後的圖片加載庫能夠作自我升級,更換不一樣的第三方圖片加載庫,都不會對已有代碼有侵入,大大減小接入成本以及避免沒必要要的錯誤。每次升級後,不會修改原來的接口,而在很是必要的狀況只可能增長少許的接口。java

SHImageView就是出於以上的考慮,應運而生。SHImageView是尚妝多個產品同時都在使用的圖片加載庫。一開始,不一樣產品用着不一樣的圖片加載庫,甚至一個產品也用着多套圖片加載庫,很是不方便管理和排查問題。藉着Fresco的出現,開始建立統一的圖片加載庫,即SHImageView. SH取自ShowJoy(尚妝)的頭兩個字母。android

SHImageView抱着簡單易用的原則,讓業務方寫儘可能少的代碼來實現更多的功能。git

1、SHImageView的使用

一、aar已上傳Jcenter,只要以下gradle依賴便可

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

二、首先在application的onCreate裏調用init

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

三、xml佈局簡單示例

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

四、直接java代碼裏動態生成

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便可

#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的接口, 使用方法一致網絡

2、簡單介紹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...

相關文章
相關標籤/搜索