2011-06-01 77 views
1

我創建了自定義ImageView,並且在其onDraw方法中,我需要根據用戶交互(如觸摸)繪製一些位圖。一切工作正常,但速度緩慢,因爲我開始添加越來越多的位圖,應用程序真的變慢了。通過調用onDraw來頻繁刷新自定義ImageView的優化

這是我在我的自定義的ImageView

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    Log.e(TAG, "onDraw called"); 

    for (int i=0; i < bitmapList.size(); i++){ 
     drawBitmap(canvas, bitmapList.get(i)); 
    } 
} 

的onDraw做正如你所看到的,我重畫所有的位圖中列出每次的onDraw時,位圖的數量超過說4自然叫-5操作變得非常昂貴並且降低了應用程序的速度。

對此問題的任何解決方案如何優化?

  1. 可以在不同線程中調用drawBitmap使操作更便宜嗎?

  2. 有沒有辦法保留上一個畫布的副本,然後簡單地在onDraw中恢復它,而不是再次繪製所有的位圖?

  3. 這個問題基本上是刷新視圖上的大量動態圖像和它的優化。

+0

嗨普拉你有這個問題的解決方案,我也面臨同樣的問題。請分享你的發現。 – Arpana 2014-08-05 19:33:58

回答

3

您應該創建一個Bitmap其大小必須等於ImageView的圖像尺寸和借鑑一切從bitmapList位圖上此位圖只有一次。在每個onDraw()調用你應該只繪製這個位圖。當bitmapList更改時,必須重新創建此附加位圖。

+0

感謝您的迴應,我嘗試了它,但確實提高了性能,但是使用traceview顯示現在創建bufferCanvas的方法需要時間。雖然這提高了性能,但現在我不需要每次調用onDraw時都繪製所有位圖,但在需要刷新緩衝區時仍然很慢。 – PravinCG 2011-06-01 14:57:27

+0

您可以嘗試在每次需要刷新時創建新的緩衝區,並且可以從單獨的線程執行此操作。認爲它會讓你的應用運行得更快。 – Michael 2011-06-01 15:35:29

1

你可以使用一個後備緩衝圖像所有的圖像繪製成每當更改,然後只繪製後備緩衝圖像顯示在畫面中的onDraw()

// create backbuffer and draw it as seldom as possible 
final Bitmap bufferBitmap = Bitmap.createBitmap(320, 240, Bitmap.Config.ARGB_8888); 
final Canvas bufferCanvas = new Canvas(bufferBitmap); 
for (int i=0; i < bitmapList.size(); i++){ 
    drawBitmap(bufferCanvas, bitmapList.get(i)); 
    } 

// draw the buffered image as often as needed 
canvas.drawBitmap(bufferBitmap ...); 
+0

...與@Pixie給你的基本相同的答案.. :) – 2011-06-01 09:57:51