2013-01-11 2 views
0

캔버스으로 그려진 문자열을 완벽하게 정렬하고 싶습니다. 그때 너무렌더링 된 텍스트 문자열의 크기 계산 (렌더링 전에)

Paint p = new Paint(); 
Canvas c = holder.lockCanvas(); 

String centered_text = "Hello World"; 

과 같은 코드를 가지고 있다면 그래서 내가 할 것

이제
p.setTextSize(35); 
p.setStyle(Style.STROKE); 

중간에 내 문자열을 그려 내 페인트 스타일크기 설정

c.drawText(centered_text, c.getWidth()/2, c.getHeight()/2, p); 

하지만 실제로는 내 텍스트를 가운데에 배치하지 않을 것이고, 왼쪽 상단을 가운데에 놓을 것입니다. 그 중심에 나는 Strings litteral 너비와 높이 (픽셀 단위)가 문자가 아님을 알아야합니다.

int string_width = centered_text.getWidth(); //String.getWidth() is not a real methode 
int string_height = centered_text.getHeight(); //String.getHeight() is not a real methode 

c.drawText(centered_text, (c.getWidth()/2)-(string_width/2), (c.getHeight()/2)-(string_height/2), p); 

텍스트 만 String.getWidth()String.getHeight() 실제 methodes없는 중심 것입니다. 그래서 내 생각은 높이을 찾기 위해 텍스트크기문자열크기을 사용하는 것입니다. 그래서 테의 라인을 따라 뭔가 :

int string_width = centered_text.length()*p.getTextSize(); 
int string_height = p.getTextSize(); 

그러나 다른 문자는 다른 크기 때문에이 잘못 같은 느낌이 ... 사람이 어떤 생각을 가지고있다.

+0

대답은 없지만 : 예, 고정 폭 글꼴을 사용하지 않으면 다른 문자의 너비가 달라집니다. 또한, 렌더링이 충분히 향상되면 커닝 ​​(kerning) (즉, 글꼴 사이에 가변적 인 공간)이 도입 될 수 있습니다. 마지막으로, 가장 높은 글자와 기준선의 중간에 세로로 정렬하지 않고 글꼴의 X 높이에서 기준선까지 정렬하는 것이 좋습니다. – Miquel

+0

어떤 라이브러리를 사용하고 있습니까? SWT에는 getStringExtent (String)이있다. [이 튜토리얼] (http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/DemonstratesFontMetricsandextents.htm)을 확인하십시오. – Miquel

답변

0

Java Swing을 사용한다고 가정하면, 원하는 것은 FontMetrics입니다.

new FontMetrics(canvas.getFont()).getStringBounds(someString, canvas.getGraphics()); 

은 문자열 크기의 Rectangle2D를 반환합니다.

+0

조금만 시도해보십시오. 그래도 좋아 보인다. – java