Arti dari atas, naik, dasar, turun, bawah, dan terkemuka di FontMetrics Android

90

Ini sepertinya pertanyaan dasar, tetapi saya tidak dapat menemukan yang serupa di SO. Saat membaca dokumentasi , saya mengalami kesulitan memahami konsepnya. Saya ingin memahami apa perbedaan antara topdan ascentdan juga bottomdan descent. Dan di mana tepatnya garis dasarnya? Apakah Anda memiliki diagram untuk membantu saya memvisualisasikannya?

Suragch
sumber

Jawaban:

287

Pertama-tama mari kita tinjau apa yang dikatakan dokumentasinya :

  • Atas - Jarak maksimum di atas garis dasar untuk mesin terbang tertinggi dalam font pada ukuran teks tertentu.
  • Ascent - Jarak yang disarankan di atas garis dasar untuk teks spasi tunggal.
  • Descent - The direkomendasikan jarak di bawah dasar untuk teks spasi diasingkan.
  • Bawah - Jarak maksimum di bawah garis dasar untuk mesin terbang terendah pada font pada ukuran teks tertentu.
  • Leading - Ruang tambahan yang direkomendasikan untuk menambahkan antar baris teks.

Perhatikan bahwa Baseline adalah tempat pengukuran empat pertama. Ini adalah garis yang membentuk dasar tempat teks berada, meskipun beberapa karakter (seperti g, y, j, dll.) Mungkin memiliki bagian yang berada di bawah garis. Ini sebanding dengan baris yang Anda tulis di buku catatan bergaris.

Berikut adalah gambar untuk membantu memvisualisasikan hal-hal ini:

FontMetrics menampilkan top, ascent, baseline, decent, bottom, dan leading

Ingatlah bahwa saat menggambar pada kanvas di Java dan Android, turun adalah peningkatan y dan ke atas adalah penurunan y. Itu berarti FontMetrics ' topdan ascentmerupakan angka negatif karena diukur dari baseline (sedangkan descent dan bottom adalah angka positif). Jadi, untuk mendapatkan jarak dari topke bottomAnda perlu melakukan ( bottom- top).

Garis terdepan adalah jarak antara bagian bawah satu baris dan puncak baris berikutnya. Pada gambar di atas, ini adalah spasi antara oranye dari Baris 1 dan ungu dari Baris 2. Seperti yang dicatat @MajorTom di bawah ini , dalam tipografi istilah ini lebih tepat didefinisikan sebagai "jarak antara garis dasar dari jenis garis yang berurutan." * Namun, Android tampaknya menggunakan istilah tersebut dalam arti yang lebih historis. Kata (dilafalkan "ledding") berasal dari strip utama yang digunakan oleh juru ketik lama untuk meletakkan di antara baris jenis. Itu pada dasarnya hanya cara untuk menyesuaikan spasi baris. Di Android, saya tidak pernah benar-benar melihat yang terdepan menjadi apa pun selain0dan saya belum pernah melihatnya digunakan untuk apa pun di kode sumber. (Koreksi saya jika Anda tahu di mana itu digunakan untuk menghitung apa pun.) Anda dapat mengubah spasi baris TextViewdengan setLineSpacingdalam kode atau android:lineSpacingExtradan android:lineSpacingMultiplierdalam xml. Metode ini , bagaimanapun, tidak menggunakan atau mengubah petunjuk.

Lihat tautan berikut untuk informasi lebih lanjut:

Jelajahi lebih lanjut

Untuk menjelajahi Font Metrics lebih banyak, saya membuat proyek sederhana.

masukkan deskripsi gambar di sini

Daripada mencantumkan semua kode di sini. Saya menambahkan proyek ke GitHub . Anda dapat menggandakan proyek, atau menyalin file berikut ke dalam proyek baru.

Apakah huruf pernah naik topatau turun bottom?

Biasanya tidak, tapi mereka bisa. Atas dan bawah, seperti yang saya pahami, diatur oleh font (oleh karena itu "FontMetrics"), sehingga pembuat font dapat membuat mesin terbang lebih tinggi dari apa pun yang mereka katakan bahwa bagian atas (atau lebih rendah dari bagian bawah). Selain itu, dengan menggabungkan tanda diakritik di Unicode, hal itu dapat terjadi dengan sangat mudah. Berikut adalah contoh yang agak ekstrim (diambil dari sini): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡

Menancapkan string itu ke Android, kami mendapatkan ini:

masukkan deskripsi gambar di sini

Tanda diakritik berada di atas topdan di bawah bottom. Menarik untuk dicatat bahwa lebar dan tinggi total diukur dengan benar oleh batas teks.

Bagaimanapun, untuk semua tujuan praktis dalam pemrograman Anda, Anda dapat berasumsi bahwa maks dan min untuk huruf glyph adalah topdan bottom. Dan biasanya mereka akan tetap di dalam ascentdan decent. Jika karena alasan apapun Anda perlu tahu pasti apakah surat-surat itu melampaui topatau bottomdapat Anda gunakan TextPaint.getTextBounds.

Suragch
sumber
Bagus! Tahukah Anda dalam satuan apa pendakian, penurunan, dll. Diukur? Apakah mereka dalam piksel? Mereka adalah nilai float tetapi tidak yakin bagaimana kesesuaiannya dengan layar. Buat mereka diperiksa di photoshop untuk melihat apakah itu piksel dan ada sedikit perbedaan pada beberapa unit; piksel menjadi lebih kecil.
Vikram Gupta
@Bayu_joo Satuannya adalah piksel. Saya tidak yakin apa yang menyebabkan perbedaan dengan pemeriksaan gambar photoshop Anda.
Suragch
Terima kasih atas penjelasan yang berguna dan aplikasinya. Tapi, bisakah kamu menjelaskan lebih lanjut, apa sebenarnya itu Top? Apakah akan ada huruf yang cukup tinggi untuk menyentuh Topgaris? Misalnya, "M", "l" sepertinya adalah huruf tertinggi. Tak satu pun dari mereka menyentuh Top.
Cheok Yan Cheng
@CheokYanCheng, lihat update di akhir jawaban saya.
Suragch
@Suragch Terima kasih atas infonya. Saya menggunakan aplikasi Anda untuk memahami lebih lanjut. Saya berharap baris "Ascent" hanya akan menyentuh bagian atas font dengan baik seperti di screenshot Anda. Namun, dari i.imgur.com/aRxgjvu.png terbaru , tidak menyentuh karakter tertinggi "M". Apakah kamu tahu kenapa?
Cheok Yan Cheng
5

Leading BUKAN spasi antar baris dalam tipografi. Rupanya ini adalah sesuatu yang tidak diperhitungkan oleh kode Android. Kami sendiri telah berjuang dengan ini. Definisi yang tepat untuk memimpin ( dari Wikipedia ):

Dalam tipografi, leading / ˈlɛdɪŋ / mengacu pada jarak antara garis dasar dari garis tipe yang berurutan. Istilah ini berasal dari zaman penyusunan huruf dengan tangan, ketika potongan tipis timah dimasukkan ke dalam formulir untuk meningkatkan jarak vertikal antara garis jenis.

Dari apa yang saya tahu, Android tidak memiliki cara untuk menentukan ini.

MajorTom
sumber
+1 untuk membantu saya memahami memimpin dengan lebih baik. Sejauh mengubah petunjuknya, Anda dapat menggunakan TextView setLineSpacingdalam kode atau android:lineSpacingExtradan android:lineSpacingMultiplierdalam xml.
Suragch
Terima kasih - ya kami diberitahu untuk menggunakan android:lineSpacingExtrayang akan membuat pengukuran antara ruang aktual di antara garis. Ini tidak memimpin, tapi sepertinya satu-satunya cara untuk mengatur jarak. Ini masalah karena tidak ada pengukuran seperti itu dalam tipografi, dan tidak ada cara untuk menentukan ukuran itu di Sketch atau Zepelin (alat yang kami gunakan). Ditambah itu tidak cocok dengan yang terdepan.
MajorTom
1
Jika ujung tipografi adalah jarak antar garis dasar, sepertinya itu mudah untuk dihitung.
Suragch
Itulah yang saya pikir. Apakah ada cara untuk melakukannya secara terprogram? Saya berharap dengan metode yang disediakan Android mungkin ada cara untuk melakukannya. Pengembang yang bekerja dengan kami sepertinya tidak tahu.
MajorTom
Sudah lama sejak saya bekerja dengan ini, tetapi jika saya akan mengambilnya lagi saya akan mulai di sini dan di sini dan bereksperimen dengan teks dan font yang berbeda. Sekalipun tidak langsung, saya tidak percaya bahwa tidak ada cara untuk menghitung apa yang Anda butuhkan.
Suragch