การวัดความกว้างข้อความที่จะวาดบน Canvas (Android)


129

มีวิธีที่จะส่งกลับความกว้าง (เป็นพิกเซล) ของข้อความที่จะวาดบนผืนผ้าใบ Android โดยใช้วิธี drawText () ตาม Paint ที่ใช้ในการวาดหรือไม่

คำตอบ:


224

20
ขอบคุณนี่! ฉันไม่รู้ว่าทำไมฉันถึงข้ามไป จุดประสงค์คือเพื่อวาดข้อความตรงกลางหน้าจอ อย่างไรก็ตามฉันเพิ่งรู้ว่าฉันสามารถใช้ setTextAlign (Align.CENTER) บน Paint ที่ใช้ในการวาดข้อความได้มันจะเลื่อนจุดเริ่มต้นที่ระบุไปที่กึ่งกลางของข้อความที่วาด ขอบคุณ
NioX5199

2
เยี่ยมมากขอบคุณตั้งค่า Align on the Paint! ใครจะนึกถึงสิ่งนั้น ...
Sanjay Manohar

หรือคุณสามารถตั้งค่า Gravity ของมุมมองข้อความเป็น Center
yeradis

32
Paint paint = new Paint();
Rect bounds = new Rect();

int text_height = 0;
int text_width = 0;

paint.setTypeface(Typeface.DEFAULT);// your preference here
paint.setTextSize(25);// have this the same as your text size

String text = "Some random text";

paint.getTextBounds(text, 0, text.length(), bounds);

text_height =  bounds.height();
text_width =  bounds.width();

12

คำตอบเพิ่มเติม

มีความแตกต่างเล็กน้อยระหว่างความกว้างที่ส่งกลับโดยเป็น และPaint.measureText ส่งกลับความกว้างที่มีค่า AdvanceX ของ glyph ที่เติมจุดเริ่มต้นและจุดสิ้นสุดของสตริง กว้างกลับโดยไม่ได้มีการขยายขอบเขตนี้เพราะเป็นที่แน่นตัดข้อความPaint.getTextBoundsmeasureTextRectgetTextBoundsRect

แหล่ง


2

ที่จริงแล้วมีสามวิธีในการวัดข้อความ

GetTextBounds:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
paint.getTextBounds(contents, 0, 1, rect)
val width = rect.width()

MeasureTextWidth:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val width = paint.measureText(contents, 0, 1)

และ getTextWidths:

val paint = Paint()
paint.typeface = ResourcesCompat.getFont(context, R.font.kaushanscript)
paint.textSize = 500f
paint.color = Color.argb(255, 3, 221, 252)
val contents = "g"
val rect = Rect()
val arry = FloatArray(contents.length)
paint.getTextBounds(contents, 0, contents.length, rect)
paint.getTextWidths(contents, 0, contents.length, arry)
val width = ary.sum()

โปรดทราบว่า getTextWidths อาจมีประโยชน์หากคุณกำลังพยายามพิจารณาว่าจะตัดข้อความไปที่บรรทัดถัดไปเมื่อใด

measureTextWidth และ getTextWidth เท่ากันและมีความกว้างขั้นสูงที่วัดว่าคนอื่นโพสต์ บางคนคิดว่าพื้นที่นี้มากเกินไป อย่างไรก็ตามนี่เป็นอัตนัยและขึ้นอยู่กับแบบอักษร

ตัวอย่างเช่นความกว้างจากขอบเขตข้อความวัดจริง ๆ แล้วอาจดูเล็กเกินไป:

ขอบเขตข้อความวัดดูมีขนาดเล็ก

อย่างไรก็ตามเมื่อเพิ่มข้อความเพิ่มเติมขอบเขตของตัวอักษรหนึ่งตัวจะดูเป็นปกติ: ขอบเขตข้อความวัดดูเป็นปกติสำหรับสตริง

ภาพที่ถ่ายจากคู่มือผู้พัฒนา Android ไปจนถึงการวาดภาพบนผืนผ้าใบที่กำหนดเอง


1

ฉันได้ทำไปแล้วในวิธีที่ต่างกัน:

String finalVal ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(40);
Typeface typeface = Typeface.createFromAsset(getAssets(), "Helvetica.ttf");
paint.setTypeface(typeface);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);

Rect result = new Rect();
paint.getTextBounds(finalVal, 0, finalVal.length(), result);

Log.i("Text dimensions", "Width: "+result.width()+"-Height: "+result.height());

หวังว่านี่จะช่วยคุณได้


0

ฉันใช้เมธอด measureText () และ getTextPath () + computeBounds () และสร้าง Excel ด้วยคุณลักษณะข้อความทั้งหมดสำหรับแบบอักษรขนาดคงที่ที่สามารถพบได้ภายใต้https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx ที่นั่นคุณจะพบสูตรง่าย ๆ สำหรับแอตทริบิวต์ข้อความอื่น ๆ เช่นสูงขึ้นเป็นต้น

แอปเช่นเดียวกับฟังก์ชั่นdrawFontTest ()สำหรับการสร้างค่าวัตถุดิบที่ใช้ใน Excel นอกจากนี้ยังมีใน repo นี้


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