2011-09-16 95 views
1

我試圖在一個onDraw()方法中保存Canvas對象。 這是因爲我在onDraw方法中使用了foreach循環,導致: canvas.DrawText(textitem,x,y,textpaint);
(我必須這樣做,因爲IM周圍繪製一個蒙面區域中的文本)在onDraw()中保存畫布;

什麼即時通訊正試圖是這樣的:

@Override 
public void onDraw(Canvas canvas) 
{ 
if (hasrun = false) 
     { 
      for(CustomTextViewDrawItem item : drawItemList) 
      { 
       canvas.drawText(item.Text, item.X, item.Y, textPaint); 
      } 

      if (eLabel.backgroundGradient != null) 
      { 
       canvas.drawPath(path, fillPaint); 
      } 
      canvas.save(); 
      savedCanvas = canvas ; 
     } 
     else 
     { 
      canvas = savedCanvas; 
     } 

     hasrun = true; 
     super.onDraw(canvas); 
} 

調試,當我看到它看起來不錯,但出來空。 什麼是最好的方式來得到這個工作?

+0

你怎麼從保存期望()函數?也許你誤解了它是如何工作的。 –

+0

是的老鼠是對的,我想你誤解了canvas.save()。 – user370305

+0

你想要做什麼?請將您添加'Canvas'的地方發佈到您的活動中,以及如何聲明兩個畫布字段。 –

回答

0

你可以嘗試保存位圖:(我認爲這是更好地調用super.onDraw(畫布);在該方法開始時,因爲您的視圖相關圖紙將在頂部)

 

@Override 
public void onDraw(Canvas canvas) 
{ 
     super.onDraw(canvas); 
     if (savedBitmap==null){ 
      savedBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Config.ARGB_8888); 
      Canvas canvasToSave = new Canvas(savedBitmap) 
      for(CustomTextViewDrawItem item : drawItemList){ 
       canvasToSave.drawText(item.Text, item.X, item.Y, textPaint); 
      } 

      if (eLabel.backgroundGradient != null){ 
       canvasToSave.drawPath(path, fillPaint); 
      } 
     } 
     canvas.drawBitmap(savedBitmap, 0, 0, new Paint()); 
} 
 
+0

謝謝,這種方法似乎工作正常。但它確實會導致新的問題。 OutofMemoryError的確切點。 對於此過程,外部分配太大。 很多位圖分配我猜。 另外,有點奇怪,當我把super.Ondraw(畫布)放在開頭時,背景繪製得很好,但文字不會? 按預期工作......爲什麼會這樣? – ron

+0

你是否使用你的代碼hasrun = false仍然,那麼它應該hasrun == false –

+0

不,我已經刪除了那部分。 檢查位圖now – ron

2

也許就是因爲這樣的:你打算這樣做,而不是

if (hasrun = false) 

我想:

if (hasrun == false) 
+0

謝謝:)這顯然是一個問題。 – ron

+0

這就是我總是寫'if(false == hasrun)'=)的原因 –