簡體   English   中英

滾動視圖中的大畫布/位圖還是在滾動時重繪畫布? 用什么方法更快,也可以避免java.lang.OutOfMemoryError

[英]Large Canvas/Bitmap in Scrollview or redraw Canvas on scroll? What way is faster and also avoids java.lang.OutOfMemoryError

我有一個已知的問題,我的位圖/畫布太大,會引發java.lang.OutOfMemoryError。 我的問題是最適合我的需求。 畫布應該繪制一個圖形(具有給定的點),並且可以很寬(例如3000px以上,從理論上講,它的寬度可以更大,例如20000px)。 高度是固定的。 因為多數民眾贊成在任何屏幕上,我都將其放在Scrollview中,然后將整個圖形繪制到畫布中。 所以多數民眾贊成在位圖,我得到的錯誤。 第二種可能性是固定大小的畫布,其中我編寫了一個“ onScroll”方法,該方法根據用戶滑動來重繪圖形。 因此,它只會繪制圖形的一部分。 那是更好的方法還是有辦法使首選方法起作用? 無論如何,請給我一些提示和解決方案的示例代碼。

這是代碼:

Bitmap bitmap  = Bitmap.createBitmap(speedCanvasWidth,speedCanvasHeight,Bitmap.Config.RGB_565); //I also tried ARGB_8888
speedCanvas    = new Canvas(bitmap);
graph.setImageBitmap(bitmap);

提前致謝

您可以使用BitmapRegionDecoder處理此BitmapRegionDecoder 只需創建一個指向您的圖像的實例即可。 系統將在圖像上保留一個句柄,然后您可以根據要在畫布中顯示的矩形在解碼器上調用decode 畫布的更新將必須根據您的需要進行處理。 這將有助於防止加載您必須處理的大圖像。

您可以通過檢查位圖信息來進一步獲取有關位圖的詳細信息。 這可以通過加載位圖與內存中完成BitmapFactory.Options用於設置為true標志inJustDecodeBounds 這樣可以避免在檢查過程中將位圖實際加載到內存中。

例如,可以使用以下方法進行快速檢索:

BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance("pathToFile", true);
Bitmap regionOfInterestBitmap = decoder.decodeRegion(rectWithinImage, null);//Or with options you have decided to load.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM