Android 圖片加載之ImageLoad封裝

前言

圖片加載在我們平時的項目開發(fā)當(dāng)中經(jīng)常會用到,為了可以更好的在項目當(dāng)中復(fù)用圖片加載功能,把它封裝成一個通用的庫是很有必要的。

使用
效果圖.png
 ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(url).isCircle(true).imageView(imageViewOne).build());
 ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(urlTwo).isGray(true).imageView(imageViewTwo).build());
 ImageLoadProxy.getInstance().load(new ImageLoadConfiguration.Builder(this).url(urlThree).imageHeight(1400).imageWidth(1600).imageView(imageViewThree).build());

三個請求分別實現(xiàn)三張圖片的效果,第一張圖片是圓角,第一張是圖片變灰,第三張是設(shè)置圖片顯示的寬高

實現(xiàn)

主要由三個類組成

//圖片代理類
ImageLoadProxy

//圖片參數(shù)配置類
ImageLoadConfiguration

//圖片加載接口類
ImageLoad

首先來看看ImageLoadProxy類

public class ImageLoadProxy {

    private static ImageLoadProxy mInstance;
    private ImageLoad mImageLoad;

    public static ImageLoadProxy getInstance() {
        if (mInstance == null) {
            synchronized (ImageLoadProxy.class) {
                if (mInstance == null) {
                    mInstance = new ImageLoadProxy();
                }
            }
        }
        return mInstance;
    }


    private ImageLoadProxy() {
        mImageLoad = new GlideImageLoad();
    }

    public void load(ImageLoadConfiguration imageLoadCfg) {
        mImageLoad.load(imageLoadCfg);
    }

ImageLoadProxy使用了單例模式,有個全局屬性ImageLoad,ImageLoad是個接口,它的實例對象是在構(gòu)造方法當(dāng)中實現(xiàn)的

public ImageLoadProxy() {
      mImageLoad = new GlideImageLoad();
}

ImageLoad接口有個load方法,接口的實現(xiàn)類GlideImageLoad會重寫load方法來加載圖片,ImageLoadProxy的load方法內(nèi)部就是調(diào)用了ImageLoad的load方法,我們來看看實現(xiàn)類GlideImageLoad

public class GlideImageLoad implements ImageLoad {

    @Override
    public void load(ImageLoadConfiguration imageLoadCfg) {
        GlideManager.load(imageLoadCfg);
    }
}

GlideManager.load(imageLoadCfg) 就是通過Glide庫加載圖片

ImageLoadProxy的load方法有個ImageLoadConfiguration參數(shù),我們來看看ImageLoadConfiguration類

public class ImageLoadConfiguration {

    public final Context context;
    public final ImageView imageView;
    public final String url;
    public final int defaultImageResId;
    public final boolean isCircle;
    public final boolean isGray;
    public final int imageWidth;
    public final int imageHeight;

    public ImageLoadConfiguration(Builder builder) {
        context = builder.context;
        imageView = builder.imageView;
        url = builder.url;
        defaultImageResId = builder.defaultImageResId;
        isCircle = builder.isCircle;
        isGray = builder.isGray;
        imageWidth = builder.imageWidth;
        imageHeight = builder.imageHeight;
    }

    public static final class Builder {

        private Context context;
        private ImageView imageView;
        private String url;
        private int defaultImageResId;
        private boolean isCircle;
        private boolean isGray;
        private int imageWidth;
        private int imageHeight;

        public Builder(Context context) {
            this.context = context;
        }

        public Builder url(String url) {
            this.url = url;
            return this;
        }

        public Builder defaultImageResId(int defaultImageResId) {
            this.defaultImageResId = defaultImageResId;
            return this;
        }

        public Builder isCircle(boolean isCircle) {
            this.isCircle = isCircle;
            return this;
        }

        public Builder isGray(boolean isGray) {
            this.isGray = isGray;
            return this;
        }

        public Builder imageWidth(int imageWidth) {
            this.imageWidth = imageWidth;
            return this;
        }

        public Builder imageHeight(int imageHeight) {
            this.imageHeight = imageHeight;
            return this;
        }

        public Builder imageView(ImageView imageView) {
            this.imageView = imageView;
            return this;
        }

        public ImageLoadConfiguration build() {
            return new ImageLoadConfiguration(this);
        }

    }

ImageLoadConfiguration使用了Builder模式,可以自由的去組裝不同的屬性,然后根據(jù)屬性值來實現(xiàn)圖片加載的不同效果(實現(xiàn)模塊的三個不同的調(diào)用就是案例)。

結(jié)束語

供業(yè)務(wù)層調(diào)用的ImageLoadProxy類是個代理類,它并沒有去做加載圖片的功能,而是使用ImageLoad接口的實現(xiàn)類來加載圖片,這樣做的好處是如果以后要使用其他開源庫去加載圖片,可以重新創(chuàng)建一個ImageLoad接口的實現(xiàn)類來加載圖片,符合設(shè)計模式的開閉原則。

ImageLoadProxy,ImageLoad,ImageLoadConfiguration 三個類各司其職,
ImageLoadConfiguration 負(fù)責(zé)參數(shù)的配置,
ImageLoad 負(fù)責(zé)圖片的加載,
ImageLoadProxy 負(fù)責(zé)調(diào)度

符合設(shè)計模式的單一職責(zé)原則,各自負(fù)責(zé)各自的功能

具體代碼實現(xiàn) https://github.com/chenpengfei88/ImageLoad

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,881評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評論 19 139
  • 第一次聽王杰《忘了你,忘了我》這首歌的時候,只覺得這旋律悠揚(yáng),有種不舍的無奈。但是沒有斟酌這六個字的深意。 忘了你...
    代峰語閱讀 1,423評論 0 0
  • 再度睜開雙眼的時候,葉沉已經(jīng)置身在溫暖,柔軟的巨大單人床之上。 四周充斥著溫暖、柔和的亮光 “醒了?”一道嬌媚的女...
    Iris小公舉閱讀 633評論 0 2
  • 我旅行至一個未知的世界,這里主要分三個種族,鼠類,人類,海妖類。 至于我怎么來到這個地方的,已經(jīng)不太記得了。 不過...
    chajn閱讀 404評論 2 1

友情鏈接更多精彩內(nèi)容