Очистка холста с помощью Canvas.drawColor()

Я пытаюсь изменить фоновое изображение пользовательского представления с некоторым успехом. изображение изменится, но проблема в том, что я все еще вижу следы старого изображения. когда я пытаюсь очистить холст до рисования нового изображения, он не работает. Я создаю растровое изображение для сохранения изображения. при изменении изображения я вызываю Canvas.drawColor() перед рисованием нового изображения, но старое изображение сохраняется. Я попробовал drawColor (0), drawColor (Color.BLACK), c.drawColor(0, PorterDuff.Mode.CLEAR), и ни одно из вышеперечисленных работ не работает. как таковой, я должен был опубликовать это для обзора из более опытных умов, чем мой.

фактический код выглядит следующим образом:

private int bgnd;
private boolean switching;

public void setBgnd(int incoming){
    switching = true;
    switch (incoming){

    case R.drawable.image1:
        bgnd = incoming;
        this.invalidate();
        break;

    case R.drawable.image2:
        bgnd = incoming;
        this.invalidate();
        break;

    }
}



protected void onDraw(Canvas c){
    if(switching == true){
        Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd);
        c.drawColor(0, PorterDuff.Mode.CLEAR);
        c.drawBitmap(b, 0, 0, null);
        switching = false;

    }else{
        Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd);
        c.drawBitmap(b, 0, 0, null);
    }
}

Ответ 1

Как и вы, я изо всех сил пытался очистить верхний слой/поверхность в моем приложении с несколькими слоями/поверхностным видом. После 2-дневного поиска и кодирования я узнал свой собственный способ, и именно так я очистил холст до рисования, вы можете использовать его при наличии нескольких слоев/представлений поверхности. Фоновый слой не будет покрыт черным, т.е. Трюком.

Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR));
canvas.drawPaint(paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
// start your own drawing

Ответ 2

Вам не нужно также вызывать invalidate() из вашего метода onDraw, чтобы изменения, сделанные в этом onDraw, обновлялись на экране?

Недействительный() в вашем коммутаторе вызовет ваш onDraw после вызова setBgnd, но ничего не говорит о том, что он будет перерисовываться после внесения изменений в Canvas.

Ответ 3

Вы можете использовать метод Canvas drawRGB.