2016-08-06 13 views
1

Ich habe ein Rechteck, in das ich Text schreiben möchte. Ich möchte, dass der Text vertikal und horizontal zentriert ist, und ich muss die Textgröße ändern, um alle Zeichen innerhalb des Rechtecks ​​anzupassen. Hier ist mein Code:Text in Rect zentrieren und autosieren

@Override 
public void drawFixedText(String text, Rect rect, Paint paint) { 
    paint.setAntiAlias(true); 
    paint.setStyle(Paint.Style.FILL); 

    int cX = rect.left; 
    int cY = rect.top; 

    float textSize = paint.getTextSize(); 
    paint.setTextSize(textSize); 

    float textWidth = paint.measureText(text); 

    while (textWidth > rect.width()) { 
     textSize--; 
     paint.setTextSize(textSize); 
    } 

    //if cX and cY are the origin coordinates of the your rectangle 
    //cX-(textWidth/2) = The x-coordinate of the origin of the text being drawn 
    //cY+(textSize/2) = The y-coordinate of the origin of the text being drawn 

    canvas.drawText(text, cX-(textWidth/2), cY+(textSize/2), paint); 
} 

Ich habe versucht, die Antworten von Calculate text size according to width of text area und Android draw text into rectangle on center and crop it if needed

zu kombinieren, aber es hat nicht funktioniert, dass der Text auf der linken Seite des Rechtecks ​​platziert wird, anstatt im Inneren. Wie kann ich das beheben?

+0

'cX' ist die linke Seite von' Rect', also wollen Sie nicht die Hälfte der Textbreite davon subtrahieren. Sie wollen es vielmehr vom horizontalen Mittelpunkt des 'Rect' subtrahieren; h. "rect.centerX() - (textWidth/2)". Außerdem müssen Sie die Textbreite jedes Mal nach dem Ändern der Größe messen. das heißt, "textWidth = paint.measureText (text);" sollte auch nach dem 'setTextSize()' Aufruf in der Schleife sein. –

+0

Ok, ich tat das und es hat den Text scheinbar über die linke obere Ecke des Rechtecks ​​verschoben –

+0

Uh, nein, das ist, wo es mit dem Code wäre, den du gepostet hast. Wenn Sie die X-Koordinate wie vorgeschlagen ändern, sollte der Text auf der Oberseite des 'Rect' zentriert sein. Stellen Sie sicher, dass Ihr Build auf dem neuesten Stand ist. Das heißt, sauber und nach den Änderungen neu erstellen. Außerdem habe ich gerade bemerkt, dass Sie es auch vertikal zentrieren wollen, also müssen Sie etwas Ähnliches für die Y-Koordinate tun, obwohl die Textgröße es nicht genau zentriert, wenn das ein Problem ist. –

Antwort

0

Zuerst müssen Sie die Textbreite nach jeder Einstellung der Größe messen. Andernfalls erhalten Sie eine Endlosschleife, wenn der Text breiter als die Rect beginnt.

while (textWidth > rect.width()) { 
    textSize--; 
    paint.setTextSize(textSize); 
    textWidth = paint.measureText(text); 
} 

Dann den Text horizontal zu zentrieren, können Sie die Hälfte der Textbreite von dem horizontalen Mittelpunkt des Rect, nicht von seinem linken Rand subtrahieren wollen, das, was cX ist in Ihrem Schnipsel sein wird. Das heißt, ersetzen cX - (textWidth/2) durch rect.centerX() - (textWidth/2) in der drawText() Aufruf.

Um den Text vertikal zu zentrieren, müssen wir etwas ähnliches mit der y-Koordinate tun. Das Verwenden der Textgröße für das gibt jedoch nicht das richtige Ergebnis. Wir müssen die tatsächliche Höhe und den Offset des Textes gegenüber der Grundlinie messen, was wir mit der Methode Paint#getTextBounds() machen können.

Insgesamt würden diese Änderungen geben so etwas wie:

public void drawFixedText(String text, Rect rect, Paint paint) { 
    paint.setAntiAlias(true); 
    paint.setStyle(Paint.Style.FILL); 

    float textSize = paint.getTextSize(); 
    float textWidth = paint.measureText(text); 

    while (textWidth > rect.width()) { 
     textSize--; 
     paint.setTextSize(textSize); 
     textWidth = paint.measureText(text); 
    } 

    Rect bounds = new Rect(); 
    paint.getTextBounds(text, 0, text.length(), bounds); 

    canvas.drawText(text, 
        rect.centerX() - textWidth/2, 
        rect.centerY() - (bounds.top + bounds.bottom)/2, 
        paint); 
} 

Bitte beachten Sie, dass dies eine Standard Paint Instanz annimmt. Das heißt, dass alle Eigenschaften, die sich auf die Textausrichtung auswirken, ihre Standardwerte in diese Methode einbeziehen.