2010-02-25 16 views
18

canvas으로 바로 2D 드로잉을 많이하는 맞춤 컨트롤이 있습니다.Android 캔버스에 긴 텍스트 배치

일부 그림은 텍스트이므로 Canvas.drawText() 방법을 사용하고 있습니다.

일부 경계 (상단 왼쪽, 특정 최대 너비 및 최대 줄 수) 내에서 텍스트를 그립니다. 텍스트를 그린 후에 얼마나 많은 줄이 있는지 알고 싶습니다.

잘게 분할하는 경계 내에서 텍스트를 그릴 수있는 기본 제공 함수가 있습니까?

그렇지 않은 경우 표준 요리법이 있습니까?

+0

'StaticLayout'의 좋은 사용 예를 보려면이 대답을 참조하십시오. http://stackoverflow.com/a/8369690/293280 –

답변

30

이 경우 android.text.StaticLayout 클래스를 사용할 수 있습니다. 원하는 텍스트, 맞춤, 너비 등에 맞게 StaticLayout을 만들고 캔버스에 그릴 방법을 draw(Canvas) 호출하십시오.

+0

놀라워요. 간과 한 적이 있습니다. – Will

+0

Android 전용입니까? 다른 플랫폼은 어떻습니까? –

+0

좋습니다! 캔버스에 텍스트를 어떻게 배치할까요? –

4

Paint.getTextBounds()를 사용하여 전체 문자열의 크기를 측정하거나 Paint.getTextWidths()를 사용하여 각 문자의 너비를 얻을 수 있습니다. 그리기 전에 문자열을 적절히 분리하십시오.

3

나는 동일한 문제가있었습니다. 내 첫 번째 솔루션 중 하나는 다음과 같습니다.

/** 
    * This function draws the text on the canvas based on the x-, y-position. 
    * If it has to break it into lines it will do it based on the max width 
    * provided. 
    * 
    * @author Alessandro Giusa 
    * @version 0.1, 14.08.2015 
    * @param canvas 
    *   canvas to draw on 
    * @param paint 
    *   paint object 
    * @param x 
    *   x position to draw on canvas 
    * @param y 
    *   start y-position to draw the text. 
    * @param maxWidth 
    *   maximal width for break line calculation 
    * @param text 
    *   text to draw 
    */ 
public static void drawTextAndBreakLine(final Canvas canvas, final Paint paint, 
     final float x, final float y, final float maxWidth, final String text) { 
    String textToDisplay = text; 
    String tempText = ""; 
    char[] chars; 
    float textHeight = paint.descent() - paint.ascent(); 
    float lastY = y; 
    int nextPos = 0; 
    int lengthBeforeBreak = textToDisplay.length(); 
    do { 
     lengthBeforeBreak = textToDisplay.length(); 
     chars = textToDisplay.toCharArray(); 
     nextPos = paint.breakText(chars, 0, chars.length, maxWidth, null); 
     tempText = textToDisplay.substring(0, nextPos); 
     textToDisplay = textToDisplay.substring(nextPos, textToDisplay.length()); 
     canvas.drawText(tempText, x, lastY, paint); 
     lastY += textHeight; 
    } while(nextPos < lengthBeforeBreak); 
} 

무엇 누락되지 않습니다 :

  • 없음 지능형 브레이크 라인 메커니즘을이

방법을 호출 할 수의 maxWidth을 기반으로 나누기 때문에?

paint.setTextSize(40); 
    paint.setColor(Color.WHITE); 
    paint.setSubpixelText(true); 
    float textHeight = paint.descent() - paint.ascent(); 
    CanvasUtils.drawTextAndBreakLine(canvas, paint, this.left, 
      textHeight, this.displayWidth, this.text); 

저는 CanvasUtils라고 불리는 정적 클래스를 가지고 있습니다. 기본적으로 사각형 안에 텍스트를 그립니다. 이것이 textHeight가 텍스트의 높이가되는 이유입니다. 그러나 원하는 것을 기능에 전달할 수 있습니다.

좋은 프로그래밍!

+0

네,이 일은 저에게 효과적 이었지만 단어가 깨지도록 강요합니다! 그 문제를 해결할 수있는 방법이 있습니까? – Eenvincible

+0

안녕하세요, Eenvincible, 당신은 하나의 단어를 의미합니까? 하이픈 넣기? –

+0

특히. 이 코드의 경우에는 텍스트가 사각형 내에서 올바르게 줄 지지만 일부 단어는 줄 바꿈으로 끝나고 한 줄에 단어의 일부가 표시되고 다음 줄에는 단어의 일부가 새 줄 바꿈으로 끝납니다. – Eenvincible