Đo chiều rộng văn bản sẽ được vẽ trên Canvas (Android)


129

Có một phương thức trả về chiều rộng (tính bằng pixel) của văn bản được vẽ trên khung vẽ Android bằng phương thức drawText () theo Paint được sử dụng để vẽ nó không?

Câu trả lời:


224

20
Cảm ơn đây là nó! Tôi không biết tại sao tôi bỏ qua nó. Mục đích chỉ đơn giản là vẽ một văn bản ở giữa màn hình. Dù sao, tôi chỉ nhận ra rằng tôi cũng có thể vừa sử dụng setTextAlign (Align.CENTER) trên Paint được sử dụng để vẽ văn bản, nó chuyển nguồn gốc được chỉ định vào giữa văn bản được vẽ. Cảm ơn.
NioX5199

2
Tuyệt vời, cảm ơn, thiết lập Align trên Paint! Ai có thể nghĩ về điều đó ...?
Sanjay Manohar

hoặc bạn có thể đặt Trọng lực của chế độ xem văn bản thành Trung tâm
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

Bổ sung câu trả lời

Có một sự khác biệt nhỏ giữa chiều rộng được trả về bởi Paint.measureTextPaint.getTextBounds. measureTexttrả về chiều rộng bao gồm giá trị AdvanceX của glyph đệm ở đầu và cuối chuỗi. Các Rectchiều rộng được trả về bởi getTextBoundskhông có đệm này vì các giới hạn là Rectrằng chặt chẽ kết thúc tốt đẹp các văn bản.

nguồn


2

Thực tế có ba cách đo văn bản khác nhau.

GetTextBound:

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()

Đo lườngWidth:

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)

Và 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()

Lưu ý rằng getTextWidths có thể hữu ích nếu bạn đang cố xác định thời điểm bọc văn bản cho dòng tiếp theo.

Các biện pháp đo lườngWWth và getTextWidth bằng nhau và có chiều rộng nâng cao mà thước đo mà người khác đã đăng. Một số xem xét không gian này quá mức. Tuy nhiên, điều này rất chủ quan và phụ thuộc vào phông chữ.

Ví dụ: chiều rộng từ giới hạn văn bản đo có thể thực sự trông quá nhỏ:

giới hạn văn bản trông nhỏ

Tuy nhiên, khi thêm một văn bản bổ sung, giới hạn cho một chữ cái trông bình thường: giới hạn đo văn bản trông bình thường cho chuỗi

Hình ảnh được lấy từ Hướng dẫn dành cho nhà phát triển Android để vẽ Canvas tùy chỉnh


1

Vâng, tôi đã làm theo cách khác nhau:

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());

Hy vọng điều này sẽ giúp bạn.


0

Tôi đã sử dụng các phương thức đo lường () và getTextPath () + computeBound () và xây dựng một Excel với tất cả các thuộc tính văn bản cho phông chữ có kích thước cố định có thể tìm thấy trong https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx . Ở đó bạn cũng sẽ tìm thấy các công thức đơn giản cho các thuộc tính văn bản khác như tăng dần, v.v.

Các ứng dụng cũng như các chức năng drawFontTest () để tạo ra các giá trị thô được sử dụng trong excel cũng có sẵn trong repo này.


0

bạn có thể sử dụng "textPaint.getTextSize ()" để có chiều rộng văn bản

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.