2011-09-16 134 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)'=)的原因 –