2012-10-16 19 views
9

Ich habe viele Threads gesehen, die sich mit ähnlichen Problemen befassen, aber keiner von ihnen funktioniert für mich. In einer Leinwand habe ich ein Rechteck der Größe, sagen wir, 200x200px, und ich möchte Text in dieses Rechteck schreiben. Der Text muss nicht das gesamte Rechteck ausfüllen, aber wichtig ist, dass es automatisch einen Zeilenumbruch geben sollte, wenn das Ende des Rechtecks ​​erreicht ist. Wie kann ich das in Android tun?Android-Programmierung: Wie zeichne mehrzeiliger Text in einem Rechteck?

Danke für die Hilfe!

+0

Ich denke, eine bessere Lösung ist es, eine Textview in einem benutzerdefinierten Layout wickeln Sie leicht tun können, und setzen Sie Breite und Höhe des Textview auf „fill_parent“ .Es passt Ihren Zweck. :) – Daniel

Antwort

32

Sie StaticLayout verwenden können.

RectF rect = new RectF(....) 

StaticLayout sl = new StaticLayout("This is my text that must fit to a rectangle", textPaint, (int)rect.width(), Layout.Alignment.ALIGN_CENTER, 1, 1, false); 

canvas.save(); 
canvas.translate(rect.left, rect.top); 
sl.draw(canvas); 
canvas.restore(); 
+2

Danke ! Ich habe StaticLayout noch nie zuvor gesehen und kann es verwenden, um etwas Code zu entfernen, den ich in meinen Apps habe. – Simon

+0

Dies sollte die richtige Antwort auf diese Frage sein +1 –

+0

Sie können StaticLayout auch durch [DynamicLayout] (http://developer.android.com/reference/android/text/DynamicLayout.html) ersetzen, wenn Sie den Text ändern müssen danach. –

0

könnten Sie einfach ein Textfeld auf der Leinwand verwenden und mehrzeilige für dieses Textfeld aktivieren - dann würden Sie wie in Textfeld Linie erfolgen bricht kommt kostenlos ;-)

1
public class MutilineText { 
private String mText; 
private int fontSize = 50; 


public MutilineText(String text) { 

    this.mText = text; 
} 

public String getText() { 
    return mText; 
} 

public void setText(String text) { 
    mText = text; 
} 

public void draw(Canvas canvas, Rect drawSpace) { 


    Paint paintText = new Paint(Paint.ANTI_ALIAS_FLAG); 

    paintText.setAntiAlias(true); 
    paintText.setDither(true); 
    paintText.setColor(Color.BLACK); 
    paintText.setStyle(Paint.Style.FILL); 
    paintText.setStrokeWidth(3); 
    paintText.setTextSize(fontSize); 
    drawMultilineText(mText, drawSpace.left, drawSpace.top + 15, paintText, canvas, fontSize, drawSpace); 
} 


private void drawMultilineText(String str, int x, int y, Paint paint, Canvas canvas, int fontSize, Rect drawSpace) { 
    int lineHeight = 0; 
    int yoffset = 0; 
    String[] lines = str.split("\n"); 

    lineHeight = (int) (calculateHeightFromFontSize(str, fontSize) * 1.4); 
    String line = ""; 
    for (int i = 0; i < lines.length; ++i) { 
     if (calculateWidthFromFontSize(line, fontSize) <= drawSpace.width()) { 
      canvas.drawText(line, x + 30, y + yoffset, paint); 
      yoffset = yoffset + lineHeight; 
      line = lines[i]; 
     } else { 
      canvas.drawText(divideString(line, drawSpace.width()), x + 30, y + yoffset, paint); 
     } 
    } 


} 

private String divideString(String inputString, int bound) { 
    String ret = inputString; 

    while (calculateWidthFromFontSize(ret, fontSize) >= bound) { 
     ret = ret.substring(0, (ret.length() - 1)); 
    } 
    ret = ret.substring(0, ret.length() - 3) + "..."; 

    return ret; 
} 

private int calculateWidthFromFontSize(String testString, int currentSize) { 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextSize(currentSize); 
    paint.getTextBounds(testString, 0, testString.length(), bounds); 

    return (int) Math.ceil(bounds.width()); 
} 

private int calculateHeightFromFontSize(String testString, int currentSize) { 
    Rect bounds = new Rect(); 
    Paint paint = new Paint(); 
    paint.setTextSize(currentSize); 
    paint.getTextBounds(testString, 0, testString.length(), bounds); 

    return (int) Math.ceil(bounds.height()); 
} 
+0

Kein Code beantwortet nur bitte, fügen Sie Kommentare hinzu, um zu erklären, was Sie tun. –

Verwandte Themen