มีหลายวิธีในการวัดความสูงขึ้นอยู่กับสิ่งที่คุณต้องการ
getTextBounds
ถ้าคุณกำลังทำสิ่งที่ต้องการได้อย่างแม่นยำตรงกลางขนาดเล็กจำนวนข้อความแก้ไขคุณอาจต้องการ คุณจะได้สี่เหลี่ยมผืนผ้าล้อมรอบแบบนี้
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
ดังที่คุณเห็นในภาพต่อไปนี้สตริงที่แตกต่างกันจะให้ความสูงต่างกัน (แสดงเป็นสีแดง)
ความสูงที่แตกต่างกันเหล่านี้อาจเป็นข้อเสียในบางสถานการณ์เมื่อคุณต้องการความสูงคงที่ไม่ว่าข้อความจะเป็นอย่างไร ดูหัวข้อถัดไป
คุณสามารถคำนวณความสูงของแบบอักษรจากเมตริกแบบอักษร ความสูงจะเท่ากันเสมอเนื่องจากได้มาจากแบบอักษรไม่ใช่สตริงข้อความใด ๆ
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
เส้นฐานคือบรรทัดที่ข้อความอยู่ โดยทั่วไปแล้วการสืบเชื้อสายจะอยู่ไกลที่สุดที่อักขระจะอยู่ต่ำกว่าเส้นและโดยทั่วไปการขึ้นจะอยู่ที่ไกลที่สุดที่อักขระจะอยู่เหนือเส้น เพื่อให้ได้ความสูงคุณต้องลบการเพิ่มขึ้นเนื่องจากเป็นค่าลบ (เส้นฐานคือy=0
และy
ลดขนาดหน้าจอ)
ดูภาพต่อไปนี้ 234.375
ความสูงของทั้งสองสายที่มี
หากคุณต้องการความสูงของบรรทัดมากกว่าความสูงของข้อความคุณสามารถดำเนินการดังต่อไปนี้:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
นี่คือbottom
และtop
ของเส้น โดยทั่วไปแล้วค่านำหน้า (ระยะห่างระหว่างบรรทัด) จะเป็นศูนย์ แต่คุณควรเพิ่มเข้าไป
ภาพด้านบนมาจากโครงการนี้ คุณสามารถเล่นกับมันเพื่อดูว่า Font Metrics ทำงานอย่างไร
สำหรับการวัดความสูงของข้อความหลายบรรทัดคุณควรใช้ไฟล์StaticLayout
. ฉันพูดถึงรายละเอียดบางอย่างในคำตอบนี้แต่วิธีพื้นฐานในการรับความสูงนี้เป็นดังนี้:
String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setAntiAlias(true);
myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
myTextPaint.setColor(0xFF000000);
int width = 200;
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();