从以前的onDraw调用ImageView中恢复画布
哇,这是令人沮丧的。我真的只是试图在每次画画前清除我的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"/>
但每次我尝试无效,并触发它的
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
}
}
对不起,我想也许我的问题措辞不佳。我故意通过使视图无效触发'onDraw'方法,但我希望画布每次都是空白的。相反,我看到之前我画的那些东西,从抽签到抽牌......如果这是有道理的。 – SnoopDougg
我明白你的意思了。我不确定这是否是特别针对您的问题的答案。如果你想删除你的问题,请ping我删除我的答案。 – azizbekian
每次'的onDraw()'运行,你”重新传递了一个新的“空白”Canvas。没有必要尝试清除之前的抽奖,或者在那里进行保存/恢复舞蹈。只需使用当前值绘制你的东西。 –
嗯......也许'画家'类变量是我的问题?我试图抹去以前的抽签的唯一原因,是因为他们出于某种原因而坚持。我的新图纸只是添加在他们之上。也许我每次都必须使用新的Painter对象? – SnoopDougg
那么,'Paint'对象不会那样做。你是否设置了“ImageView”的图像? 'drawStatusBarAndCaptions()'做了什么,到底是什么? –