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?

NioX5199
sumber

Jawaban:

224

Sudahkah Anda melihat android.graphics.Paint.measureText (String txt) ?

Marc Bernstein
sumber
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();
hamid reza zavareh
sumber
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

Suragch
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

Jim Baca
sumber
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.

Hiren Patel
sumber
0

Saya menggunakan metode mengukurText () dan getTextPath () + computeBounds () dan membangun Excel dengan semua atribut teks untuk font ukuran tetap yang dapat ditemukan di bawah https://github.com/ArminJo/android-blue-display/blob /master/TextWidth.xlsx . Di sana Anda akan menemukan juga rumus sederhana untuk atribut teks lainnya seperti naik dll.

The app serta fungsi drawFontTest () untuk menghasilkan nilai-nilai baku yang digunakan dalam excel juga tersedia di repo ini.

Armin J.
sumber
0

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

Ashish John
sumber