Android FontMetrics'te üst, çıkış, taban çizgisi, iniş, alt ve liderin anlamı


91

Bu temel bir soru gibi görünüyor, ancak SO'da benzer bir soru bulamadım. Belgeleri okurken kavramları anlamakta güçlük çekiyordum. topVe ascentve ayrıca bottomve arasındaki farkın ne olduğunu anlamak istiyorum descent. Ve taban çizgisi tam olarak nerede? Onu görselleştirmeme yardımcı olacak bir diyagramınız var mı?

Yanıtlar:


291

Önce belgelerin ne dediğini inceleyelim :

  • Üst - Belirli bir metin boyutunda fonttaki en uzun glif için taban çizgisinin üzerindeki maksimum mesafe.
  • Yükselme - Tek aralıklı metinler için taban çizgisinin üzerinde önerilen mesafe.
  • Alçalma - Tek aralıklı metin için taban çizgisinin altında önerilen mesafe.
  • Alt - Belirli bir metin boyutunda fonttaki en düşük glif için taban çizgisinin altındaki maksimum mesafe.
  • Satır Aralığı - Metin satırları arasına eklemek için önerilen ek boşluk.

Not o Temel ilk dört ölçülen budur. Öyle hat oluşturan taban (g, y, j, vb gibi) bazı karakterler sınırının altında gitmek kısımlara sahip olabileceği halde, metin üzerinde oturuyor. Çizgili bir not defterine yazdığınız satırlarla karşılaştırılabilir.

İşte bunları görselleştirmeye yardımcı olacak bir resim:

FontMetrics üst, yükseliş, taban çizgisi, düzgün, alt ve önde gösteriliyor

Java ve Android'de bir tuval üzerine çizim yaparken, aşağı inmenin y'de bir artış ve yukarı gitmenin y'de bir azalma olduğunu unutmayın . Bu, FontMetrics'in topve ascenttaban çizgisinden ölçüldükleri için negatif sayılar olduğu anlamına gelir (iniş ve alt pozitif sayılar iken). Böylece mesafeyi almak için topiçin bottom(yapmanız gerekir bottom- top).

Ve bunu kaynak kodunda herhangi bir şey için kullanılan görmedik. (Doğru bana bunu hesapla şey için kullanılır nerede biliyorsanız.) Bir satır aralığının değiştirebilir ile kodunda veya veLider bir satır alt ve bir sonraki satırın üstüne arasındaki mesafedir. Yukarıdaki resimde, Satır 1'in turuncusu ile Satır 2'nin moru arasındaki boşluktur. @MajorTom'un aşağıda belirtildiği gibi , tipografide terim daha doğru bir şekilde "ardışık türdeki satırların taban çizgileri arasındaki mesafe" olarak tanımlanır. * Ancak Android bu terimi daha tarihsel anlamda kullanıyor gibi görünüyor. Kelime ("yerleştirme" olarak telaffuz edilir), eski dizgecilerin yazı satırları arasına koymak için kullandıkları kurşun şeritten gelir. Temelde satır aralığını ayarlamanın bir yoluydu. Android'de aslında liderin şu kadar olduğunu hiç görmedim:0TextViewsetLineSpacingandroid:lineSpacingExtraandroid:lineSpacingMultiplier xml. Ancak bu yöntemler , öncü kullanmaz veya değiştirmez.

Daha fazla bilgi için şu bağlantılara göz atın:

Daha fazlasını keşfedin

Yazı Tipi Metriklerini daha fazla keşfetmek için basit bir proje yaptım.

görüntü açıklamasını buraya girin

Tüm kodu burada listelemek yerine. Ben GitHub'dan projeyi ekledi . Ya projeyi klonlayabilir ya da aşağıdaki dosyaları yeni bir projeye kopyalayabilirsiniz.

Harfler hiç yukarı topveya aşağı gider mibottom mi?

Genelde değil ama yapabilirlerdi. Üst ve alt, anladığım kadarıyla, yazı tipi tarafından belirlenir (dolayısıyla "FontMetrics"), böylece bir yazı tipi oluşturucu, bir glifin üstte olduğunu söylediklerinden daha yükseğe (veya alttan daha aşağıya) çıkmasını sağlayabilir. Ayrıca Unicode'da aksan işaretleri birleştirildiğinde bu çok kolay bir şekilde gerçekleşebilir. İşte oldukça uç bir örnek ( buradan alınmıştır): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡

Bu dizeyi Android'e takarak şunu elde ederiz:

görüntü açıklamasını buraya girin

Aksan işaretleri üstünde gidip topaşağıda bottom. Bununla birlikte, toplam genişliğin ve yüksekliğin metin sınırları tarafından doğru bir şekilde ölçüldüğünü not etmek ilginçtir.

Her neyse, programlamanızdaki tüm pratik amaçlar için, glif harfleri için maksimum ve minimum değerlerinin topve olduğunu varsayabilirsiniz bottom. Ve genellikle ascentve içinde kalacaklar descent. Her ne sebeple olursa olsun, harflerin ötesine geçip geçmediğini bilmeniz gerekiyorsa topveya bottomkullanabilirsiniz TextPaint.getTextBounds.


Güzel! Yükseliş, iniş vb. Birimlerde ölçüldüğünü biliyor musunuz? Piksel olarak mı? Değişken değerlerdir ancak ekrana nasıl karşılık geldiklerinden emin değillerdir. Piksel olup olmadığını ve birkaç birim arasında küçük bir fark olup olmadığını görmek için Photoshop'ta kontrol ettirin; pikseller daha küçük.
Vikram Gupta

@VikramGupta. Birimler pikseldir. Photoshop görsel kontrolünüzdeki farklılığa neyin sebep olduğundan emin değilim.
Suragch

Yararlı açıklama ve uygulama için teşekkürler. Ama tam olarak ne olduğunu biraz daha açıklayabilir Topmisin? Çizgiye dokunacak kadar uzun bir harf olacak Topmı? Örneğin, "M", "l" en uzun harf gibi görünüyor. Hiçbiri dokunmuyor Top.
Cheok Yan Cheng

@CheokYanCheng, cevabımın sonundaki güncellemeye bakın.
Suragch

@Suragch Bilgi için teşekkürler. Daha fazlasını anlamak için uygulamanızı kullanıyorum. "Yükselme" satırının, ekran görüntünüzdeki gibi yazı tipinin üstüne güzelce dokunacağını umuyorum. Ancak, en sondan i.imgur.com/aRxgjvu.png'den , en uzun karakter olan "M" ye dokunmuyor. neden olduğu hakkında bir fikrin var mı?
Cheok Yan Cheng

5

Lider, tipografide satırlar arasındaki boşluk DEĞİLDİR. Görünüşe göre bu, Android kodunun hesaba katmadığı bir şey. Bununla kendimiz mücadele ediyorduk. Liderin doğru tanımı ( Wikipedia'dan ):

Tipografide, / ˈlɛdɪŋ /, ardışık yazım çizgilerinin taban çizgileri arasındaki mesafeyi ifade eder. Terim, el dizgisi günlerinde, yazıların satırları arasındaki dikey mesafeyi artırmak için formlara ince kurşun şeritleri yerleştirildiğinde ortaya çıktı.

Anlayabildiğim kadarıyla, Android'in bunu belirtmenin bir yolu yok.


Liderliği daha iyi anlamama yardımcı olduğu için +1. Uzak lider değişiyor gider gibi, TextView'un en kullanabilirsiniz setLineSpacingkodunda veya android:lineSpacingExtrave android:lineSpacingMultiplierxml.
Suragch

Teşekkürler - evet , satırlar arasındakiandroid:lineSpacingExtra gerçek boşluk arasına bir ölçüm koyacak olanı kullanmamız söylendi . Önde gelen değil, ancak aralığı yönetmenin tek yolu bu gibi görünüyor. Bu bir sorun çünkü tipografide böyle bir ölçüm yok ve bu ölçüyü Sketch veya Zepelin'de (kullandığımız araçlar) belirtmenin de bir yolu yok. Üstelik liderle eşleşmiyor.
MajorTom

1
Tipografik satır aralığı temel çizgiler arasındaki mesafeyse, hesaplanması kolay olmalı gibi görünüyor.
Suragch

Bende böyle düşünmüştüm. Bunu programlı olarak yapmanın bir yolu var mı? Android'in sağladığı yöntemlerle bunu yapmanın bir yolu olabileceğini umuyordum. Birlikte çalıştığımız geliştiriciler bilmiyor gibi görünüyor.
MajorTom

Bununla çalışmayalı epey oldu, ama eğer tekrar başlayacak olsaydım, burada ve burada başlayıp farklı metin ve yazı tiplerini denerdim. Basit olmasa bile, neye ihtiyacınız olduğunu hesaplamanın bir yolu olmadığına inanamıyorum.
Suragch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.