Bagaimana cara mendapatkan lebar string di Android?

104

Saya ingin mendapatkan ketinggian juga jika memungkinkan.

Mikael Lindlöf
sumber

Jawaban:

201

Anda dapat menggunakan getTextBounds(String text, int start, int end, Rect bounds)metode objek Paint. Anda dapat menggunakan objek paint yang disediakan oleh a TextViewatau membuatnya sendiri dengan tampilan teks yang Anda inginkan.

Menggunakan Textview Anda dapat melakukan hal berikut:

Rect bounds = new Rect();
Paint textPaint = textView.getPaint();
textPaint.getTextBounds(text, 0, text.length(), bounds);
int height = bounds.height();
int width = bounds.width();
jujur
sumber
5
@Frank: Bagaimana jika String adalah string yang direntangkan?
Ashwin
Jawaban yang bagus. Ngomong-ngomong, hasilnya akan lebih akurat jika dipanggil textView.setTextSize().
li2
81

Jika Anda hanya membutuhkan lebar, Anda dapat menggunakan:

float width = paint.measureText(string);

http://developer.android.com/reference/android/graphics/Paint.html#measureText(java.lang.String)

SharkAlley
sumber
4
Selain itu, jika Anda ingin mengukur teks dengan ukuran font tertentu dapat Anda gunakan TextPaint paint = new TextPaint(); paint.setTextSize(textSize);. textSizedalam piksel.
Nathan Reline
Dan untuk mendapatkan tinggi badan?
Pangeran
19

Ada dua ukuran lebar yang berbeda untuk sebuah teks. Salah satunya adalah jumlah piksel yang telah digambar dalam lebarnya, yang lainnya adalah jumlah 'piksel' yang harus dimajukan kursor setelah menggambar teks.

paint.measureText dan paint.getTextWidths mengembalikan jumlah piksel (dalam float) yang harus dimajukan kursor setelah menggambar string yang diberikan. Untuk jumlah piksel yang dicat, gunakan paint.getTextBounds seperti yang disebutkan dalam jawaban lain. Saya percaya ini disebut 'Maju' dari font.

Untuk beberapa font, kedua ukuran ini berbeda (banyak), misalnya font Black Chancery memiliki huruf-huruf yang melampaui huruf lainnya (tumpang tindih) - lihat kapital 'L'. Gunakan paint.getTextBounds seperti yang disebutkan dalam jawaban lain untuk melukis piksel.

arberg
sumber
6

Saya telah mengukur lebar dengan cara ini:

String str ="Hiren Patel";

Paint paint = new Paint();
paint.setTextSize(20);
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(str, 0, str.length(), result);

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

Ini akan membantumu.

Hiren Patel
sumber
3

Kemungkinan besar Anda ingin mengetahui dimensi yang dicat untuk string teks tertentu dengan font tertentu (yaitu yang khusus Typefaceseperti keluarga font "sans-serif" dengan gaya BOLD_ITALIC, dan ukuran tertentu dalam sp atau px).

Daripada menggembungkan penuh TextView, Anda bisa turun ke tingkat yang lebih rendah dan bekerja dengan Paintobjek secara langsung untuk teks satu baris , misalnya:

// Maybe you want to construct a (possibly static) member for repeated computations
Paint paint = new Paint();

// You can load a font family from an asset, and then pick a specific style:
//Typeface plain = Typeface.createFromAsset(assetManager, pathToFont); 
//Typeface bold = Typeface.create(plain, Typeface.DEFAULT_BOLD);
// Or just reference a system font:
paint.setTypeface(Typeface.create("sans-serif",Typeface.BOLD));

// Don't forget to specify your target font size. You can load from a resource:
//float scaledSizeInPixels = context.getResources().getDimensionPixelSize(R.dimen.mediumFontSize);
// Or just compute it fully in code:
int spSize = 18;
float scaledSizeInPixels = TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP,
            spSize,
            context.getResources().getDisplayMetrics());
paint.setTextSize(scaledSizeInPixels);

// Now compute!
Rect bounds = new Rect();
String myString = "Some string to measure";
paint.getTextBounds(myString, 0, myString.length(), bounds);
Log.d(TAG, "width: " + bounds.width() + " height: " + bounds.height());



Untuk teks multi-baris atau bentang ( SpannedString), pertimbangkan untuk menggunakan a StaticLayout, di mana Anda memberikan lebar dan tinggi. Untuk jawaban yang sangat terperinci tentang mengukur dan menggambar teks ke kanvas dalam tampilan kustom, lihat: https://stackoverflow.com/a/41779935/954643

Juga perlu diperhatikan balasan @ arberg di bawah ini tentang piksel yang dicat vs lebar muka ("jumlah piksel (dalam float) yang kursornya harus ditingkatkan setelah menggambar string yang diberikan"), jika Anda perlu mengatasinya.

qix
sumber
2

Saya ingin berbagi cara yang lebih baik (lebih fleksibel daripada jawaban yang diterima saat ini) untuk mendapatkan lebar yang tepat dari teks yang digambar ( String) dengan menggunakan kelas statis StaticLayout:

StaticLayout.getDesiredWidth(text, textPaint))

metode ini lebih akurat daripada textView.getTextBounds(), karena Anda dapat menghitung lebar satu baris dalam multiline TextView, atau Anda mungkin tidak menggunakannya TextViewuntuk memulai (misalnya dalam Viewimplementasi kustom ).

Cara ini mirip dengan textPaint.measureText(text), namun tampaknya lebih akurat dalam kasus yang jarang terjadi.

Serj Ardovic
sumber