Ý nghĩa của trên cùng, đi lên, đường cơ sở, đi xuống, dưới cùng và hàng đầu trong FontMetrics của Android


90

Đây có vẻ như là một câu hỏi cơ bản, nhưng tôi không thể tìm thấy một câu tương tự trên SO. Trong khi đọc tài liệu , tôi đã gặp khó khăn khi nắm bắt các khái niệm. Tôi muốn hiểu những gì khác biệt là giữa topascentvà cũng bottomdescent. Và đâu là đường cơ sở? Bạn nào có sơ đồ giúp mình hình dung nhé.

Câu trả lời:


287

Trước tiên, hãy xem lại tài liệu nói gì :

  • Trên cùng - Khoảng cách tối đa phía trên đường cơ sở cho đường nét cao nhất trong phông chữ ở kích thước văn bản nhất định.
  • Đi lên - Khoảng cách được đề xuất phía trên đường cơ sở cho văn bản có khoảng cách đơn.
  • Hạ xuống - Khoảng cách được đề xuất bên dưới đường cơ sở cho văn bản có khoảng cách đơn.
  • Bottom - Khoảng cách tối đa bên dưới đường cơ sở cho glyph thấp nhất trong phông chữ ở kích thước văn bản nhất định.
  • Hàng đầu - Khoảng trống bổ sung được đề xuất để thêm vào giữa các dòng văn bản.

Lưu ý rằng Đường cơ sở là những gì bốn đầu tiên được đo lường từ. Đây là dòng tạo thành nền cho văn bản, mặc dù một số ký tự (như g, y, j, v.v.) có thể có các phần nằm bên dưới dòng. Nó có thể so sánh với những dòng bạn viết trong một cuốn sổ có lót.

Đây là một hình ảnh để giúp hình dung những điều này:

FontMetrics hiển thị trên cùng, đi lên, đường cơ sở, khá, dưới cùng và dẫn đầu

Hãy nhớ rằng khi vẽ trên canvas trong Java và Android, đi xuống là tăng y và đi lên là y giảm . Điều đó có nghĩa là FontMetrics ' topascentlà số âm vì chúng được đo từ đường cơ sở (trong khi gốc và cuối là số dương). Vì vậy, để có được khoảng cách từ topđến bottombạn sẽ cần phải làm ( bottom- top).

Các chủ đạo là khoảng cách giữa đáy của một dòng và phía trên cùng của dòng tiếp theo. Trong hình trên, đó là khoảng trống giữa màu cam của Dòng 1 và màu tím của Dòng 2. Như @MajorTom đã lưu ý bên dưới , thuật ngữ này được định nghĩa đúng hơn là "khoảng cách giữa các đường cơ sở của các dòng liên tiếp của loại." * Tuy nhiên, Android dường như sử dụng thuật ngữ này theo nghĩa lịch sử hơn. Từ này (phát âm là "ledding") xuất phát từ dải chì mà các máy sắp chữ cũ dùng để đặt giữa các dòng của loại. Về cơ bản nó chỉ là một cách để điều chỉnh khoảng cách dòng. Trong Android, tôi chưa bao giờ thực sự thấy người dẫn đầu là bất kỳ thứ gì khác ngoài0và tôi chưa thấy nó được sử dụng cho bất kỳ thứ gì trong mã nguồn. (Hãy sửa lại cho tôi nếu bạn biết nơi nó được sử dụng để tính toán bất cứ điều gì.) Bạn có thể thay đổi khoảng cách dòng trong a TextViewvới setLineSpacingtrong mã hoặc android:lineSpacingExtraandroid:lineSpacingMultipliertrong xml. Tuy nhiên, những phương pháp này không sử dụng hoặc sửa đổi phần đầu.

Kiểm tra các liên kết này để biết thêm thông tin:

Tìm hiểu thêm

Để khám phá thêm về Số liệu Phông chữ, tôi đã thực hiện một dự án đơn giản.

nhập mô tả hình ảnh ở đây

Thay vì liệt kê tất cả các mã ở đây. Tôi đã thêm dự án vào GitHub . Bạn có thể sao chép dự án hoặc sao chép các tệp sau vào một dự án mới.

Các chữ cái có bao giờ đi trên tophoặc dưới bottomkhông?

Không thường xuyên, nhưng họ có thể. Trên và dưới, theo tôi hiểu, được đặt bởi phông chữ (do đó là "FontMetrics"), vì vậy một nhà sản xuất phông chữ có thể làm cho một glyph cao hơn bất cứ điều gì họ nói trên cùng là (hoặc thấp hơn dưới cùng). Ngoài ra, với việc kết hợp các dấu phụ trong Unicode, điều đó rất dễ xảy ra. Đây là một ví dụ khá cực đoan (lấy từ đây): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡

Cắm chuỗi đó vào Android, chúng tôi nhận được điều này:

nhập mô tả hình ảnh ở đây

Các dấu phụ nằm trên topvà dưới bottom. Tuy nhiên, điều thú vị là tổng chiều rộng và chiều cao được đo chính xác bởi các giới hạn văn bản.

Dù sao, đối với tất cả các mục đích thực tế trong lập trình của bạn, bạn chỉ có thể giả định rằng giá trị tối đa và tối thiểu cho các chữ cái glyph là topbottom. Và thường họ sẽ ở trong ascentdecent. Nếu vì lý do gì, bạn cần biết chắc chắn nếu các chữ cái vượt ra ngoài tophoặc bottombạn có thể sử dụng TextPaint.getTextBounds.


Đẹp! Bạn có biết đi lên, đi xuống, vv được đo bằng đơn vị nào không? Chúng có ở dạng pixel không? Chúng là các giá trị float nhưng không chắc chắn chúng tương ứng với màn hình như thế nào. Đã kiểm tra chúng trong photoshop để xem nó có phải là pixel hay không và có sự khác biệt nhỏ một vài đơn vị; pixel nhỏ hơn.
Vikram Gupta

@VikramGupta. Các đơn vị là pixel. Tôi không chắc điều gì đã gây ra sự khác biệt với việc kiểm tra hình ảnh bằng photoshop của bạn.
Suragch

Cảm ơn vì lời giải thích hữu ích và ứng dụng. Nhưng, bạn có thể giải thích thêm, chính xác là Topgì? Sẽ có bất kỳ chữ cái nào đủ cao để chạm vào Topdòng? Ví dụ, "M", "l" dường như là chữ cái cao nhất. Không ai trong số họ chạm vào Top.
Cheok Yan Cheng

@CheokYanCheng, xem cập nhật ở cuối câu trả lời của tôi.
Suragch

@Suragch Cảm ơn vì thông tin. Tôi sử dụng ứng dụng của bạn để hiểu thêm. Tôi hy vọng dòng "Ascent" sẽ chạm vào đầu phông chữ một cách độc đáo như trong ảnh chụp màn hình của bạn. Tuy nhiên, từ i.imgur.com/aRxgjvu.png mới nhất , nó không chạm vào ký tự cao nhất "M". Bạn có bất kỳ ý tưởng tại sao?
Cheok Yan Cheng

5

Hàng đầu KHÔNG phải là khoảng cách giữa các dòng trong kiểu chữ. Rõ ràng đây là điều mà mã Android không tính đến. Bản thân chúng tôi đã phải vật lộn với điều này. Định nghĩa thích hợp của dẫn đầu ( từ Wikipedia ):

Trong kiểu chữ, hàng đầu / ˈlɛdɪŋ / dùng để chỉ khoảng cách giữa các đường cơ sở của các dòng liên tiếp của kiểu chữ. Thuật ngữ này bắt nguồn từ những ngày sắp chữ bằng tay, khi các dải chì mỏng được chèn vào các biểu mẫu để tăng khoảng cách thẳng đứng giữa các dòng chữ.

Từ những gì tôi có thể nói, Android không có cách nào để xác định điều này.


+1 để giúp tôi hiểu rõ hơn về hàng đầu. Khi thay đổi hàng đầu, bạn có thể sử dụng TextView setLineSpacingtrong mã hoặc android:lineSpacingExtraandroid:lineSpacingMultipliertrong xml.
Suragch

Cảm ơn - vâng, chúng tôi được yêu cầu sử dụng android:lineSpacingExtranó sẽ đặt một phép đo giữa không gian thực giữa các dòng. Nó không dẫn đầu, nhưng nó có vẻ như là cách duy nhất để quản lý khoảng cách. Đó là một vấn đề vì không có phép đo nào như vậy trong kiểu chữ và không có cách nào như vậy để chỉ định số đo đó trong Sketch hoặc Zepelin (các công cụ chúng tôi sử dụng). Thêm vào đó, nó không phù hợp với hàng đầu.
MajorTom

1
Nếu hàng đầu về kiểu chữ là khoảng cách giữa các đường cơ sở, thì có vẻ như nó sẽ dễ dàng tính toán.
Suragch

Đó là những gì tôi nghĩ. Có cách nào để làm điều đó theo chương trình không? Tôi đã hy vọng với các phương pháp mà Android cung cấp có thể có một cách để làm điều đó. Các nhà phát triển chúng tôi làm việc cùng dường như không biết.
MajorTom

Đã một thời gian kể từ khi tôi làm việc với điều này, nhưng nếu tôi muốn tiếp tục nó, tôi sẽ bắt đầu ở đâyở đây và thử nghiệm với các văn bản và phông chữ khác nhau. Ngay cả khi nó không thẳng tiến, tôi không thể tin rằng không có cách nào để tính toán những gì bạn cần.
Suragch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.