Mengukur lebar teks yang akan digambar di atas Kanvas (Android)


129

Apakah ada metode yang mengembalikan lebar (dalam piksel) teks yang akan digambar di kanvas Android menggunakan metode drawText () sesuai dengan Paint yang digunakan untuk menggambarnya?

Jawaban:


224

20
Terima kasih ini dia! Saya tidak tahu mengapa saya melewatkannya. Tujuannya adalah untuk sekadar menggambar teks di tengah layar. Pokoknya saya baru sadar bahwa saya juga bisa saja menggunakan setTextAlign (Align.CENTER) pada Paint yang digunakan untuk menggambar teks, itu menggeser asal yang ditentukan ke tengah teks yang ditarik. Terima kasih.
NioX5199

2
Hebat, terima kasih, mengatur Align on the Paint! siapa yang akan memikirkan itu ...?
Sanjay Manohar

atau Anda dapat mengatur Gravity dari textview ke 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

Jawaban tambahan

Ada sedikit perbedaan antara lebar yang dikembalikan oleh Paint.measureTextdan Paint.getTextBounds. measureTextmengembalikan lebar yang mencakup nilai advanceX glyph yang melapisi bagian awal dan akhir string. The Rectlebar dikembalikan oleh getTextBoundstidak memiliki bantalan ini karena batas adalah Rectbahwa erat membungkus teks.

sumber


2

Sebenarnya ada tiga cara berbeda untuk mengukur teks.

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)

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

Perhatikan bahwa getTextWidths bisa berguna jika Anda mencoba menentukan kapan harus membungkus teks ke baris berikutnya.

MeasTextWidth dan getTextWidth sama dan memiliki lebar lanjutan yang mengukur yang diposkan orang lain. Beberapa menganggap ruang ini berlebihan. Namun, ini sangat subjektif dan tergantung pada font.

Misalnya lebar dari batas teks ukuran sebenarnya terlihat terlalu kecil:

mengukur batas teks terlihat kecil

Namun ketika menambahkan teks tambahan, batas untuk satu huruf terlihat normal: mengukur batas teks terlihat normal untuk string

Gambar diambil dari Android Developers Guide to Custom Canvas Drawing


1

Yah saya telah melakukan dengan cara yang berbeda:

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

Semoga ini bisa membantu Anda.



0

Anda dapat menggunakan "textPaint.getTextSize ()" untuk mendapatkan lebar teks

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.