2013-03-09 49 views
0

我有一個自定義AdapterView(有點),其中我懶加載圖像。要做到這一點,我使用了令人敬畏的aquery libraryAquery - 高速緩存下采樣版本的圖像

短篇小說:我想緩存(memcache和filecache)下采樣版本的文件。它使添加到我的適配器的速度更快 - 當圖像很小時,在滾動我的AdapterView時沒有滯後。當圖像很大時,即使我使用下采樣,它也會滯後一點。我發現,aquery存儲完整版本的圖像,並在每次撥打電子郵件aq.image(...)時進行縮減採樣。 如何緩存調整後的版本,而不是原來的?


長的故事: 我的適配器視圖在很大程度上依賴於圖像。這些圖像相當大,當適配器項目被實例化時,需要一些時間對其進行縮減採樣,然後添加到列表中。所以我認爲這很好,在滾動時用低分辨率照片實例化項目,並且只在滾動停止時加載高分辨率版本。當我使用兩個獨立的圖像URL(一個用於thumnbail,另一個用於原始圖像)時,它的作用就像一個魅力。但我使用的API非常有限,所以我不會有縮略圖圖像的網址。我必須異步下載大版本,縮小版本,保存大小版本,然後使用我需要的版本。這裏的「短篇故事」開始了。

+0

您是否最終設法使其與水果或你切換到一些替代品? – JanBo 2015-03-09 18:07:32

+0

我現在使用畢加索 – 2015-03-09 18:08:55

+0

我原來從畢加索切換到aquery因爲畢加索會失敗,如果我試圖下載並顯示額外的大圖像(更大的2048px ...沒有做適當的下采樣)...但我可以再次讓它去吧如果你沒有這些問題... – JanBo 2015-03-09 18:11:16

回答

1

我也用AQuery庫在過去,但遇到一些問題,有限的配置和怪異progresbar知名度的問題後,我搬到了Android系統的通用-圖像裝載機

https://github.com/nostra13/Android-Universal-Image-Loader它給你你需要的功能,以及其他很多有用的配置選項。

只需從上到下閱讀本網站 - 您應該可以在一分鐘內運行它。

在你的情況最有趣的線

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
    .memoryCacheExtraOptions(480, 800) // default = device screen dimensions 
    .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75) 
    .discCache(new UnlimitedDiscCache(cacheDir)) // default 
    .discCacheSize(50 * 1024 * 1024) 
    .discCacheFileCount(100) 

您還可以更改緩存的文件名。

+0

謝謝,我會看看。我喜歡AQuery的簡單性,我希望可以用這個庫來做,但我讀了兩個小時的源代碼,找不到任何東西......也許AUIL會更適合我 – 2013-03-09 21:41:15

+0

不幸的是:'memoryCacheExtraOptions(50, 50)'只能在'init'階段設置。我無法以每個文件爲基礎設置縮略圖大小。另外,它似乎並沒有使用我的設置。我將它設置爲(50,50),但位圖仍然是高分辨率。 – 2013-03-09 23:28:19

2

我剛剛發佈了一個名爲droidQuery的開源庫,它是Android的完整端口jQuery。使用比AQuery簡單得多,並提供了更多的配置。要下載圖像並設置輸出大小並緩存小圖像(以每會話/每十分鐘爲基礎),可以使用以下代碼:

final ImageView image = (ImageView) findViewById(R.id.myImage); 
$.ajax(new AjaxOptions(url).type("GET") 
          .dataType("image") 
          .imageHeight(200) 
          .imageWidth(200) 
          .context(this) 
          .cache(true) 
          .cacheTimeout(600000) 
          .success(new Function() { 
           @Override 
           public void invoke($ droidQuery, Object... params) { 
            $.with(image).val((Bitmap) params[0]); 
           } 
          }) 
          .error(new Function() { 
           @Override 
           public void invoke($ droidQuery, Object... params) { 
            droidQuery.toast("could not set image", Toast.LENGTH_SHORT); 
           } 
          }));