Znaczenie góry, wzniesienia, linii bazowej, spadku, dołu i początku w FontMetrics Androida

90

Wydaje się, że to podstawowe pytanie, ale nie mogłem znaleźć podobnego w SO. Czytając dokumentację , miałem problem ze zrozumieniem koncepcji. Chcę zrozumieć, jaka jest różnica między topa ascenta także bottoma descent. A gdzie dokładnie jest podstawa? Czy masz diagram, który pomoże mi go zwizualizować?

Suragch
źródło

Odpowiedzi:

287

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:

FontMetrics pokazujący górę, wzniesienie, linię bazową, przyzwoity, dół i wiodący

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 topi ascentsą liczbami ujemnymi, ponieważ są mierzone od linii bazowej (podczas gdy spadek i dół są liczbami dodatnimi). Tak więc, aby uzyskać odległość od topdo 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ż0i 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 TextViewz setLineSpacingkodem czy android:lineSpacingExtrai android:lineSpacingMultiplierw 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.

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj

Znaki diakrytyczne znajdują się powyżej topi 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 topi bottom. Zwykle pozostaną wewnątrz ascenti decent. Jeśli z jakiegoś powodu musisz wiedzieć na pewno, czy litery wykraczają poza toplub bottommożesz użyć TextPaint.getTextBounds.

Suragch
źródło
Ładny! Czy wiesz, w jakich jednostkach mierzone jest wejście, zejście itp.? Czy są w pikselach? Są to wartości zmiennoprzecinkowe, ale nie wiadomo, jak odpowiadają ekranowi. Sprawdziłem je w Photoshopie, aby sprawdzić, czy to piksele i jest niewielka różnica kilku jednostek; piksele są mniejsze.
Vikram Gupta,
@VikramGupta. Jednostkami są piksele. Nie jestem pewien, co spowodowało różnicę w sprawdzaniu obrazu w Photoshopie.
Suragch
Dzięki za przydatne wyjaśnienie i aplikację. Ale czy możesz dalej wyjaśnić, co to dokładnie jest Top? Czy będzie jakaś litera wystarczająco wysoka, by dotknąć Toplinii? Na przykład „M”, „l” wydaje się być najwyższą literą. Żaden z nich się nie dotykał Top.
Cheok Yan Cheng
@CheokYanCheng, zobacz aktualizację na końcu mojej odpowiedzi.
Suragch
@ Suragch Dzięki za informację. Używam Twojej aplikacji, aby dowiedzieć się więcej. Spodziewam się, że linia „Ascent” będzie po prostu ładnie dotykać górnej części czcionki, jak na zrzucie ekranu. Jednak z najnowszego i.imgur.com/aRxgjvu.png nie dotyka on najwyższego znaku „M”. Czy masz pojęcie, dlaczego?
Cheok Yan Cheng
5

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

W typografii początek / ˈlɛdɪŋ / odnosi się do odległości między liniami bazowymi kolejnych wierszy czcionki. Termin powstał w czasach ręcznego składu, kiedy do formularzy wprowadzano cienkie paski ołowiu, aby zwiększyć pionową odległość między wierszami pisma.

Z tego, co wiem, Android nie ma sposobu, aby to określić.

MajorTom
źródło
+1 za pomoc w lepszym zrozumieniu prowadzenia. Jeśli chodzi o zmianę wiodących, możesz użyć TextView setLineSpacingw kodzie lub android:lineSpacingExtraiw android:lineSpacingMultiplierxml.
Suragch
Dzięki - tak, powiedziano nam, że mamy użyć tego, android:lineSpacingExtraktó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.
MajorTom
1
Jeśli początkiem typograficznym jest odległość między liniami bazowymi, wydaje się, że powinno być łatwe do obliczenia.
Suragch
Tak myślałem. Czy istnieje sposób na zrobienie tego programowo? Miałem nadzieję, że dzięki metodom systemu Android może istnieć sposób, aby to zrobić. Twórcy, z którymi pracujemy, chyba nie wiedzą.
MajorTom
Minęło trochę czasu, odkąd nad tym pracowałem, ale gdybym miał zająć się tym ponownie, zacząłbym tutaj i tutaj i eksperymentowałbym z różnymi tekstami i czcionkami. Nawet jeśli nie jest to proste, nie mogę uwierzyć, że nie ma sposobu, aby obliczyć, czego potrzebujesz.
Suragch