Android: Messen Sie die Texthöhe auf einer Leinwand
Ich bin momentan am Rendern, ist eine Bitmap, die ich dann senden möchten, um einen mobilen Drucker. Jedoch bin ich zu kämpfen mit der Messung der Höhe meines Textes, so kann ich vorher die y-position entsprechend.
Meine basic bitmap/canvas/Farbe Konfiguration ist das (Schriftgröße 16 und die Abmessungen der bitmap werden 200x400 (Breite x Höhe):
public MyRenderer() {
//Initialize bitmap
bitmap = Bitmap.createBitmap(200, 400, Bitmap.Config.ARGB_8888);
//Initialize canvas
canvas = new Canvas(bitmap);
//Initialize brush (Paint instance)
brush = new Paint();
brush.setTextSize(16);
brush.setTypeface(Typeface.SANS_SERIF);
brush.setColor(Color.BLACK);
brush.setStyle(Paint.Style.FILL);
brush.setAntiAlias(true);
brush.setTextAlign(Align.LEFT);
}
So weit So gut, jetzt, was ich tun möchte ist: Wenn ich die Paint-Methode drawText ich brauche zur Versorgung der x-und y-Koordinaten. Für x ist null (vorausgesetzt, linksbündiger text), sondern als für y, würde ich berechnen Sie die Höhe jeder text, den ich ausdrucken und fügen Sie es, so kann ich behalten Sie den überblick über meinen aktuellen y-position.
Und jetzt wird es seltsam: ich benutze die folgende Methode, um zu bestimmen, die Höhe eines Textes (mit der Farbe einwenden, dass ich zuvor initialisiert - es nennt sich "Pinsel"):
public int measureHeight(String text) {
Rect result = new Rect();
//Measure the text rectangle to get the height
brush.getTextBounds(text, 0, text.length(), result);
return result.height();
}
Obige Methode liefert folgende Werte für die folgenden Texte:
- "Hallo Welt" gibt eine Höhe von 12
- "Einer camera-Instanz kann verwendet werden, um zu berechnen, 3D-Transformationen und generieren Sie eine matrix." gibt eine Höhe von 16
- "Die Einführung von Android-Design: Der Ort, an dem lernen über Prinzipien, Bausteine und Muster für die Erstellung von Welt-Klasse Android user interfaces. Egal, ob Sie ein UI-Experte oder ein Entwickler, der diese Rolle zu spielen, diese docs zeigen Ihnen, wie man gute design-Entscheidungen, große und kleine." gibt eine Höhe von 16
Macht es Sinn für mich, dass die Nummer 2 und 3 die Rückkehr einer größeren Höhe als Nummer 1, aber wenn eine Zeile hat eine Höhe von 12 (als Nummer eins hat) - es macht keinen Sinn, die mehrere Zeilen haben eine Höhe von 16 ?
Bin ich hier etwas fehlt? Es ist eine bequeme Methode für die Messung der Breite eines Textes (mithilfe einer Instanz von paint und rufen measureText("myText"), die einwandfrei funktioniert, jedoch bin ich ziemlich ratlos, wenn es um die Höhe, wie die oben aufgeführten Ergebnisse nicht machen keinen Sinn für mich.
BEARBEITEN
Ich bin mir bewusst, dass getTextBounds wahrscheinlich nicht auto-Umbruch der mehrzeiligen text, und das ist ok, ich schrieb schon eine Methode für die Aufteilung von text, aber auch wenn es nur Maßnahmen, die eine Zeile, die oben gegebene Länge Werte noch unwahrscheinlich erscheinen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, es ist, weil das "p" in "compute" erstreckt sich unterhalb der Grundlinie in der Erwägung, dass "Hallo Welt" nur Buchstaben enthält, sind über die Grundlinie.
Da der Zeilenabstand sollte nicht davon abhängen, was die bestimmte Buchstaben Ihres Textes geschieht aus Sie sind wahrscheinlich auf der Suche nach Farbe.FontMetrics, die erzielt werden können über Farbe.getFontMetrics(). Berechnen
descent - ascent + leading
auf die empfohlenen baseline-Abstand (weil Aufstieg hat einen negativen Wert).Gibt es einen kleinen Fehler in der akzeptierten Antwort. Wenn Sie möchten, dass die text Höhe, die Sie verwenden sollten
Und wenn Sie wollen, dass die Linie Höhe, die Sie verwenden sollten
Führenden ist optional interline-Abstand, so dass, wenn Sie benötigen, um das line-hight Sie können es. Aber wenn Sie wollen einfach nur die text-Höhe, dann lassen Sie es aus.
Hinweis
leading
nichts anderes als0
, und soweit ich sagen kann, es scheint sogar, um ignoriert zu werden in derTextView
Quellcode (und die dazugehörigenLayout
,StaticLayout
, etc.). Bitte korrigieren Sie mich, wenn ich falsch Liege. So ist es wohl sicher, es lassen Sie es out-of-line-hight calulations, aber ich bin mir nicht ganz sicher.Siehe auch
getTextBounds
vsFontMetrics
vsStaticLayout