0

哇,这是令人沮丧的。我真的只是试图在每次画画前清除我的ImageView从以前的onDraw调用ImageView中恢复画布

我试图将Android的ImageView类扩展为自定义StatusBarImageView。我提供了一个公共方法setPercentComplete(float percent),以便我的活动可以相应地更新图像。但是,每次尝试通过使图像失效并触发它的方法来更新图像时,出于某种原因,它会尝试在现有图像上绘制新状态栏及其文本,而不是重新开始。所以我使用canvas.drawText(...)绘制的字幕互相流血。

任何人都可以告诉我为什么发生这种情况/如何解决它?

我试过了几种不同的方法,但都没有工作。

我试图拯救我第一次在绘制之前和以后每次之前恢复,但显然它的每一次新的画布onDraw()方法火灾,所以restore()抛出一个异常,有一直没有save()

我试过使用canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR),但不仅如此,它会将背景由于某种原因更改为纯黑色。

这里是我的代码:

class StatusBarImageView extends ImageView { 
    private float status = 100.0f; 
    private Canvas lastCanvas; 
    private Paint imagePainter = new Paint(); 
    private Paint textPainter = new Paint(); 

    public StatusBarImageView(Context context) { 
     super(context); 
     initializePainters(); 
    } 
    public StatusBarImageView(Context context, AttributeSet attributes) { 
     super(context, attributes); 
     initializePainters(); 
    } 

    public StatusBarImageView(Context context, AttributeSet attributes, int defStyle) { 
     super(context, attributes, defStyle); 
     initializePainters(); 
    } 

    private void initializePainters() { 
     this.status = 100.0f; 
     this.imagePainter.setStyle(Style.FILL_AND_STROKE); 
     this.textPainter.setStyle(Style.FILL); 
     this.textPainter.setFakeBoldText(true); 
    } 

    public void setPercentComplete(float status) { 
     this.status = status; 
     this.invalidate(); 
    } 

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

     //Erase previous status bar and its text captions before drawing new one 
     if(this.lastCanvas != null) { 
      this.lastCanvas.restore(); //throws exception 
      //this.lastCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // Doesn't work and makes background black 
     } 
     canvas.save(); 
     this.lastCanvas = canvas; 
     //this.canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // Doesn't work and makes the background black 
     //this.canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY); // Same problem 

     this.drawStatusBarAndCaptions(canvas); //Uses canvas.drawRect and canvas.drawText 
    } 

    //... 
} 

而且xml只是看起来像:

<my.package.name.then.StatusBarImageView 
     android:id="@+id/status_bar" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:padding="0dp" 
     android:layout_margin="0dp" 
     android:layout_weight="3"/> 
+1

每次'的onDraw()'运行,你”重新传递了一个新的“空白”Canvas。没有必要尝试清除之前的抽奖,或者在那里进行保存/恢复舞蹈。只需使用当前值绘制你的东西。 –

+0

嗯......也许'画家'类变量是我的问题?我试图抹去以前的抽签的唯一原因,是因为他们出于某种原因而坚持。我的新图纸只是添加在他们之上。也许我每次都必须使用新的Painter对象? – SnoopDougg

+1

那么,'Paint'对象不会那样做。你是否设置了“ImageView”的图像? 'drawStatusBarAndCaptions()'做了什么,到底是什么? –

回答

0

但每次我尝试无效,并触发它的onDraw(Canvas canvas)方法来更新图像。

那么,这是它应该工作的方式。任何invalidate()最终都会导致onDraw()被调用。

为了达到你的要求,你可以保持一个布尔值,这将表明您是否当前onDraw()之后setPercentComplete()呼叫发起:

 


    private boolean flag = false; 

    public void setPercentComplete(float status) { 
     this.status = status; 
     this.flag = true; 
     this.invalidate(); 
    } 

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

     if (flag) { 
      flag = false; 
      // perform actions for showing percent status 
     } else { 
      // draw other stuff 
     } 
    } 

 
+0

对不起,我想也许我的问题措辞不佳。我故意通过使视图无效触发'onDraw'方法,但我希望画布每次都是空白的。相反,我看到之前我画的那些东西,从抽签到抽牌......如果这是有道理的。 – SnoopDougg

+0

我明白你的意思了。我不确定这是否是特别针对您的问题的答案。如果你想删除你的问题,请ping我删除我的答案。 – azizbekian