Bedeutung von oben, Aufstieg, Grundlinie, Abstieg, unten und führend in Android FontMetrics

89

Dies scheint eine grundlegende Frage zu sein, aber ich konnte auf SO keine ähnliche finden. Beim Lesen der Dokumentation hatte ich Probleme, die Konzepte zu verstehen. Ich möchte verstehen, was der Unterschied zwischen topund ascentund auch bottomund ist descent. Und wo genau ist die Basislinie? Haben Sie ein Diagramm, mit dem ich es mir vorstellen kann?

Suragch
quelle

Antworten:

279

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:

FontMetrics zeigt oben, auf, Grundlinie, anständig, unten und führend

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 ' topund ascentnegative Zahlen sind, da sie von der Basislinie aus gemessen werden (während Abstieg und Boden positive Zahlen sind). Um die Entfernung von zu topzu 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 als0und 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 TextViewmit setLineSpacingin Code oder android:lineSpacingExtraund android:lineSpacingMultiplierin 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.

Geben Sie hier die Bildbeschreibung ein

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 topoder 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:

Geben Sie hier die Bildbeschreibung ein

Die diakritischen Zeichen befinden sich oberhalb topund 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 topund sind bottom. Und normalerweise bleiben sie in ascentund decent. Wenn Sie aus irgendeinem Grund sicher wissen müssen, ob die Buchstaben darüber hinausgehen topoder ob bottomSie sie verwenden können TextPaint.getTextBounds.

Suragch
quelle
Nett! Wissen Sie, in welchen Einheiten der Aufstieg, Abstieg usw. gemessen wird? Sind sie in Pixel? Sie sind Gleitkommawerte, aber nicht sicher, wie sie dem Bildschirm entsprechen. Ich habe sie in Photoshop überprüfen lassen, um festzustellen, ob es sich um Pixel handelt und ob es einen geringfügigen Unterschied von einigen Einheiten gibt. Pixel sind kleiner.
Vikram Gupta
@ VikramGupta. Die Einheiten sind Pixel. Ich bin mir nicht sicher, was den Unterschied bei Ihrer Photoshop-Bildprüfung verursacht hat.
Suragch
Danke für die nützliche Erklärung und die App. Aber können Sie weiter erklären, was genau ist Top? Wird es einen Buchstaben geben, der groß genug ist, um die TopLinie zu berühren ? Zum Beispiel scheint "M", "l" der höchste Buchstabe zu sein. Keiner von ihnen berührt Top.
Cheok Yan Cheng
@CheokYanCheng, siehe das Update am Ende meiner Antwort.
Suragch
@ Suragch Danke für die Info. Ich benutze deine App, um mehr zu verstehen. Ich gehe davon aus, dass die Zeile "Aufstieg" genau wie in Ihrem Screenshot den oberen Rand der Schriftart berührt. Ab dem neuesten i.imgur.com/aRxgjvu.png berührt es jedoch nicht das höchste Zeichen "M". Hast du eine Idee warum?
Cheok Yan Cheng
5

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 ):

In der Typografie bezieht sich führend / ˈlɛdɪŋ / auf den Abstand zwischen den Basislinien aufeinanderfolgender Typzeilen. Der Begriff entstand in den Tagen des Handsatzes, als dünne Bleistreifen in die Formulare eingeführt wurden, um den vertikalen Abstand zwischen den Schriftlinien zu vergrößern.

Nach allem, was ich sagen kann, hat Android keine Möglichkeit, dies anzugeben.

MajorTom
quelle
+1, um mir zu helfen, das Führen besser zu verstehen. Wenn Sie die führende Position ändern möchten, können Sie TextViews setLineSpacingin Code oder android:lineSpacingExtraund android:lineSpacingMultiplierin XML verwenden.
Suragch
Danke - ja, es wurde uns gesagt, dass wir verwenden sollen, um android:lineSpacingExtraden 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.
MajorTom
1
Wenn der typografische Vorsprung der Abstand zwischen den Basislinien ist, sollte es einfach zu berechnen sein.
Suragch
Das ist was ich dachte. Gibt es eine Möglichkeit, dies programmgesteuert zu tun? Ich hatte gehofft, dass es mit den von Android bereitgestellten Methoden einen Weg gibt, dies zu tun. Die Entwickler, mit denen wir arbeiten, scheinen es nicht zu wissen.
MajorTom
Es ist schon eine Weile her, dass ich damit gearbeitet habe, aber wenn ich es wieder aufgreifen würde, würde ich hier und hier anfangen und mit verschiedenen Texten und Schriftarten experimentieren. Auch wenn es nicht einfach ist, kann ich nicht glauben, dass es keine Möglichkeit gibt, zu berechnen, was Sie brauchen.
Suragch