Saya mencoba menampilkan teks menggunakan kode di bawah ini. Masalahnya adalah bahwa teks tidak terpusat secara horizontal. Ketika saya mengatur koordinat untukdrawText
, itu menetapkan bagian bawah teks pada posisi ini. Saya ingin teks yang akan digambar sehingga teks dipusatkan juga secara horizontal.
Ini adalah gambar untuk menampilkan masalah saya lebih lanjut:
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//canvas.drawRGB(2, 2, 200);
Paint textPaint = new Paint();
textPaint.setARGB(200, 254, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(font);
textPaint.setTextSize(300);
canvas.drawText("Hello", canvas.getWidth()/2, canvas.getHeight()/2 , textPaint);
}
java
android
android-activity
android-canvas
drawtext
Sebastian
sumber
sumber
Jawaban:
Coba yang berikut ini:
sumber
float halfLength = text.length() / 2f;
Ini disebut tipe promosi .Paint.descent()
danPaint.ascent()
) dengan pendekatan ke pusat teks denganPaint.getTextBounds()
jawaban saya di bawah.Paint.descent()
danPaint.ascent()
jangan memperhitungkan teks yang sebenarnya. (Anda dapat mengenali ketidakakuratan ini dalam tangkapan layar di pos saya di bawah ini.) Itulah mengapa saya akan merekomendasikan menentang pendekatan ini. Pendekatan denganPaint.getTextBounds()
tampaknya bekerja lebih akurat.Pusatkan dengan Paint.getTextBounds () :
Paint.Align.CENTER tidak berarti bahwa titik referensi teks terpusat secara vertikal. Titik referensi selalu ada di garis dasar. Jadi, mengapa tidak menggunakan Paint.Align.LEFT ? Anda harus tetap menghitung titik referensi.
Paint.descent () memiliki kekurangan, yaitu tidak mempertimbangkan teks asli. Paint.descent () mengambil nilai yang sama, terlepas dari apakah teks berisi huruf dengan keturunan atau tidak. Itu sebabnya saya menggunakan r.bottom sebagai gantinya.
Saya punya beberapa masalah dengan Canvas.getHeight () jika API <16. Karena itulah saya menggunakan Canvas.getClipBounds (Rect) . (Jangan gunakan Canvas.getClipBounds (). GetHeight () karena mengalokasikan memori untuk Rect .)
Untuk alasan kinerja, Anda harus mengalokasikan objek sebelum digunakan di onDraw () . Sebagai drawCenter () akan dipanggil di dalam onDraw () objek Rect r dialokasikan sebagai bidang di sini.
Saya mencoba memasukkan kode dua jawaban teratas ke dalam kode saya sendiri (Agustus 2015) dan membuat tangkapan layar untuk membandingkan hasilnya:
Teks harus dipusatkan di dalam persegi panjang penuh merah. Kode saya menghasilkan teks putih, dua kode lainnya sama sekali menghasilkan teks abu-abu (sebenarnya sama, tumpang tindih). Teks abu-abu sedikit terlalu rendah dan dua di sebelah kanan.
Inilah cara saya melakukan tes:
sumber
Menyelaraskan secara vertikal sulit karena penurunan teks dan kenaikan, banyak orang menggunakan Paint.getTextBounds () untuk mengambil TextWidth dan TextHeight, tetapi itu tidak membuat pusat teks terlalu banyak. Di sini kita dapat menggunakan Paint.measureText () untuk menghitung TextWidth, TextHeight yang kita lakukan dengan mengurangkan dengan menurun dan naik, maka kita mendapat pendekatan TextSize paling banyak, pekerjaan berikut ini cukup mudah untuk satu sama lain.
Omong-omong, kami sangat merekomendasikan menggunakan RectF daripada Rect karena posisi membutuhkan nilai yang lebih akurat, dalam pengalaman saya, RectF melakukan penyimpangan atas & bawah hanya satu piksel pada perangkat xhdpi, Rect akan menjadi dua lagi.
sumber
Kode Anda menggambar pusat garis dasar teks, di tengah tampilan. Dalam rangka untuk pusat teks di beberapa titik, x, y, Anda perlu menghitung pusat teks, dan menempatkan bahwa pada titik.
Metode ini akan menggambar teks yang terpusat di titik x, y. Jika Anda melewatinya tengah tampilan Anda, itu akan menarik teks yang terpusat.
sumber
android.graphics.Paint
sedang digunakan untuk menggambar teksSaya menemukan bahwa solusi terbaik untuk teks keterpusatan adalah sebagai berikut:
sumber
berfungsi untuk saya gunakan: textPaint.textAlign = Paint.Align.CENTER dengan textPaint.getTextBounds
hasilnya adalah:
sumber
Saya membuat metode untuk menyederhanakan ini:
rectF adalah area yang Anda inginkan untuk menggambar teks, Itu saja. Detail
sumber
Jika kita menggunakan tata letak statis
Layout.Alignment.ALIGN_CENTER ini akan melakukan trik. Tata letak statis juga telah mendapat banyak keunggulan lainnya.
Referensi: Dokumentasi Android
sumber
Ini bekerja untuk saya:
jika ada yang menemukan masalah tolong ket saya tahu
sumber
Dalam kasus saya, saya tidak harus meletakkan teks di tengah kanvas, tetapi di roda yang berputar. Meskipun saya harus menggunakan kode ini untuk berhasil:
Lalu saya memanggil metode ini dari kelas View:
sumber