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

SurfaceView 질문드립니다.

0 추천
class PaintThread extends Thread {
public void run() {
while (flag) {
try {
try {
p = new android.graphics.Paint();
p.setColor(android.graphics.Color.RED);
p.setAntiAlias(true);
Log.d("fureun", "글기");
canvas = mHolder.lockCanvas();
canvas.drawCircle(360, 640, 3, p);
} finally {
mHolder.unlockCanvasAndPost(canvas);
}
 
 
} catch (Exception e) {
Log.e("fureun", e.toString());
}
}
}
}
서피스뷰 생성시 실행되는 스레드입니다.
 
소스에서 로그 찍은부분은 반복출력됩니다.
 
그런데 빨간색 원이 그려지지가않습니다.
 
이유를모르겠습니다. 도움부탁드려요 ㅠㅠ
음무 (17,820 포인트) 님이 2013년 11월 22일 질문

1개의 답변

+1 추천
 
채택된 답변
코드를 넣어서 돌려보니 빨간원이 그려지네요. 위의 코드는 문제가 없는 것 같습니다. 다른 코드 부분를 체크해보셔야 할 것 같네요.
익명사용자 님이 2013년 11월 22일 답변
음무님이 2013년 11월 22일 채택됨
원인을 찾았습니다.

현재 기존 액티비티의 한 영역에 서피스뷰를 호출하여 사용하는데요

화면영역의 x,y 좌표와 서피스뷰의 x,y좌표가 별개로 동작하나요 ??

서피스뷰영역을 터치하여 그리기를 하는데 서피스뷰 정중앙이 만약 360,640 이라고 한다면, 그곳을 터치하고 그리기가 되는걸 보면

터치한곳이 아니라 다른곳에 그림이 그려집니다.

로깅을 해보면 그림 그려지는 위치는 360,640이 맞는데말이죠

이유를 할 수 있을까요 ?
혹시 Device의 높이와 넓이를 view의 높이와 넓이라고 착각하지 않으셨어요?

Device의 높이에서 폰 상단 상태줄 높이를 빼야 됩니다.
상단상태바의 크기정도의 오차가 아니라  수백,수백 정도의 오차가 발생합니다..

서피스뷰에 그려지는 좌표는 서피스뷰 좌표를 입력해야하는건가요 ?

디바이스의 좌표를 그리면 안되는겁니까 ?

예전엔 이렇게 했었는데 좌표가 서피스뷰밖으로 나가면 그려지진않고

포함되는 영역이면 그려지고 했었던것같습니다.
스크린상의 위치(픽셀)를 캔버스 상의 위치(픽셀)로 변환하는 작업이 필요할 지 모르겠네요.

아래 코드를 참고하세요.

Canvas c = new Canvas();
int cx = c.getWidth();
int cy = c.getHeight();
...
Display display = getWindowManager().getDefaultDisplay();
int sx = display.getWidth();
int sy = display.getHeight();


canvasCoordX = p.x*((float)cx/(float)sx);
canvasCoordY = p.y*((float)cy/(float)sy);





또는 MotionEvent에서 getX()와 getY() 대신에 getRawX()/getRawY()로 시도해보세요.
...