android2012.10.11 20:32

[android] getTextBounds drawText

화면에 그릴 텍스트의 사이즈를 알아내기 위해
getTextBounds 함수를 사용하게 되는데,

이때 영어일경우엔 상관이 없었지만 한글이나 특수문자의 경우
영역이 내가 생각한대로 맞질않아서 계속 고생을 하였다.
몇번에 삽질끝에 알아낸 결과 getTextBounds 함수값에 그 해답이 있었다.

간단한 예제를 보자면


String text = "ABCD 1234";
Rect rt = new Rect();
ptText.getTextBounds(text, 0, text.length(), rt);
canvas.drawRect(rt, ptRound);
canvas.drawText(text, rt.left, rt.bottom, ptText);

 



위와같을경우 아무것도 출력되지않는다는걸 누구나 알수있다
getTextBounds로 구한 영역이 0,0을 기준으로 위에 있기때문이다



그러면 좌표를 조금 수정해서 다시 실행하여 보자.


int nX = 10;
int nY = 100;

String text = "ABCD 1234";
Rect rt = new Rect();
ptText.getTextBounds(text, 0, text.length(), rt);

rt.set(nX, nY-rt.height(), nX+rt.width(), nY);

canvas.drawRect(rt, ptRound);
canvas.drawText(text, nX, nY, ptText);




출력결과 Rect로 받아온값의 영역이 Text영역과 정확하게 일치한다
그런데 이때 영문과 숫자가 아닌 특수기호나 한글을 추가한다면
결과는 어떻게 될까?



String text = "ABC1234 한글출력 *_()";
Rect rt = new Rect();
ptText.getTextBounds(text, 0, text.length(), rt);

rt.set(nX, nY-rt.height(), nX+rt.width(), nY);

canvas.drawRect(rt, ptRound);
canvas.drawText(text, nX, nY, ptText);

 

텍스트에 들어가는 내용만 수정해주었다.
한글과 특수문자의 위치가 맞지않는것을 확인할수 있다.



이 이유는 getTextBounds 함수에 있다
getTextBounds 함수로 읽어온 값을 확인해보면
top 값은 음수이고 bottom 값은 0 또는 양수값이 들어오는걸 확인할 수 있다.
bottom 값이 0이상이 올경우가 바로 특수문자나 한글을 사용하였을때 발생하게 되는것이다.


따라서 getTextBounds 좌표체계는 다음과같다.

 





그렇다면 이제 Rect 값을 텍스트에 정확히 맞추어 보자


int nX = 10;
int nY = 100;

String text = "ABC1234 한글출력 *_()";
Rect rt = new Rect();
ptText.getTextBounds(text, 0, text.length(), rt);

rt.set(nX, nY + rt.top, nX + rt.width(), nY + rt.bottom);

canvas.drawRect(rt, ptRound);
canvas.drawText(text, nX, nY, ptText);

 


자 이제 화면에 출력되는 텍스트 영역을 완벽하게 구하였다.
물론 기초적이고 이미 다들 알고있을지도 모르지만
누군가 이문제로 인해 시간낭비할걸 막기위해 작성하였다.

신고
Posted by 레드오이

티스토리 툴바