Sebuah pertanyaan yang mudah-mudahan cepat, tetapi saya tidak dapat menemukan contoh apa pun ... Saya ingin menulis teks multi-baris ke kustom View
melalui a Canvas
, dan di onDraw()
saya punya:
...
String text = "This is\nmulti-line\ntext";
canvas.drawText(text, 100, 100, mTextPaint);
...
Saya berharap ini akan menghasilkan jeda baris, tetapi sebaliknya saya melihat karakter samar di mana \n
itu.
Setiap petunjuk dihargai.
Paul
android
android-canvas
Paul Mennega
sumber
sumber
Layout
daripada meneleponCanvas.drawText
secara langsung. T&J ini menunjukkan cara menggunakan aStaticLayout
untuk menggambar teks multiline.Jawaban:
Sayangnya Android tidak tahu apa
\n
itu. Apa yang harus Anda lakukan adalah menghapus\n
dan mengimbangi Y untuk mendapatkan teks Anda di baris berikutnya. Jadi seperti ini:sumber
drawText()
?Saya menemukan cara lain menggunakan tata letak statis. Kode di sini untuk dirujuk siapa saja:
sumber
canvas.getWidth()
harus benar-benargetWidth() - getPaddingLeft() - getPaddingRight()
, untuk memperhitungkan padding tampilan. Selain itu, perhatikan bahwa Anda dapat menghitung StaticLayout hanya saat teks atau ukuran tampilan Anda berubah dan menggambarnya tanpa membuat yang baru, yang mungkin lebih baik!Lakukan iterasi melalui setiap baris:
sumber
Saya telah menulis contoh lengkap
colors.xml
kelas java
sumber
int noOfLines = gText.split("\n").length
Ini adalah solusi saya yang didasarkan pada jawaban @ Dave (terima kasih btw ;-))
Saya mencoba mewarisi Canvas, tetapi itu tidak benar-benar membiarkan Anda. Jadi ini kelas di antara!
sumber
Saya harus menambahkan di sini versi saya yang mempertimbangkan STROKE WIDTH juga.
sumber
itu akan berhasil. saya diuji
Sumber: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/
sumber
Iya. Gunakan
canvas.getFontSpacing()
sebagai kenaikan. Saya sudah mencobanya sendiri karena penasaran dan berfungsi untuk semua ukuran font.sumber
coba ini
sumber
Saya menggunakan kembali solusi yang diusulkan oleh GreenBee dan membuat fungsi untuk menggambar beberapa teks multi baris ke dalam batas-batas tertentu dengan "..." di bagian akhir jika terjadi pemotongan:
sumber
Solusi tanpa StaticLayout
sumber
Saya bekerja dengan apa yang saya miliki, yang telah mengubah satu baris menjadi kanvas, dan saya mengerjakan jawaban Lumis, dan saya berakhir dengan ini. 1.3 dan 1.3f dimaksudkan sebagai padding antar baris, relatif terhadap ukuran fonta.
sumber
Saya menghadapi masalah serupa. tapi saya harus mengembalikan jalur teks. Anda dapat menggambar jalur ini di atas Kanvas. ini kode saya. Saya menggunakan Break Text. dan path.op
dan untuk menemukan teks terikat saya menggunakan fungsi ini
sumber
Untuk Pengguna Kotlin. Teks multiline dapat dibuat menggunakan StaticLayout . Temukan penjelasan yang bagus dan cara menggunakannya sebagai fungsi ekstensi di sini. https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a
sumber
Selain menggambar teks multiline, seseorang mungkin kesulitan mendapatkan batas teks multiline (misalnya untuk meratakannya di kanvas).
Default
paint.getTextBounds()
tidak akan berfungsi dalam kasus ini karena ini akan mengukur satu-satunya baris.Untuk kenyamanan, saya membuat 2 fungsi ekstensi ini: satu untuk menggambar teks multiline, dan yang lainnya untuk mendapatkan batas teks.
Sekarang menggunakannya semudah itu: Untuk menggambar teks multiline:
Untuk mengukur teks:
val bounds = yourPaint.getTextBoundsMultiLine (teks)
Dalam hal ini, itu akan mengukur semua teks dari awal sampai akhir dan dengan menggunakan Rect default sekali dialokasikan (bisa berubah).
Anda dapat bermain-main dengan melewatkan parameter ekstra untuk fleksibilitas ekstra.
sumber
Contoh saya dengan Dynamic Text Sizing dan spacing, Berfungsi bagus untuk saya ...
sumber