ฉันกำลังวัดข้อความโดยใช้Paint.getTextBounds()
เนื่องจากฉันสนใจที่จะให้ทั้งความสูงและความกว้างของข้อความแสดงผล อย่างไรก็ตามข้อความจริงที่แสดงอยู่เสมอ bit กว้างกว่า.width()
ของข้อมูลที่เต็มไปด้วยRect
getTextBounds()
ฉันประหลาดใจเมื่อฉันทดสอบ.measureText()
และพบว่ามันส่งกลับค่า (สูงกว่า) ที่แตกต่างกัน ฉันลองดูและพบว่าถูกต้อง
เหตุใดพวกเขาจึงรายงานความกว้างที่แตกต่างกัน ฉันจะรับความสูงและความกว้างได้อย่างไร ฉันหมายความว่าฉันสามารถใช้.measureText()
แต่แล้วฉันจะไม่ทราบว่าผมควรจะไว้วางใจกลับโดย.height()
getTextBounds()
ตามที่ร้องขอนี่คือรหัสขั้นต่ำในการทำให้เกิดปัญหาอีกครั้ง:
final String someText = "Hello. I believe I'm some text!";
Paint p = new Paint();
Rect bounds = new Rect();
for (float f = 10; f < 40; f += 1f) {
p.setTextSize(f);
p.getTextBounds(someText, 0, someText.length(), bounds);
Log.d("Test", String.format(
"Size %f, measureText %f, getTextBounds %d",
f,
p.measureText(someText),
bounds.width())
);
}
ผลลัพธ์แสดงให้เห็นว่าความแตกต่างไม่เพียง แต่จะได้รับมากกว่า 1 (และไม่มีข้อผิดพลาดในการปัดเศษในนาทีสุดท้าย) แต่ดูเหมือนว่าจะเพิ่มขึ้นตามขนาด (ฉันกำลังจะสรุปมากขึ้น แต่อาจขึ้นอยู่กับแบบอักษรทั้งหมด):
D/Test ( 607): Size 10.000000, measureText 135.000000, getTextBounds 134
D/Test ( 607): Size 11.000000, measureText 149.000000, getTextBounds 148
D/Test ( 607): Size 12.000000, measureText 156.000000, getTextBounds 155
D/Test ( 607): Size 13.000000, measureText 171.000000, getTextBounds 169
D/Test ( 607): Size 14.000000, measureText 195.000000, getTextBounds 193
D/Test ( 607): Size 15.000000, measureText 201.000000, getTextBounds 199
D/Test ( 607): Size 16.000000, measureText 211.000000, getTextBounds 210
D/Test ( 607): Size 17.000000, measureText 225.000000, getTextBounds 223
D/Test ( 607): Size 18.000000, measureText 245.000000, getTextBounds 243
D/Test ( 607): Size 19.000000, measureText 251.000000, getTextBounds 249
D/Test ( 607): Size 20.000000, measureText 269.000000, getTextBounds 267
D/Test ( 607): Size 21.000000, measureText 275.000000, getTextBounds 272
D/Test ( 607): Size 22.000000, measureText 297.000000, getTextBounds 294
D/Test ( 607): Size 23.000000, measureText 305.000000, getTextBounds 302
D/Test ( 607): Size 24.000000, measureText 319.000000, getTextBounds 316
D/Test ( 607): Size 25.000000, measureText 330.000000, getTextBounds 326
D/Test ( 607): Size 26.000000, measureText 349.000000, getTextBounds 346
D/Test ( 607): Size 27.000000, measureText 357.000000, getTextBounds 354
D/Test ( 607): Size 28.000000, measureText 369.000000, getTextBounds 365
D/Test ( 607): Size 29.000000, measureText 396.000000, getTextBounds 392
D/Test ( 607): Size 30.000000, measureText 401.000000, getTextBounds 397
D/Test ( 607): Size 31.000000, measureText 418.000000, getTextBounds 414
D/Test ( 607): Size 32.000000, measureText 423.000000, getTextBounds 418
D/Test ( 607): Size 33.000000, measureText 446.000000, getTextBounds 441
D/Test ( 607): Size 34.000000, measureText 455.000000, getTextBounds 450
D/Test ( 607): Size 35.000000, measureText 468.000000, getTextBounds 463
D/Test ( 607): Size 36.000000, measureText 474.000000, getTextBounds 469
D/Test ( 607): Size 37.000000, measureText 500.000000, getTextBounds 495
D/Test ( 607): Size 38.000000, measureText 506.000000, getTextBounds 501
D/Test ( 607): Size 39.000000, measureText 521.000000, getTextBounds 515