Ada berbagai cara untuk mengukur ketinggian tergantung pada apa yang Anda butuhkan.
Jika Anda melakukan sesuatu seperti tepatnya memusatkan sejumlah kecil teks tetap, Anda mungkin ingin getTextBounds
. Anda bisa mendapatkan persegi panjang pembatas seperti ini
Rect bounds = new Rect();
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
int height = bounds.height();
Seperti yang dapat Anda lihat untuk gambar berikut, string yang berbeda akan memberikan ketinggian yang berbeda (ditunjukkan dengan warna merah).
Ketinggian yang berbeda ini bisa menjadi kerugian dalam beberapa situasi ketika Anda hanya membutuhkan ketinggian konstan tidak peduli apa teksnya. Lihat bagian selanjutnya.
Anda dapat menghitung tinggi font dari metrik font. Tingginya selalu sama karena diperoleh dari font, bukan string teks tertentu.
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float height = fm.descent - fm.ascent;
Garis dasar adalah garis yang ditempati teks. Keturunan umumnya karakter terjauh akan pergi di bawah garis dan pendakian umumnya karakter terjauh akan pergi di atas garis. Untuk mendapatkan ketinggian Anda harus mengurangi pendakian karena itu adalah nilai negatif. (Garis dasar adalah y=0
dan y
menurunkan layar.)
Lihatlah gambar berikut. Ketinggian untuk kedua string adalah 234.375
.
Jika Anda menginginkan tinggi garis daripada hanya tinggi teks, Anda bisa melakukan hal berikut:
float height = fm.bottom - fm.top + fm.leading; // 265.4297
Ini adalah bottom
dan top
dari garis. Yang memimpin (interline spacing) biasanya nol, tetapi Anda tetap harus menambahkannya.
Gambar di atas berasal dari proyek ini . Anda dapat bermain-main dengannya untuk melihat cara kerja Metrik Font.
Untuk mengukur ketinggian teks multi-baris Anda harus menggunakan a StaticLayout
. Saya membicarakannya secara terperinci dalam jawaban ini , tetapi cara dasar untuk mendapatkan tinggi ini adalah seperti ini:
String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";
TextPaint myTextPaint = new TextPaint();
myTextPaint.setAntiAlias(true);
myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
myTextPaint.setColor(0xFF000000);
int width = 200;
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();