ดูเหมือนจะเป็นคำถามพื้นฐาน แต่ฉันไม่พบคำถามที่คล้ายกันใน SO ขณะอ่านเอกสารฉันมีปัญหาในการเข้าใจแนวคิด ฉันต้องการที่จะเข้าใจในสิ่งที่แตกต่างระหว่างtop
และascent
และและbottom
descent
และพื้นฐานอยู่ที่ไหน? คุณมีแผนภาพเพื่อช่วยให้ฉันเห็นภาพหรือไม่?
ดูเหมือนจะเป็นคำถามพื้นฐาน แต่ฉันไม่พบคำถามที่คล้ายกันใน SO ขณะอ่านเอกสารฉันมีปัญหาในการเข้าใจแนวคิด ฉันต้องการที่จะเข้าใจในสิ่งที่แตกต่างระหว่างtop
และascent
และและbottom
descent
และพื้นฐานอยู่ที่ไหน? คุณมีแผนภาพเพื่อช่วยให้ฉันเห็นภาพหรือไม่?
คำตอบ:
ก่อนอื่นเรามาดูสิ่งที่เอกสารระบุว่า :
โปรดสังเกตว่าBaselineคือสิ่งที่วัดจากสี่อันดับแรก เป็นเส้นที่สร้างฐานที่ข้อความอยู่แม้ว่าอักขระบางตัว (เช่น g, y, j ฯลฯ ) อาจมีส่วนที่อยู่ใต้บรรทัด เปรียบได้กับเส้นที่คุณเขียนลงในสมุดบันทึกที่มีลายเส้น
นี่คือภาพเพื่อช่วยให้เห็นภาพสิ่งเหล่านี้:
จำไว้ว่าเมื่อวาดบนผืนผ้าใบใน 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 อย่างไรก็ตามวิธีการเหล่านี้ห้ามใช้หรือปรับเปลี่ยนขั้นนำ
ตรวจสอบลิงค์เหล่านี้สำหรับข้อมูลเพิ่มเติม:
top
และbottom
)เพื่อที่จะสำรวจ 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
ใช้ได้
Top
อะไร? จะมีตัวอักษรใดสูงพอที่จะแตะTop
เส้นไหม ตัวอย่างเช่น "M", "l" ดูเหมือนจะเป็นตัวอักษรที่สูงที่สุด Top
ไม่มีของพวกเขาสัมผัส
ชั้นนำไม่ใช่ช่องว่างระหว่างบรรทัดในการพิมพ์ เห็นได้ชัดว่านี่เป็นสิ่งที่รหัส Android ไม่ได้คำนึงถึง เราเคยดิ้นรนด้วยตัวเอง คำจำกัดความที่เหมาะสมของชั้นนำ ( จาก Wikipedia ):
ในการพิมพ์นำหน้า / ˈlɛdɪŋ / หมายถึงระยะห่างระหว่างเส้นฐานของบรรทัดต่อเนื่องของประเภท คำนี้เกิดขึ้นในสมัยของการเรียงพิมพ์ด้วยมือเมื่อมีการแทรกเส้นตะกั่วบาง ๆ ลงในแบบฟอร์มเพื่อเพิ่มระยะห่างแนวตั้งระหว่างบรรทัดของประเภท
จากสิ่งที่ฉันสามารถบอกได้ Android ไม่มีวิธีระบุสิ่งนี้
setLineSpacing
ในโค้ดหรือandroid:lineSpacingExtra
และandroid:lineSpacingMultiplier
ใน xml
android:lineSpacingExtra
ซึ่งจะทำการวัดระหว่างช่องว่างจริงระหว่างบรรทัด มันไม่ได้เป็นผู้นำ แต่ดูเหมือนเป็นวิธีเดียวในการจัดการระยะห่าง เป็นปัญหาเนื่องจากไม่มีการวัดในลักษณะการพิมพ์และไม่มีวิธีดังกล่าวในการระบุการวัดนั้นใน Sketch หรือ Zepelin (เครื่องมือที่เราใช้) แถมไม่ตรงชั้นนำอีกด้วย