从之前调用onDraw for ImageView恢复画布

时间:2017-05-27 02:29:10

标签: java android android-imageview android-canvas android-custom-view

哇,这很令人沮丧。我真的只是想在每次画画之前清除ImageView

我尝试将Android ImageView课程扩展为自定义StatusBarImageView。我提供了一个公共方法setPercentComplete(float percent),以便我的活动可以相应地更新图像。但每当我尝试通过使图像无效并触发它的onDraw(Canvas canvas)方法来更新图像时,由于某种原因它会尝试在现有图像的顶部绘制新的状态栏及其文本而不是开始新鲜。因此,我使用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 个答案:

答案 0 :(得分: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
        }
    }