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

해상도별 좌표 구하는법 알고 싶어요

0 추천
안녕하세요 안드로이드펍 가족님들..

 

현재 스크롤뷰에 디바이스 크기보다 큰 이미지를 넣어서 스크롤하면서 전체적으로 보게 구현하였습니다.

그런데 onDraw로 제가 그위에 선이나 점을 그릴려고하는데요 px값으로 줘버리면 이게 해상도별로 다 위치가 달라서 문제 인데요.

해상도도 상관없이 제가 원하는곳에 그리수 있는 공식 같은거 없나요?

 

이미지는 가로가 3000정도됩니다^^ 이미지 사이즌는 유동적이구요

 

좋은 하루 되십시오
흠바바 1 (4,000 포인트) 님이 2014년 7월 22일 질문
쪽지 회신하려하는데 A server error occurred - please try again. 라고 에러만 뱉네요 ㅋㅋ. 컨택할 방법 쪽지로 다시주세요 ㅋ

1개의 답변

0 추천
 
채택된 답변

viewWidth = 1080

viewHeight = 1920

bitmapWidth = 3000

bitmapHeight = 800

이미지를 세로로 가득 채우고 가로는 스크롤 되도록 구현했다고 가정합니다.

물론 세로형 이미지의 경우는 가로를 가득 채우게 되겠죠? 뭐 이거는 구현에 따라...

 

이미지의 종횡 비율과 어느쪽을 fill시키고 해당 비율을 factor값으로 사용할지 결정해야합니다.

float factor = 0f;

if(bitmapWidth > bitmapHeight){

factor = (float)viewHeight / (float)bitmapHeight;//가로형 이미지. 세로를 fill해서 factor를 구해야합니다.

}

else{

factor = (float)viewWidth / (float)bitmapWidth;//세로형 이미지. 가로를 fill해서 factor를 구해야합니다.

}

int scaledWidth = bitmapWidth * factor; // 4050

int scaledHeight = bitmapHeight * factor; // 1080

이제 뷰에서 터치값이 들어온다면 scaledWidth, scaledHeight 범위에서 들어오겠죠.

 

////////////////////////////////

이미지 표현: 이미지뷰에 Matrix를 factor값으로 setScale설정하셔야 하겠죠.

단순 화면 그리기:  그냥 받은 포인트를 onDraw에서 View에 draw하시면 될테고,

비트맵에 추가: Canvas 얻으시고 save 후 factor가 적용된 matrix적용하고 view 좌표대로 그릴꺼 그리시고 restore하시면 되겠습니다.

Canvas c = new Canvas(bitmap);

c.save();

c.setMatrix(matrix);

c.drawXXXXX();

c.restore();

처럼 그리시면 되겠네용...

 

추가 설명을 드리면 위의 조건의 경우 factor는 1.35가 나옵니다.

원본이 3000x800이라고 가정했으니 4050x1080으로 스케일 될테구요.

bitmap에서 canvas를 얻으면 일단 3000x800짜리 캔바스가 나옵니다.

c.save후 setMatrix하시면 canvas가 factor대로 4050x1080으로 확장된 상태가 됩니다.

여기에 그릴꺼 다 그리시면 원하는 위치(View에서 받은 좌표값대로)에 그려지겠죠.

그리고 c.restore를 호출하면 다시 3000x800짜리 캔버스가 되는거죠. 이때 restore전에 그린것들도 같이 크기가 복구되구요.

칠리님 (10,910 포인트) 님이 2014년 7월 22일 답변
흠바바 1님이 2014년 7월 24일 채택됨
포인트는 실제 비트맵의 크기과 뷰에 표현할 크기와의 비율이죠.
해당 비율과 매트릭스로 컨트롤합니다.
안녕하세요 답변감사합니다. 위에 내용은 줌인 하는 내용인가요?
제가 물은거 canvas.drawline(0,0,100,100);
이 해상도별로 다달라서 같게 하는걸 말씀드린거든요.
100이라는숫자가 어떤해상도에서는 50, 어떤데는 아마 80머 이런식으로 해야 보이는게 같을꺼 같거든요 제가 질문이 부족했나보군요
줌인아웃 이전의 이미지 디스플레이 스케일에 관계된 내용입니다.
저기에 터치핸들이 추가되면 줌 인 아웃이 되겠지요...
그 캔바스가 뷰의 캔바스 인가요 아니면 언급하신 3000짜리 이미지의 캔바스인가요?
원하시는게 이미지의 특정 위치에 그리려고하신게 아닌가요?
이미지의 특정위치와 관계없이 뷰에만 그리려고 하시는 건가요?

이미지의 특정 위치에 그리려고 한다면 이미지 디스플레이 스케일이 중요하구요.

그냥 뷰 위에 고정 수치만큼 그리려고 하시는거면 그리려는 수치를 dp로 먼저 환산해서 기록해 놓으시고 display metrics의 density값을 곱해서 그리시면 됩니다.
아니면 xml에 dimension값으로 기록해놓고 getResources().getDimensionPixelSize(resid) 로 구해서 쓰셔도 되구요.
말씀하신 그 100이라는 숫자가 표현하려는 이미지의 어떤 특정 위치에 정확하게 디스플레이 되어야 하는거 아닌가요?
...