ความหมายของด้านบนขึ้นพื้นฐานโคตรด้านล่างและผู้นำใน FontMetrics ของ Android


91

ดูเหมือนจะเป็นคำถามพื้นฐาน แต่ฉันไม่พบคำถามที่คล้ายกันใน SO ขณะอ่านเอกสารฉันมีปัญหาในการเข้าใจแนวคิด ฉันต้องการที่จะเข้าใจในสิ่งที่แตกต่างระหว่างtopและascentและและbottom descentและพื้นฐานอยู่ที่ไหน? คุณมีแผนภาพเพื่อช่วยให้ฉันเห็นภาพหรือไม่?

คำตอบ:


291

ก่อนอื่นเรามาดูสิ่งที่เอกสารระบุว่า :

  • ด้านบน - ระยะห่างสูงสุดเหนือเส้นฐานสำหรับสัญลักษณ์ที่สูงที่สุดในแบบอักษรตามขนาดข้อความที่กำหนด
  • ขึ้น - ระยะทางที่แนะนำเหนือเส้นฐานสำหรับข้อความที่เว้นวรรคแบบแยกเดี่ยว
  • Descent - ระยะห่างที่แนะนำด้านล่างพื้นฐานสำหรับข้อความที่เว้นวรรคแบบแยกเดี่ยว
  • ด้านล่าง - ระยะห่างสูงสุดใต้เส้นฐานสำหรับสัญลักษณ์ต่ำสุดในแบบอักษรตามขนาดข้อความที่กำหนด
  • ชั้นนำ - ช่องว่างเพิ่มเติมที่แนะนำเพื่อเพิ่มระหว่างบรรทัดของข้อความ

โปรดสังเกตว่าBaselineคือสิ่งที่วัดจากสี่อันดับแรก เป็นเส้นที่สร้างฐานที่ข้อความอยู่แม้ว่าอักขระบางตัว (เช่น g, y, j ฯลฯ ) อาจมีส่วนที่อยู่ใต้บรรทัด เปรียบได้กับเส้นที่คุณเขียนลงในสมุดบันทึกที่มีลายเส้น

นี่คือภาพเพื่อช่วยให้เห็นภาพสิ่งเหล่านี้:

FontMetrics แสดงด้านบนขึ้นพื้นฐานดีด้านล่างและนำหน้า

จำไว้ว่าเมื่อวาดบนผืนผ้าใบใน Java และ Android การลดลงคือการเพิ่มขึ้นของ y และการเพิ่มขึ้นคือการลดลงของ y นั่นหมายความว่า FontMetrics ' topและascentเป็นตัวเลขเชิงลบเนื่องจากมีการวัดจากเส้นฐาน (ในขณะที่โคตรและด้านล่างเป็นตัวเลขบวก) ดังนั้นเพื่อให้ได้ระยะทางจากtopถึงbottomคุณจะต้องทำ ( bottom- top)

ชั้นนำคือระยะห่างระหว่างด้านล่างของหนึ่งบรรทัดและด้านบนของบรรทัดถัดไปที่ ในภาพด้านบนเป็นช่องว่างระหว่างสีส้มของบรรทัดที่ 1 และสีม่วงของบรรทัดที่ 2 ดังที่ @MajorTom ระบุไว้ด้านล่างในการพิมพ์คำนี้ถูกกำหนดอย่างถูกต้องมากขึ้นว่า "ระยะห่างระหว่างเส้นฐานของบรรทัดต่อเนื่องของประเภท" *อย่างไรก็ตามดูเหมือนว่า Android จะใช้คำนี้ในแง่ประวัติศาสตร์มากกว่า คำว่า (ออกเสียง "ledding") มาจากแถบตะกั่วที่นักเรียงพิมพ์สมัยก่อนใช้วางระหว่างบรรทัดของประเภท โดยพื้นฐานแล้วเป็นเพียงวิธีปรับระยะห่างระหว่างบรรทัด ใน Android ฉันไม่เคยเห็นผู้นำเป็นอย่างอื่นนอกจาก0และฉันไม่เห็นว่ามันถูกใช้เพื่ออะไรในซอร์สโค้ด (ผมที่ถูกต้องถ้าคุณรู้จักที่จะใช้ในการคำนวณอะไร.) คุณสามารถเปลี่ยนระยะห่างระหว่างบรรทัดในTextViewกับsetLineSpacingในรหัสหรือandroid:lineSpacingExtraและandroid:lineSpacingMultiplierในรูปแบบ XML อย่างไรก็ตามวิธีการเหล่านี้ห้ามใช้หรือปรับเปลี่ยนขั้นนำ

ตรวจสอบลิงค์เหล่านี้สำหรับข้อมูลเพิ่มเติม:

สำรวจเพิ่มเติม

เพื่อที่จะสำรวจ Font Metrics ให้มากขึ้นฉันจึงสร้างโครงการง่ายๆ

ป้อนคำอธิบายภาพที่นี่

แทนที่จะแสดงรหัสทั้งหมดที่นี่ ฉันเพิ่มโครงการเพื่อ GitHub คุณสามารถโคลนโครงการหรือคัดลอกไฟล์ต่อไปนี้ไปยังโปรเจ็กต์ใหม่

ตัวอักษรเคยอยู่ด้านบนtopหรือด้านล่างbottom?

ไม่ปกติ แต่ทำได้ ตามที่ฉันเข้าใจด้านบนและด้านล่างถูกกำหนดโดยแบบอักษร (ดังนั้น "FontMetrics") ดังนั้นผู้สร้างแบบอักษรจึงสามารถสร้างสัญลักษณ์ให้สูงกว่าสิ่งที่พวกเขากล่าวว่าด้านบนคือ (หรือต่ำกว่าด้านล่าง) นอกจากนี้ด้วยการรวมเครื่องหมายกำกับเสียงใน Unicode ก็สามารถเกิดขึ้นได้อย่างง่ายดาย นี่เป็นตัวอย่างที่ค่อนข้างรุนแรง (นำมาจากที่นี่): M̵̳̙͔̟̱͕̓̀̄̉̅ͧ̋͊͌͑́͌ͪ̒̿̀̚a͔̟̝͔ͥ̈́̏ͮͯ̇͆̊̒ͦͦ͘͢͜y̵̴̢͕̝̩̱͈͕̼̣͕̟̌͗̾ͤ̎͌̄ͣͨ͊ͬb̡̯̰̪̜͙̟̝̠͚̜̥̙̤̃ͨ̋̒̒̊ͧͤ͐̓͋̌̾̇̔̈́̀́͡͠e̵ͯͪ̿̿̂̄ͫ̃҉͏͎̣̹̱̜͉̦̞̪̘̠̝̝͍̼̜̖̥̭͟ ̣̞͙͚̝̰̞̹̗̲̣͙͍͍̀̓͊̂̋ͣ̏̑̍̊͌ͩ͐̎̀ͣͣ̚͟ͅh̛͋̏̍̆ͤ͛͐ͨ̌̋ͤ̎̂ͨ̂̓̑̚̕͟͏̻̣͖̖͚͚͓̲̼̪ȁ̔̅̿͐̑͡͏̝͓̮͚̘̦̰͚͎͔͉͚̮̠̕͜ͅṱ̱̼̖̓̂ͭ̏̅͂ͥ͌ͯ͌͠sͪ̓ͪ̄̌̓ͧ͋͐ͬ̅̑҉̨̪̬͎͍̥̬? ̡̮̳͙͓͔̹̘̹͓̘̻̦̣͎̫̐ͤ̐͛́͝ ̧̦̼̘͕̪̠̙͖̦̯̦̘͉͈͕͔̘̻̲͑ͨ̊̈́̐ͫ͐̌ͯ̀͘͝Ḩ̷̸̸̹͉̩̜̹̞ͯ̃̃ͧͬͨ̌̀̾̐̈̇ͧ͛̃͐̀ͦ͞A̴̦̗̬̠͙̭͉̟̺͇̭̰͔͕̯̅̃͋ͪ̈́̉̓̌ͯ̈́͆̋̀ͤ̇̂̿̈́̂͡͡Ṱ̲͎͉̣̳̺̱̜̦̬͕̣͉͇͊̌ͥ͐͒̈́̓́ͥ́́̋͂̅ͬ̆͗ͥ̕͢͡S̍ͧ͗̒͗̂̈ͬ͊̚̚͢͏̗̣̳ͅ! ̶̨̡͇͚̙͚̭̱̣̲̳̤̞̫̗̣̦̮̖̞͒͆̿̄͑̃̎͡

การเสียบสตริงนั้นเข้ากับ Android เราจะได้รับสิ่งนี้:

ป้อนคำอธิบายภาพที่นี่

เครื่องหมายกำกับเสียงจะอยู่เหนือtopและใต้เครื่องหมายbottom. เป็นที่น่าสนใจที่จะทราบว่าความกว้างและความสูงทั้งหมดนั้นวัดได้อย่างถูกต้องตามขอบเขตของข้อความ

อย่างไรก็ตามสำหรับวัตถุประสงค์ในการปฏิบัติในการเขียนโปรแกรมของคุณคุณสามารถเพียงแค่คิดว่าสูงสุดและต่ำสุดสำหรับตัวอักษรสัญลักษณ์เป็นและtop bottomและมักจะพวกเขาจะอยู่ภายในและascent descentหากด้วยเหตุผลใดก็ตามคุณต้องรู้ให้แน่ใจว่าตัวอักษรเกินtopหรือbottomคุณสามารถTextPaint.getTextBoundsใช้ได้


ดี! คุณรู้หรือไม่ว่าหน่วยการขึ้นลงการลงมา ฯลฯ วัดได้ในหน่วยใด? เป็นพิกเซลหรือไม่? เป็นค่าลอย แต่ไม่แน่ใจว่าสอดคล้องกับหน้าจออย่างไร ให้พวกเขาตรวจสอบใน photoshop เพื่อดูว่าเป็นพิกเซลหรือไม่และมีความแตกต่างเล็กน้อยของบางส่วน พิกเซลมีขนาดเล็กลง
Vikram Gupta

@VikramGupta. หน่วยเป็นพิกเซล ฉันไม่แน่ใจว่าอะไรทำให้เกิดความแตกต่างกับการตรวจสอบภาพ photoshop ของคุณ
Suragch

ขอบคุณสำหรับคำอธิบายที่เป็นประโยชน์และแอป แต่คุณช่วยอธิบายเพิ่มเติมได้ไหมว่าคือTopอะไร? จะมีตัวอักษรใดสูงพอที่จะแตะTopเส้นไหม ตัวอย่างเช่น "M", "l" ดูเหมือนจะเป็นตัวอักษรที่สูงที่สุด Topไม่มีของพวกเขาสัมผัส
Cheok Yan Cheng

@CheokYanCheng ดูการอัปเดตที่ท้ายคำตอบของฉัน
Suragch

@Suragch ขอบคุณสำหรับข้อมูล ฉันใช้แอปของคุณเพื่อทำความเข้าใจมากขึ้น ฉันคาดว่าบรรทัด "Ascent" จะแตะที่ด้านบนของแบบอักษรในลักษณะเดียวกับในภาพหน้าจอของคุณ อย่างไรก็ตามจากi.imgur.com/aRxgjvu.pngล่าสุดไม่ได้แตะอักขระที่สูงที่สุด "M" คุณมีความคิดว่าทำไม?
Cheok Yan Cheng

5

ชั้นนำไม่ใช่ช่องว่างระหว่างบรรทัดในการพิมพ์ เห็นได้ชัดว่านี่เป็นสิ่งที่รหัส Android ไม่ได้คำนึงถึง เราเคยดิ้นรนด้วยตัวเอง คำจำกัดความที่เหมาะสมของชั้นนำ ( จาก Wikipedia ):

ในการพิมพ์นำหน้า / ˈlɛdɪŋ / หมายถึงระยะห่างระหว่างเส้นฐานของบรรทัดต่อเนื่องของประเภท คำนี้เกิดขึ้นในสมัยของการเรียงพิมพ์ด้วยมือเมื่อมีการแทรกเส้นตะกั่วบาง ๆ ลงในแบบฟอร์มเพื่อเพิ่มระยะห่างแนวตั้งระหว่างบรรทัดของประเภท

จากสิ่งที่ฉันสามารถบอกได้ Android ไม่มีวิธีระบุสิ่งนี้


+1 เพื่อช่วยให้ฉันเข้าใจผู้นำได้ดีขึ้น ในการเปลี่ยนระดับชั้นนำคุณสามารถใช้ TextView setLineSpacingในโค้ดหรือandroid:lineSpacingExtraและandroid:lineSpacingMultiplierใน xml
Suragch

ขอบคุณ - ใช่เราได้รับคำสั่งให้ใช้android:lineSpacingExtraซึ่งจะทำการวัดระหว่างช่องว่างจริงระหว่างบรรทัด มันไม่ได้เป็นผู้นำ แต่ดูเหมือนเป็นวิธีเดียวในการจัดการระยะห่าง เป็นปัญหาเนื่องจากไม่มีการวัดในลักษณะการพิมพ์และไม่มีวิธีดังกล่าวในการระบุการวัดนั้นใน Sketch หรือ Zepelin (เครื่องมือที่เราใช้) แถมไม่ตรงชั้นนำอีกด้วย
MajorTom

1
ถ้าตัวพิมพ์นำหน้าคือระยะห่างระหว่างเส้นฐานดูเหมือนว่าควรจะคำนวณได้ง่าย
Suragch

นั่นคือสิ่งที่ฉันคิดว่า. มีวิธีทำแบบเป็นโปรแกรมไหม ฉันหวังว่าจะมีวิธีการที่ Android ให้ไว้ว่าอาจมีวิธีทำ นักพัฒนาซอฟต์แวร์ที่เราทำงานด้วยดูเหมือนจะไม่รู้
MajorTom

เป็นเวลานานแล้วที่ฉันได้ทำงานกับสิ่งนี้ แต่ถ้าฉันจะหยิบมันขึ้นมาอีกครั้งฉันจะเริ่มที่นี่และที่นี่และทดลองกับข้อความและแบบอักษรต่างๆ แม้ว่าจะไม่ตรงไปตรงมา แต่ฉันไม่อยากจะเชื่อเลยว่าไม่มีวิธีคำนวณสิ่งที่คุณต้องการ
Suragch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.