Lassen Sie uns zunächst überprüfen, was in der Dokumentation steht :
- Oben - Der maximale Abstand über der Grundlinie für das höchste Symbol in der Schrift bei einer bestimmten Textgröße.
- Aufstieg - Der empfohlene Abstand über der Grundlinie für Text mit einzelnem Abstand.
- Abstieg - Der empfohlene Abstand unter der Grundlinie für Text mit einzelnem Abstand.
- Unten - Der maximale Abstand unterhalb der Grundlinie für das niedrigste Symbol in der Schriftart bei einer bestimmten Textgröße.
- Führend - Der empfohlene zusätzliche Platz zum Hinzufügen zwischen Textzeilen.
Beachten Sie, dass an der Basislinie die ersten vier gemessen werden. Es ist eine Linie, die die Basis bildet, auf der sich der Text befindet, obwohl einige Zeichen (wie g, y, j usw.) möglicherweise Teile haben, die unterhalb der Linie liegen. Es ist vergleichbar mit den Zeilen, auf die Sie in einem linierten Notizbuch schreiben.
Hier ist ein Bild, um diese Dinge zu visualisieren:
Denken Sie daran, dass beim Zeichnen auf einer Leinwand in Java und Android das Verringern von y und das Erhöhen von y abnimmt . Das bedeutet, dass FontMetrics ' top
und ascent
negative Zahlen sind, da sie von der Basislinie aus gemessen werden (während Abstieg und Boden positive Zahlen sind). Um die Entfernung von zu top
zu erhalten bottom
, müssten Sie also ( bottom
- top
) tun .
Der führende Wert ist der Abstand zwischen dem unteren Rand einer Zeile und dem oberen Rand der nächsten Zeile. Im obigen Bild ist dies der Abstand zwischen dem Orange von Zeile 1 und dem Purpur von Zeile 2. Wie unten bei @MajorTom angegeben , wird der Begriff in der Typografie besser definiert als "der Abstand zwischen den Basislinien aufeinanderfolgender Typzeilen ". * Android scheint den Begriff jedoch im eher historischen Sinne zu verwenden. Das Wort (ausgesprochen "ledding") stammt von dem Bleistreifen, den die alten Schriftsetzer zwischen Schriftzeilen eingefügt haben. Es war im Grunde nur eine Möglichkeit, den Zeilenabstand anzupassen. In Android habe ich noch nie gesehen, dass die Führung etwas anderes ist als0
und ich habe nicht gesehen, dass es für irgendetwas im Quellcode verwendet wurde. (Korrigieren Sie mich, wenn Sie wissen, wo damit etwas berechnet wird.) Sie können den Zeilenabstand in a TextView
mit setLineSpacing
in Code oder android:lineSpacingExtra
und android:lineSpacingMultiplier
in XML ändern . Diese Methoden verwenden oder modifizieren jedoch nicht die führenden.
Weitere Informationen finden Sie unter diesen Links:
Erkunde mehr
Um mehr über Font Metrics zu erfahren, habe ich ein einfaches Projekt erstellt.
Anstatt den gesamten Code hier aufzulisten. Ich habe das Projekt zu GitHub hinzugefügt . Sie können das Projekt entweder klonen oder die folgenden Dateien in ein neues Projekt kopieren.
Gehen Buchstaben jemals über top
oder unter bottom
?
Normalerweise nicht, aber sie könnten. Oben und unten werden, wie ich sie verstehe, durch die Schriftart festgelegt (daher "FontMetrics"), sodass ein Font-Hersteller eine Glyphe höher setzen kann als das, was sie sagen, dass die Oberseite (oder niedriger als die Unterseite) ist. Durch das Kombinieren diakritischer Zeichen in Unicode kann dies sehr leicht passieren. Hier ist ein ziemlich extremes Beispiel (von hier genommen)): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡
Wenn wir diesen String in Android einstecken, erhalten wir Folgendes:
Die diakritischen Zeichen befinden sich oberhalb top
und unterhalb des bottom
. Es ist jedoch interessant festzustellen, dass die Gesamtbreite und -höhe korrekt an den Textgrenzen gemessen werden.
Wie auch immer, für alle praktischen Zwecke in Ihrer Programmierung können Sie einfach annehmen, dass die Max und Min für Glyphenbuchstaben top
und sind bottom
. Und normalerweise bleiben sie in ascent
und decent
. Wenn Sie aus irgendeinem Grund sicher wissen müssen, ob die Buchstaben darüber hinausgehen top
oder ob bottom
Sie sie verwenden können TextPaint.getTextBounds
.
Top
? Wird es einen Buchstaben geben, der groß genug ist, um dieTop
Linie zu berühren ? Zum Beispiel scheint "M", "l" der höchste Buchstabe zu sein. Keiner von ihnen berührtTop
.Führen ist KEIN Leerzeichen zwischen Zeilen in der Typografie. Anscheinend ist dies etwas, was Android-Code nicht berücksichtigt. Wir haben selbst damit zu kämpfen. Die richtige Definition von Führen ( aus Wikipedia ):
Nach allem, was ich sagen kann, hat Android keine Möglichkeit, dies anzugeben.
quelle
setLineSpacing
in Code oderandroid:lineSpacingExtra
undandroid:lineSpacingMultiplier
in XML verwenden.android:lineSpacingExtra
den tatsächlichen Abstand zwischen den Linien zu messen. Es führt nicht, aber es scheint die einzige Möglichkeit zu sein, den Abstand zu verwalten. Dies ist ein Problem, da es in der Typografie keine solche Messung gibt und es keine Möglichkeit gibt, diese Messung in Sketch oder Zepelin (den von uns verwendeten Werkzeugen) anzugeben. Außerdem passt es nicht zur Führung.