Ich versuche, einen Text mit dem folgenden Code anzuzeigen. Das Problem ist, dass der Text nicht horizontal zentriert ist. Wenn ich die Koordinaten für drawText
einstelle, wird der untere Rand des Textes an dieser Position festgelegt. Ich möchte, dass der Text so gezeichnet wird, dass der Text auch horizontal zentriert ist.
Dies ist ein Bild, um mein Problem weiter anzuzeigen:
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//canvas.drawRGB(2, 2, 200);
Paint textPaint = new Paint();
textPaint.setARGB(200, 254, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(font);
textPaint.setTextSize(300);
canvas.drawText("Hello", canvas.getWidth()/2, canvas.getHeight()/2 , textPaint);
}
java
android
android-activity
android-canvas
drawtext
Sebastian
quelle
quelle
Antworten:
Versuche Folgendes:
quelle
float halfLength = text.length() / 2f;
Dies wird als Typwerbung bezeichnet .Paint.descent()
undPaint.ascent()
) mit dem Ansatz zum Zentrieren von TextPaint.getTextBounds()
in meiner Antwort unten verglichen .Paint.descent()
undPaint.ascent()
berücksichtigen Sie nicht den tatsächlichen Text. (Sie können diese Ungenauigkeit im Screenshot in meinem Beitrag unten erkennen.) Deshalb würde ich gegen diesen Ansatz empfehlen. Der Ansatz mitPaint.getTextBounds()
scheint genauer zu funktionieren.Mit Paint.getTextBounds () zentrieren :
Paint.Align.CENTER bedeutet nicht, dass der Referenzpunkt des Textes vertikal zentriert ist. Der Referenzpunkt liegt immer auf der Grundlinie. Warum also nicht Paint.Align.LEFT verwenden ? Sie müssen den Referenzpunkt trotzdem berechnen.
Paint.descent () hat den Nachteil, dass der echte Text nicht berücksichtigt wird. Paint.descent () ruft denselben Wert ab, unabhängig davon, ob der Text Buchstaben mit Abfahrten enthält oder nicht. Deshalb benutze ich stattdessen r.bottom .
Ich hatte einige Probleme mit Canvas.getHeight (), wenn API <16. Deshalb verwende ich stattdessen Canvas.getClipBounds (Rect) . (Nicht verwenden Canvas.getClipBounds (). GetHeight () , wie es Speicher für einen zuordnet Rect .)
Aus Leistungsgründen sollten Sie Objekte zuweisen, bevor sie in onDraw () verwendet werden . Wie drawCenter () wird innerhalb von aufgerufen werden OnDraw () das Objekt Rect r wird als Feld hier vorbelegt.
Ich habe versucht, den Code der beiden Top-Antworten in meinen eigenen Code einzufügen (August 2015) und einen Screenshot erstellt, um die Ergebnisse zu vergleichen:
Der Text sollte innerhalb des rot gefüllten Rechtecks zentriert sein. Mein Code erzeugt den weißen Text, die anderen beiden Codes erzeugen insgesamt den grauen Text (sie sind tatsächlich gleich und überlappen sich). Der graue Text ist etwas zu niedrig und zwei viel rechts.
So habe ich den Test gemacht:
quelle
Das vertikale Ausrichten ist schwierig, da Textabstieg und -aufstieg stattgefunden haben. Viele Leute haben Paint.getTextBounds () verwendet , um TextWidth und TextHeight abzurufen, aber das Textzentrum wird dadurch nicht sehr stark. Hier können wir Paint.measureText () verwenden , um die Textbreite zu berechnen, die Texthöhe, die wir einfach mit Abstieg und Aufstieg subtrahieren. Dann haben wir den besten Ansatz für TextSize. Die folgende Arbeit ist ziemlich einfach für einander.
By the way, wir hoch Verwendung empfehlen RectF anstatt Rect , weil die Positionen genauere Werte müssen, in meiner Erfahrung, RectF die obere und untere Abweichung nur ein Pixel auf xhdpi Gerät durchgeführt, würde Rect zwei mehr sein.
quelle
Ihr Code zeichnet die Mitte der Grundlinie des Textes in der Mitte der Ansicht. Um den Text zu einem bestimmten Zeitpunkt, x, y zum Zentrum, müssen Sie die Mitte des Textes berechnen und setzen , dass an der Spitze.
Diese Methode zeichnet Text, der am Punkt x, y zentriert ist. Wenn Sie es in der Mitte Ihrer Ansicht übergeben, wird der Text zentriert gezeichnet.
quelle
android.graphics.Paint
wird verwendet, um den Text zu zeichnenIch finde, dass die beste Lösung zum Zentrieren von Text wie folgt ist:
quelle
funktioniert für mich zu verwenden: textPaint.textAlign = Paint.Align.CENTER mit textPaint.getTextBounds
Ergebnis ist:
quelle
Ich erstelle eine Methode, um dies zu vereinfachen:
rectF ist der Bereich, in dem Sie den Text zeichnen möchten. Das war's. Einzelheiten
quelle
Wenn wir statisches Layout verwenden
Layout.Alignment.ALIGN_CENTER Dies reicht aus. Das statische Layout hat noch viele andere Vorteile.
Referenz: Android-Dokumentation
quelle
Das hat bei mir funktioniert:
Wenn jemand ein Problem findet, lass es mich wissen
quelle
In meinem Fall musste ich den Text nicht in die Mitte einer Leinwand legen, sondern in ein Rad, das sich dreht. Obwohl ich diesen Code verwenden musste, um erfolgreich zu sein:
Dann rufe ich diese Methode aus der View-Klasse auf:
quelle