2011-01-10 2 views
11

사용자 뷰의 배경 이미지를 약간의 변경으로 변경하려고합니다. 이미지가 바뀌지 만 문제는 여전히 오래된 이미지의 흔적을 볼 수 있다는 것입니다. 새 이미지를 그리기 전에 캔버스를 지우려고하면 작동하지 않습니다. 나는 이미지를 저장할 비트 맵을 생성한다. 이미지를 변경할 때 새로운 이미지를 그리기 전에 Canvas.drawColor()를 호출하지만 이전 이미지는 계속됩니다. 내가 drawColor (0), drawColor (Color.BLACK), c.drawColor (0, PorterDuff.Mode.CLEAR) 시도하고 위의 작품 중 아무도. 그랬듯이, 나는 경험이 많은 사람들이 나의 것보다 검토 할 수 있도록 게시해야만했다.Canvas.drawColor()로 캔버스 지우기

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); 
    } 
} 

답변

30

필자와 마찬가지로, 필자는 다중 레이어/표면보기 앱에서 최상위 레이어/표면보기를 지우는 방법에 어려움을 겪었습니다. 2 일간의 검색 및 코딩 작업을 마친 후, 나는 내 자신의 방식을 알았고 이것은 드로잉 전에 캔버스를 지우는 방법입니다. 다중 레이어/표면 뷰를 가질 때 사용할 수 있습니다. 배경 레이어는 검은 색으로 덮히 지 않습니다. 즉 트릭입니다.

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

나는 그것이 내가 여기에 도착하는 데 2 ​​분이 걸리는 것에 비해 2 일 이상 걸릴 것이라고 생각한다. Thx strangeInAStrangerLand + longdooooo –

2

당신은 또한 당신의 onDraw 메소드 내에서 무효화()를 호출 할 필요가 없습니다 된 onDraw에서 변경 한 화면에 업데이트되도록, 다음과 같이

실제 코드는?

setBgnd를 호출 한 후에 스위치의 invalidate()가 onDraw를 호출하지만 Canvas를 변경 한 후에 다시 그리기 할 필요가 없습니다.

+1

invalidate()를 호출하면보기에서 onDraw()를 호출하고 그 자체를 그려주는 느낌이 들게됩니다. 그 호출을 메서드에 넣는 것은 그 예가 다음과 같이 영원히 반복되도록합니다. http://www.anddev.org/basic_and_simple_2d_drawing_-_animation-t3085.html – Prmths

+0

아, 네 말이 맞았 어. 찾아보기, http://developer.android.com/guide/topics/graphics/index.html. 죄송합니다. 제 이해가 정확하지 않았습니다. – C0deAttack

+0

처음에는 생각했습니다. 나에게 묻는 질문은, invalidate()가 뷰에 자신을 다시 그려 넣는다 고 말하면 왜 나중에 애니메이션으로 옮길 때까지이 뷰가 완전히 다시 그려지지 않는가? 개체의 아래쪽 절반은 오른쪽으로 보이지만 나머지 절반은 여전히 ​​오래된 표면입니다. – Prmths

2

캔버스의 방법 drawRGB을 사용할 수 있습니다.

+0

drawRGB()는 알파 채널을 지우지 않고 비트 맵이 불투명 해 지므로 비트 맵이 유일한 레이어이거나 배경 레이어 인 경우에만 사용할 수 있습니다. 또한 drawARGB() 메서드가있어 알파 채널도 처리 할 수 ​​있습니다. 그래도 작동한다면 시도하지 않았습니다. –

+1

drawRGB는'drawColor (Color.rgb (r, g, b))'를 사용합니다. – TameHog