Очистка холста с помощью 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); } } 

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

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

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

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

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