2014-01-10 41 views
0

我想將ArrayList中包含的許多小型位圖合併爲一個大型位圖。Android將許多位圖合併爲一個大的位圖出錯並且無法回收位圖

但是,我不知道爲什麼大的位圖是循環的。這意味着它似乎只複製數組中的第一個元素。我試圖繪製數組中的每個小的位圖來測試,它工作正常,但是當我像下面的代碼一樣運行循環時,它出錯了。

在addiditon,當我添加了bmp.recycle()bmp = null,它會導致錯誤「試圖使用回收的位圖」。我不明白錯誤發生的原因。

你能幫我嗎,謝謝!

public static Bitmap getBitmapForVisibleRegion(WebView webview) { 
     Bitmap returnedBitmap = null; 
     webview.setDrawingCacheEnabled(true); 
     returnedBitmap = Bitmap.createBitmap(webview.getDrawingCache()); 
     webview.setDrawingCacheEnabled(false); 
     return returnedBitmap; 
    } 


public void CombineBitmap(){ 
    ArrayList<Bitmap> bmps = new ArrayList<Bitmap>(); 
    for (int i = 0; i < webView.getWidth; i+=needToCapture){ 
    bmps.add(getBitmapForVisibleRegion(webView)); 
    webView.scrollBy(needToCapture, 0); 

    } 

      Bitmap bigbitmap = Bitmap.createBitmap(largeBitmapWidth, largeBitmapHeight, Bitmap.Config.ARGB_8888); 
      Canvas bigcanvas = new Canvas(bigbitmap); 

      Paint paint = new Paint(); 
      int iWidth = 0; 

      for (int i = 0; i < bmps.size(); i++) { 
       Bitmap bmp = bmps.get(i); 
       bigcanvas.drawBitmap(bmp, iWidth , 0, paint); 
       iWidth +=bmp.getWidth(); 

       bmp.recycle(); 
       bmp=null; 
      } 
} 
+0

bigcanvas.drawBitmap(bmp,iWidth,0,paint);在這裏,你使用bmp對象在畫布中繪製,並且在一行之後,你正在回收它bmp.recycle(); //這就是爲什麼它給你錯誤「嘗試使用回收的位圖」。 –

+0

我能猜到的唯一問題是您在List bmp中多次添加相同的位圖。 –

+0

@SherifelKhatib:我檢查了數組中的每個位圖,它們完全不同。那麼,爲什麼我會遇到這個問題? – lolyoshi

回答

1

我終於找到了我的問題,更換

returnedBitmap = Bitmap.createBitmap(webview.getDrawingCache()); 

。這是因爲我的虛假錯誤。

我必須使用scrollTo代替scrollBy

後,我改變scrollTo,一切工作正常。這真的是一個有用的經驗。

0

根據Bitmap.createBitmap(位圖)的文檔,

返回從源位圖的不可變位圖。新的位圖可能與源相同,或者可能已經創建了副本。它與相同密度的原bitmap.`

初始化因此,

returnedBitmap = webview.getDrawingCache().copy(Config.ARGB_8888, false); 
+0

但我甚至打印出陣列中的所有位圖,我確定它們不同,所以爲什麼我需要替換代碼? – lolyoshi

+0

因爲如果你得到的是與源相同的實例,當你這樣做'webview.setDrawingCacheEnabled(false);'時,它會被回收。因此,您應該確保通過替換代碼來獲得新實例。 –

+0

好的,我明白了。讓我儘快告訴你結果 – lolyoshi

相關問題