Adakah cara langsung untuk mengukur ketinggian teks? Cara saya melakukannya sekarang adalah dengan menggunakan Paint measureText()
untuk mendapatkan lebar, kemudian dengan coba-coba menemukan nilai untuk mendapatkan perkiraan ketinggian. Saya juga telah bermain-main dengan FontMetrics
, tetapi semua ini tampak seperti metode perkiraan yang menyedot.
Saya mencoba untuk mengukur berbagai hal untuk resolusi yang berbeda. Saya bisa melakukannya, tetapi saya berakhir dengan kode yang sangat verbose dengan banyak perhitungan untuk menentukan ukuran relatif. Saya membencinya! Harus ada cara yang lebih baik.
android
graphics
view
android-canvas
Danedo
sumber
sumber
Ada berbagai cara untuk mengukur ketinggian tergantung pada apa yang Anda butuhkan.
getTextBounds
Jika Anda melakukan sesuatu seperti tepatnya memusatkan sejumlah kecil teks tetap, Anda mungkin ingin
getTextBounds
. Anda bisa mendapatkan persegi panjang pembatas seperti iniSeperti 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.
Paint.FontMetrics
Anda dapat menghitung tinggi font dari metrik font. Tingginya selalu sama karena diperoleh dari font, bukan string teks tertentu.
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
dany
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:
Ini adalah
bottom
dantop
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.
StaticLayout
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:sumber
getTextSize()
memberi Anda ukuran font dalam satuan piksel (berbeda dengansp
satuan). @androiddeveloperJawaban @ bramp benar - sebagian, karena tidak menyebutkan batas yang dihitung akan menjadi persegi panjang minimum yang berisi teks sepenuhnya dengan koordinat awal implisit 0, 0.
Ini berarti, bahwa ketinggian, misalnya "Py" akan berbeda dari ketinggian "py" atau "hi" atau "oi" atau "aw" karena piksel-bijaksana mereka memerlukan ketinggian yang berbeda.
Ini sama sekali tidak setara dengan FontMetrics di java klasik.
Meskipun lebar teks tidak terlalu menyebalkan, tinggi adalah.
Khususnya, jika Anda perlu meluruskan tengah teks yang ditarik secara vertikal, coba dapatkan batas teks "a" (tanpa tanda kutip), alih-alih menggunakan teks yang ingin Anda buat. Bekerja untuk saya ...
Inilah yang saya maksud:
Vertikal tengah menyelaraskan teks berarti secara vertikal tengah menyelaraskan persegi panjang pembatas - yang berbeda untuk teks yang berbeda (huruf besar, huruf panjang, dll). Tetapi apa yang sebenarnya ingin kita lakukan adalah juga menyelaraskan garis dasar teks yang diberikan, sehingga teks tersebut tidak tampak terangkat atau beralur. Jadi, selama kita tahu pusat huruf terkecil ("a" misalnya) kita kemudian dapat menggunakan kembali perataannya untuk sisa teks. Ini akan memusatkan menyelaraskan semua teks dan juga menyelaraskan garis dasar teks.
sumber
x >> 1
. Putuskan hanya untuk itu :)x / 2
dan mengoptimalkannya untukx >> 1
x / 2
jauh lebih ramah saat membaca kode, mengingat komentar Chris.buffer
dalam contoh ini? Apakah inicanvas
diteruskan kedraw(Canvas)
metode?Ketinggian adalah ukuran teks yang telah Anda tetapkan pada variabel Paint.
Cara lain untuk mengetahui ketinggiannya adalah
sumber
Anda bisa menggunakan
android.text.StaticLayout
kelas untuk menentukan batasan yang diperlukan dan kemudian menelepongetHeight()
. Anda dapat menggambar teks (terkandung dalam tata letak) dengan memanggildraw(Canvas)
metodenya.sumber
Anda cukup mendapatkan ukuran teks untuk objek Paint menggunakan metode getTextSize (). Sebagai contoh:
sumber
24.0f
?Anda harus menggunakan
Rect.width()
dan dariRect.Height()
mana kembaligetTextBounds()
. Itu bekerja untuk saya.sumber
Jika ada yang masih memiliki masalah, ini adalah kode saya.
Saya memiliki tampilan kustom yang persegi (lebar = tinggi) dan saya ingin menetapkan karakter ke dalamnya.
onDraw()
menunjukkan cara mendapatkan ketinggian karakter, meskipun saya tidak menggunakannya. Karakter akan ditampilkan di tengah tampilan.sumber