마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 SurfaceView 배경이미지 질문입니다.

0 추천
 
 
 
 
class PaintThread extends Thread {
public void run() {
p = new android.graphics.Paint();
p.setColor(android.graphics.Color.RED);
p.setAntiAlias(true);
Bitmap img = BitmapFactory.decodeResource(getResources(), R.drawable.paper);
canvas = mHolder.lockCanvas();
canvas.drawBitmap(img, 0, 0, p);
mHolder.unlockCanvasAndPost(canvas);
while (true) {
try {
if (MainActivity.touch_flag == true) {
if (MainActivity.foot_flag == true) {
try {
canvas = mHolder.lockCanvas();
canvas.drawCircle((float)MainActivity.X, (float)MainActivity.Y, 3, p);
catch (Exception e) {}
finally {
mHolder.unlockCanvasAndPost(canvas);
}
}
}
} catch (Exception e) {}
}
}
}
 
현재 이렇게 구현하여서 비트맵으로 배경을 넣고 그위에 이벤트 발생시마다 플래그를 두어
 
Circle를 그리는데요
 
원이 그려질때마다 배경이 검은색이 됐다가(배경없는상태) 다시 배경이미지가 들어왔다가 식으로
 
계속 깜빡거립니다. 
 
형광등이 막 깜빡거리는것처럼요
 
어떻게 바꿔줘야 배경이 깜빡거리지 않을 수 있을지
 
도움탁드립니다.
 
그리고 혹시 비트맵을 SurfaceView 크기에 맞추려면
어떻게 해야하는지도 알려주시면 감사하겠습니다.
음무 (17,820 포인트) 님이 2013년 11월 27일 질문

1개의 답변

+1 추천
 
채택된 답변
일단 소스에 최적화 및 구조 등등 문제 가있지만.... 논외로 하고

서페이스뷰가 락되고 다시 락이 풀릴때 그리고자 하는 모든 이미지들이 캔버스에 그려져야 합니다.

즉 락되고 언락될때 매번 배경을 넣어주시면 됩니다.

비트맵을 맞추는 방법은 서페이스뷰에 비트맵을 그릴때 left,top 좌표 만으로 그리는게 아니라

렉트클래스를 이용한 방법이 있습니다.

사용은 간단하지만 설명하자면 깁니다. 직접 구글링 해보세요~~!
ThisPlus (46,920 포인트) 님이 2013년 11월 27일 답변
음무님이 2013년 11월 28일 채택됨
매번 배경을 그려주면 문제가 되는것이 .. 배경 말고 Circle를 그리는데 이건 이전에 그려졌던것들이 그대로 남아있어야해서 문제입니다.배경을 매번 새로그려주면 Circle들이 그려저서 이동경로가 표시되는게 아니라 공 하나가 계속 이동하는게 되버려서 ...
도움부탁드립니다.

그리고 최적화 및 구조 문제도 해결하고싶은데 어떤걸 수정해야하는지요
내 그게 지금 서페이스뷰를 잘못 이해 하고 계신겁니다.
써클들을 남아 있게 하고 싶으시다면 써클에 대한 정보를 따로저장해서 다시 그릴때 마다 다시 그려주셔야 합니다.

최적화문제는 글로써 설명드리기가 어려운 부분 이해 바랍니다.
그럼 써클이 수백개가 되면 엄청 느려지지않나요 ? ㅠㅠ
그럼 서피스뷰를 사용하지 않고 그냥 뷰로 온드로우에서 작업하면
제가 원하는 작업을 할 수 있을까요 ?
음~~! 뭐 느려지는 부분은 어쩔수 없습니다.
렌더 하는 객체가 늘어나면 느려지는건 당연한거구요~~!
어떤 써클을 그리시는지 모르겠지만 단순 써클 표시라면 수백개 정도는 너끈히 뽑아 내줍니다.
뷰로 표현시에도 단순히 움직임이 없는 써클의 추가라면 오히려 그쪽이 접근이 더 쉬울 수도 있습니다.
하지만 써클이 움직여야 한다면 퍼포먼스는 굉장히 떨어집니다.
우선, 지속적으로 답변 주셔서 정말 감사합니다.

걸음을 걸을때마다 써클이 하나씩 그려지는 로직에서 사용됩니다.
걸음걸을때마다 써클이 하나씩 추가로 계속 생성되는것인데
많게는 천개까지 써클이 그려질거라 예상됩니다.

만약 써피스뷰가 아니라 일반 뷰를 사용한다면
써피스뷰는 스레드를 돌려 걸음 플래그가 검출될때마다 그려주는데
뷰는 걸음 걸을때마다 어떻게 호출해야하나요 ?

지금 써피스뷰는 써피스뷰를 상속받은 클래스를 하나 만들고
메인액티비티 xml에서 <패키지명.서피스뷰클래스 />
하는 식으로 뷰로 받아와서 사용중인데
뷰는 어떻게 해야하는지 잘 모르겠습니다.
...