Очистка холста с помощью Canvas.drawColor () - PullRequest
12 голосов
/ 10 января 2011

Я пытаюсь изменить фоновое изображение пользовательского просмотра с некоторым успехом.изображение изменится, но проблема в том, что я все еще вижу следы старого изображения.когда я пытаюсь очистить холст перед рисованием нового изображения, оно не работает.Я создаю растровое изображение для хранения изображения.при смене изображения я вызываю 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);
    }
}

Ответы [ 4 ]

30 голосов
/ 09 августа 2011

Как и вы, я изо всех сил пытался очистить верхний слой / вид поверхности в моем приложении с несколькими слоями / вид поверхности.После 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 голосов
/ 10 декабря 2011

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

2 голосов
/ 10 января 2011

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

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

0 голосов
/ 23 августа 2018

Я только что столкнулся с этой проблемой.

Я решаю ее, повторяя «..Drawxxx (); Post ();» как минимум 3 раза, это работает хорошо.

Я думаю,«Двойная буферизация» является причиной, иногда это «тройная буферизация». Нам нужно повторить наш рисунок, чтобы убедиться, что каждый «буфер» обновлен.

...