解耦圖片加載庫

在APP開發過程,圖片加載是一個不可或缺的模塊,通常咱們都會使用比較成熟的開源庫,如Fresco, ImageLoader, Glide等。 這些開源庫也都提供了簡潔的使用方式,使咱們能夠快速完成圖片的加載過程。可是當咱們須要更換圖片加載庫時,卻發現這是一項艱鉅的任務。git

目標

爲了減少更換圖片加載庫的的工做量,咱們須要下降圖片加載庫的耦合度,經過封裝的形式爲應用提供統一的使用接口。github

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

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

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儘量的縮小,同時選擇一個穩定的實現方式。ide

項目地址

ImageloaderManager性能

總結

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

相關文章
相關標籤/搜索