Przyjrzyjmy się najpierw temu, co mówi dokumentacja :
- Do góry - maksymalna odległość nad linią bazową najwyższego glifu czcionki przy danym rozmiarze tekstu.
- Ascent - zalecana odległość powyżej linii bazowej dla tekstu z pojedynczymi odstępami.
- Descent - zalecana odległość poniżej linii podstawowej dla wyodrębniony tekst rozmieszczone.
- Dół - maksymalna odległość poniżej linii bazowej dla najniższego glifu czcionki przy danym rozmiarze tekstu.
- Wiodący - zalecany dodatkowy odstęp między wierszami tekstu.
Zwróć uwagę, że linia bazowa jest tym, na podstawie której mierzone są pierwsze cztery. Jest to linia, która stanowi podstawę , na której znajduje się tekst, mimo że niektóre znaki (takie jak g, y, j itp.) Mogą mieć części, które znajdują się pod linią. Jest to porównywalne z liniami, które piszesz w notatniku w linie.
Oto zdjęcie, które pomoże zwizualizować te rzeczy:
Pamiętaj, że podczas rysowania na płótnie w Javie i Androidzie spadek y oznacza wzrost y, a wzrost to spadek y. Oznacza to, że FontMetrics top
i ascent
są liczbami ujemnymi, ponieważ są mierzone od linii bazowej (podczas gdy spadek i dół są liczbami dodatnimi). Tak więc, aby uzyskać odległość od top
do bottom
, musisz zrobić ( bottom
- top
).
Czołowym jest odległością między dolną jedną linię i początku następnej linii. Na powyższym obrazku jest to przestrzeń między pomarańczą Linii 1 a fioletem Linii 2. Jak @MajorTom zauważył poniżej , w typografii termin jest lepiej definiowany jako „odległość między liniami bazowymi kolejnych linii tekstu”. * Jednak Android wydaje się używać tego terminu w bardziej historycznym sensie. Słowo (wymawiane jako „ledding”) pochodzi od ołowianej listwy, którą dawni zecerowie umieszczali między wierszami czcionki. To był po prostu sposób na dostosowanie odstępów między wierszami. W Androidzie nigdy tak naprawdę nie widziałem, aby wiodącym było coś innego niż0
i nie widziałem tego używanego do niczego w kodzie źródłowym. (Poprawcie mnie jeśli wiesz, gdzie jest on stosowany do obliczenia czegokolwiek). Można zmienić odstępy między wierszami w A TextView
z setLineSpacing
kodem czy android:lineSpacingExtra
i android:lineSpacingMultiplier
w xml. Jednak metody te nie wykorzystują ani nie modyfikują wiodącego.
Sprawdź te linki, aby uzyskać więcej informacji:
Dowiedz się więcej
Aby lepiej zbadać Font Metrics, stworzyłem prosty projekt.
Zamiast wymieniać tutaj cały kod. I dodaje projektu do GitHub . Możesz sklonować projekt lub skopiować następujące pliki do nowego projektu.
Czy litery znajdują się kiedykolwiek powyżej top
lub poniżej bottom
?
Zwykle nie, ale mogli. Jak rozumiem, góra i dół są ustawiane przez czcionkę (stąd „FontMetrics”), więc twórca czcionki może sprawić, że glif będzie wyższy niż to, co mówi, że jest górny (lub niższy niż dół). Również łączenie znaków diakrytycznych w Unicode może się bardzo łatwo zdarzyć. Oto raczej skrajny przykład (zaczerpnięty stąd): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛̛͋̏̍̆ͤ͛͐ͨ̌̋͋̏̍̆ͤ͛͐ͨ̌sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́̋S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡
Podłączając ten ciąg do Androida, otrzymujemy to:
Znaki diakrytyczne znajdują się powyżej top
i poniżej bottom
. Warto jednak zauważyć, że całkowita szerokość i wysokość są prawidłowo mierzone przez granice tekstu.
W każdym razie, ze wszystkich praktycznych powodów w swoim programowaniu, możesz po prostu założyć, że maksymalne i minimalne wartości liter glifu to top
i bottom
. Zwykle pozostaną wewnątrz ascent
i decent
. Jeśli z jakiegoś powodu musisz wiedzieć na pewno, czy litery wykraczają poza top
lub bottom
możesz użyć TextPaint.getTextBounds
.
Top
? Czy będzie jakaś litera wystarczająco wysoka, by dotknąćTop
linii? Na przykład „M”, „l” wydaje się być najwyższą literą. Żaden z nich się nie dotykałTop
.Wiodący NIE jest odstępem między wierszami w typografii. Najwyraźniej jest to coś, czego kod Androida nie bierze pod uwagę. Sami się z tym zmagaliśmy. Prawidłowa definicja wiodącego ( z Wikipedii ):
Z tego, co wiem, Android nie ma sposobu, aby to określić.
źródło
setLineSpacing
w kodzie lubandroid:lineSpacingExtra
iwandroid:lineSpacingMultiplier
xml.android:lineSpacingExtra
który umieściłby pomiar między faktyczną odległością między liniami. Nie prowadzi, ale wydaje się być jedynym sposobem na zarządzanie odstępami. To problem, ponieważ w typografii nie ma takiego pomiaru i nie ma sposobu, aby określić tę miarę w Sketch czy Zepelin (narzędziach, których używamy). Poza tym nie pasuje do czołówki.