天天看點

使用ImageLoader顯示圓角圖檔、圓形圖檔、加載drawable的BUG

在經過幾年的經驗累積之後,我終于決定整理一下曾經遇到的各種問題,給各位走在Android開發路上的朋友一點幫助,更多相關問題,請通路我的部落格:http://blog.csdn.net/xiaoliluote 如果您對該問題有更多的解決方式,請留言,驗證之後我會編輯部落格

ImageLoader是目前加載圖檔非常好用的一個第三方架構,下面我來介紹一下在實際操作過程中非常常用的幾個邏輯。

1.将圖檔切成圓角、圓形

DisplayImageOptions options = new DisplayImageOptions.Builder().showStubImage(R.drawable.icon_stub) //設定圖檔下載下傳期間顯示的圖檔
                .showImageForEmptyUri(R.drawable.icon_empty) // 設定圖檔Uri為空或是錯誤的時候顯示的圖檔
                .showImageOnFail(R.drawable.icon_error) // 設定圖檔加載或解碼過程中發生錯誤顯示的圖檔
                .cacheInMemory(true) // 設定下載下傳的圖檔是否緩存在記憶體中
                .cacheOnDisc(true) // 設定下載下傳的圖檔是否緩存在SD卡中
                .displayer(new RoundedBitmapDisplayer()) // 設定成圓角、圓形圖檔,我這裡将new RoundedBitmapDisplayer的參數設定為,就是圓形圖檔,其他角度可以根據需求自行修改
                .build(); // 建立配置過得DisplayImageOption對象
           

2.加載本地drawable的圖檔

//這裡先假設你已經初始化過ImageLoader了
ImageView test =(ImageView)findViewById(R.id.test);
ImageLoader loader = ImageLoader.getInstance();
loader.displayImage("drawable://"+R.drawable.ic_launcher,test); //第一個參數寫 drawable:// 再加上圖檔的id,
//就可以顯示本地drawable圖檔了,但是ImageLoader架構在
//這裡有一個BUG,請檢視第三點
//顯示圖檔的這個方法,還支援傳入設定參數的,因為一般我們在初始化
//ImageLoader的時候,做的設定不會對圖檔進行圓角裁剪,
//畢竟不是所有圖檔都要做圓角嘛,就像下面這個設定一樣
if (!ImageLoader.getInstance().isInited()) {
            // 初始化ImageLoader
            @SuppressWarnings("deprecation")
            DisplayImageOptions options = new DisplayImageOptions.Builder().showStubImage(R.drawable.icon_stub) // 設定圖檔下載下傳期間顯示的圖檔
                    .showImageForEmptyUri(R.drawable.icon_empty) // 設定圖檔Uri為空或是錯誤的時候顯示的圖檔
                    .showImageOnFail(R.drawable.icon_error) // 設定圖檔加載或解碼過程中發生錯誤顯示的圖檔
                    .cacheInMemory(true) // 設定下載下傳的圖檔是否緩存在記憶體中
                    .cacheOnDisc(true) // 設定下載下傳的圖檔是否緩存在SD卡中
                    .build(); // 建立配置過得DisplayImageOption對象
            ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()).defaultDisplayImageOptions(options)
                    .threadPriority(Thread.NORM_PRIORITY - ).denyCacheImageMultipleSizesInMemory()
                    .discCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.LIFO).build();
            ImageLoader.getInstance().init(config);
        }
 //上面是一個比較常見的ImageLoader初始化的參數設定,
 //是沒有對圖檔進行圓角裁剪的,但現在我們有的圖檔
 //需要進行圓角裁剪,怎麼辦呢?又不能再次初始化參數,
 //這也不合理,于是我們可以在displayImage方法裡面通過
 //參數來對需要圓角裁剪的ImageView進行單獨的參數設定,就像下面這樣:
DisplayImageOptions options = new DisplayImageOptions.Builder().showStubImage(R.drawable.icon_stub) // 設定圖檔下載下傳期間顯示的圖檔
                .showImageForEmptyUri(R.drawable.icon_empty) // 設定圖檔Uri為空或是錯誤的時候顯示的圖檔
                .showImageOnFail(R.drawable.icon_error) // 設定圖檔加載或解碼過程中發生錯誤顯示的圖檔
                .cacheInMemory(true) // 設定下載下傳的圖檔是否緩存在記憶體中
                .cacheOnDisc(true) // 設定下載下傳的圖檔是否緩存在SD卡中
                .displayer(new RoundedBitmapDisplayer()) // 設定成圓角圖檔
                .build(); // 建立配置過得DisplayImageOption對象

ImageLoader loader = ImageLoader.getInstance();
loader.displayImage("drawable://"+R.drawable.ic_launcher,test,options); //在這裡再多傳入一個參數 options,
//就可以單獨使用不同的設定啦
           

3.使用ImageLoader加載本地drawable圖檔的一個坑

//就像我第二點所說的常用的ImageLoader的初始化設定一樣,
//大多數人都會加上 .cacheInMemory(true) 和.cacheOnDisc(true)
//這兩個設定,進而給圖檔做緩存處理,提高程式的相應效率,
//這是無可厚非的,但是在加載本地drawable的時候,
//請記得一定要重新設定DisplayImageOptions,并将.cacheInMemory(true) 
//和.cacheOnDisc(true) 改為 .cacheInMemory(false) 和.cacheOnDisc(false),
//否則的話,當你有多個地方使用ImageLoader來
//加載drawable的時候,你就會發現顯示出來的圖檔,
//和你代碼寫的居然不一樣!!!
//這與ImageLoader的緩存機制有關,将圖檔ID從R檔案
//讀取出來之後,ImageLoader又自己做了一個ID處理,
//當使用多個drawable的時候,會有ID重疊了,
//就導緻了可能部分加載的圖檔和你代碼設定的不一緻,
//這個BUG我送出過到ImageLoader的github上,
//但似乎并沒有人處理,官方甚至打算忽略這個BUG,
//并提示使用者:不建議使用ImageLoader來加載本地drawable
//如果你已經使用ImageLoader來加載drawable,
//并且已經出現了上述問題,才來觀看我的部落格的話,
//可能會出現你即使更改了代碼,但運作效果依然
//沒有變化的結果哦,這是因為之前已經有過緩存到APP了,
//解決辦法有兩個:
不要直接運作覆寫APP,先把已經安裝的解除安裝掉(要清空資料緩存哦)
在代碼準備加載圖檔前,清空ImageLoader的緩存
loader.clearDiscCache();
loader.clearMemoryCache();
           

繼續閱讀