解耦圖片載入庫

tinycoder發表於2019-02-25

背景

在APP開發過程,圖片載入是一個不可或缺的模組,一般我們都會使用比較成熟的開源庫,如Fresco, ImageLoader, Glide等。 這些開源庫也都提供了簡潔的使用方式,使我們可以快速完成圖片的載入過程。但是如果我們需要更換圖片載入庫,就會發現專案中到處都引用了,這無疑是一個龐大的工作量。

為了降低圖片載入圖在專案中的耦合度,特意對圖片載入庫進行了二次封裝。通過這種方式,我們可快速完成圖片載入庫的更換工作。

本次封裝僅包含圖片載入庫的基本功能:

  • 初始化圖片載入庫
  • 顯示圖片(圓角,圓形等樣式)
  • 下載圖片

image

從結構圖中我們可以看出,更換圖片載入庫只需要設定相應的mLoaderInstance即可。

使用

ImageLoaderManager.getInstance().init(getApplicationContext(), new FrescoInstance());
ImageLoaderManager.getInstance().displayImage("http://t.cn/RTRKzUt", image);
複製程式碼

說明

  1. ImageLoaderManager提供了統一的介面,至於初始化中怎樣配置,只需要在相應的Instance中去實現即可;

  2. 如需要封裝其他的圖片載入庫,如Picasso, 只需要實現ImageLoaderInstance介面即可;

  3. 圖片載入庫在載入圖片時都提供了配置項,如設定佔點陣圖,失敗圖,邊框等。這些與View相關的配置是以自定義View的形式實現的;

  4. 由於Fresco載入的目標是SimpleDraweeView,其他的圖片載入庫為ImageView, 為了提供統一的目標物件,我們使用繼承自GenericDraweeView(SimpleDraweeView的父類)的WrapImage作為載入目標。如果你不需要封裝Fresco, 那麼可將WrapImageView的父類改成ImageView;

  5. 專案中提供了高斯模糊的幾種實現方案:Fresco自帶,FastBlur演算法,RenderScript。具體的效果可執行專案進行檢視。說一下這幾種方案使用過程中的感受:

  1. Fresco提供的高斯模糊效果算是這3種方案中最好的,穩定,顯示效果細膩;
  2. FastBlur演算法,雖然可通過縮放Bitmap來提高轉換效率,但顯示效果不如Fresco;
  3. RenderScript雖然是Android提供的,但是使用體驗並不好,在ImageLoader中使用,模糊效果顯示異常。在Glide中使用時,對Bitmap縮放後模糊效果顯示異常。同時由於有些廠商對這一功能進行了閹割,使用時需要新增so庫,為了版本的相容性,還需要引入v8的相容包。

高斯模糊效果是一個很耗效能的一個操作,很容易引起OOM,所以在使用時應將Bitmap儘可能的縮小,同時選擇一個穩定的實現方式。

專案地址:

ImageloaderManager

總結

此專案旨在介紹這種封裝的思想,至於細節方面就交給各位小夥伴了,畢竟很少有APP會同時使用多個圖片載入庫。

相關文章