Sepertinya saya tidak bisa menambahkan teks ke kanvas jika teks tersebut menyertakan "\ n". Maksud saya, jeda baris tidak muncul / berfungsi.
ctxPaint.fillText("s ome \n \\n <br/> thing", x, y);
Kode di atas akan menggambar "s ome \n <br/> thing"
, dalam satu baris.
Apakah ini batasan fillText atau apakah saya salah melakukannya? "\ n" ada di sana, dan tidak dicetak, tetapi juga tidak berfungsi.
fillText()
beberapa kali dan gunakan tinggi font Anda untuk memisahkan, atau gunakan developer.mozilla.org/en-US/docs/Web/API/TextMetrics developer.mozilla.org/en-US/docs/Web/API /… - atau, gunakan salah satu "solusi" yang sangat rumit di bawah ini yang tidak menggunakan TextMetrics ...Jawaban:
Saya khawatir itu adalah batasan Canvas '
fillText
. Tidak ada dukungan multi-jalur. Lebih buruk lagi, tidak ada cara built-in untuk mengukur tinggi garis, hanya lebarnya, membuat melakukannya sendiri lebih sulit!Banyak orang telah menulis dukungan multi-line mereka sendiri, mungkin proyek yang paling terkenal adalah Mozilla Skywriter .
Inti dari apa yang perlu Anda lakukan adalah beberapa
fillText
panggilan sambil menambahkan tinggi teks ke nilai y setiap kali. (Saya yakin mengukur lebar M adalah apa yang dilakukan penulis langit untuk memperkirakan teks.)sumber
measureText()
telah ditambahkan yang saya pikir bisa memecahkan masalah. Chrome memiliki bendera untuk mengaktifkannya, tetapi browser lain belum ...!Jika Anda hanya ingin menangani karakter baris baru dalam teks, Anda dapat mensimulasikannya dengan memisahkan teks pada baris baru dan memanggil beberapa kali
fillText()
Sesuatu seperti http://jsfiddle.net/BaG4J/1/
Saya baru saja membuat bukti pembungkus konsep ( bungkus absolut pada lebar yang ditentukan. Belum ada penanganan kata yang melanggar )
contoh di http://jsfiddle.net/BaG4J/2/
Dan bukti konsep yang membungkus kata ( melanggar ruang ).
contoh di http://jsfiddle.net/BaG4J/5/
Dalam contoh kedua dan ketiga saya menggunakan
measureText()
metode yang menunjukkan berapa panjang ( dalam piksel ) string akan saat dicetak.sumber
Mungkin datang ke pesta ini agak terlambat, tetapi saya menemukan tutorial berikut untuk membungkus teks di kanvas dengan sempurna.
http://www.html5canvastutorials.com/tutorials/html5-canvas-wrap-text-tutorial/
Dari situ saya bisa berpikir untuk membuat multi baris berfungsi (maaf Ramirez, milik Anda tidak berhasil untuk saya!). Kode lengkap saya untuk membungkus teks di kanvas adalah sebagai berikut:
Di mana
c
ID kanvas saya dantext
ID kotak teks saya.Seperti yang mungkin Anda lihat, saya menggunakan font non-standar. Anda dapat menggunakan @ font-face selama Anda telah menggunakan font pada beberapa teks SEBELUMNYA untuk memanipulasi kanvas - jika tidak, kanvas tidak akan mengambil font tersebut.
Semoga ini bisa membantu seseorang.
sumber
Pisahkan teks menjadi beberapa baris, dan gambar masing-masing secara terpisah:
sumber
Inilah solusi saya, memodifikasi fungsi wrapText () populer yang sudah disajikan di sini. Saya menggunakan fitur pembuatan prototipe JavaScript sehingga Anda dapat memanggil fungsi dari konteks kanvas.
Penggunaan dasar:
Inilah demonstrasi yang saya buat : http://jsfiddle.net/7RdbL/
sumber
Saya baru saja memperluas CanvasRenderingContext2D dengan menambahkan dua fungsi: mlFillText dan mlStrokeText.
Anda dapat menemukan versi terakhir di GitHub :
Dengan fungsi ini Anda dapat mengisi / stroke teks miltiline dalam sebuah kotak. Anda dapat meratakan teks secara vertikal dan horizontal. (Ini memperhitungkan \ n dan juga dapat membenarkan teks).
Prototipe tersebut adalah:
function mlFillText (teks, x, y, w, h, vAlign, hAlign, lineheight); function mlStrokeText (teks, x, y, w, h, vAlign, hAlign, lineheight);
Dimana vAlign bisa menjadi: "top", "center" atau "button" Dan hAlign bisa menjadi: "left", "center", "right" atau "justify"
Anda dapat menguji lib di sini: http://jsfiddle.net/4WRZj/1/
Berikut adalah kode pustaka:
Dan inilah contoh penggunaannya:
sumber
Uncaught ReferenceError: Words is not defined
Jika saya mencoba mengubah font. Misalnya:ctx.font = '40px Arial';
- coba masukkan itu ke biola AndaWords
variabel (case-sensitive) berasal ?? Itu tidak ditentukan di mana pun. Bagian kode itu hanya dijalankan saat Anda mengubah font ..for in
tidak berfungsi dengan baik dengan ekstensiArray.prototype
. Bisakah Anda meletakkannya di github sehingga kami dapat mengulanginya?Menggunakan javascript saya mengembangkan solusi. Itu tidak indah tetapi berhasil untuk saya:
Semoga membantu!
sumber
Kode untuk membungkus kata (melanggar spasi) yang disediakan oleh @Gaby Petrioli sangat membantu. Saya telah memperpanjang kodenya untuk memberikan dukungan untuk karakter baris baru
\n
. Selain itu, sering kali berguna untuk memiliki dimensi kotak pembatas, jadimultiMeasureText()
kembalikan lebar dan tingginya.Anda dapat melihat kodenya di sini: http://jsfiddle.net/jeffchan/WHgaY/76/
sumber
Berikut adalah versi Colin
wrapText()
yang juga mendukung teks yang berada di tengah vertikal dengancontext.textBaseline = 'middle'
:sumber
Jika Anda hanya membutuhkan dua baris teks, Anda dapat membaginya menjadi dua panggilan fillText berbeda dan memberikan garis dasar yang berbeda pada masing-masing baris.
sumber
Pertanyaan ini tidak memikirkan bagaimana kanvas bekerja. Jika Anda ingin jeda baris cukup sesuaikan koordinat Anda berikutnya
ctx.fillText
.sumber
Saya pikir Anda masih bisa mengandalkan CSS
Untungnya, melalui hack-ardry CSS (lihat Metrik Tipografi untuk lebih banyak cara untuk memperbaiki implementasi lama menggunakan pengukuran CSS), kita dapat menemukan tinggi teks melalui pengukuran offsetHeight dari a dengan properti font yang sama:
dari: http://www.html5rocks.com/en/tutorials/canvas/texteffects/
sumber
ctx.save()
,ctx.font = '12pt Arial'
laluparseInt( ctx.font, 10 )
,. Perhatikan bahwa saya menggunakan 'pt' saat mengaturnya. Ini kemudian akan diterjemahkan ke dalam PX dan dapat diubah menjadi digit untuk dikonsumsi sebagai tinggi font.Saya membuat perpustakaan kecil untuk skenario ini di sini: Canvas-Txt
Ini membuat teks dalam multi-baris dan menawarkan mode penyelarasan yang layak.
Untuk menggunakan ini, Anda perlu menginstalnya atau menggunakan CDN.
Instalasi
JavaScript
Ini akan membuat teks dalam kotak tak terlihat dengan posisi / dimensi:
Contoh Fiddle
sumber
ctx.fillText(txtline.trim(), textanchor, txtY)
saya hanya melihat ini di demo interaktif Anda di situs web Anda.2.0.9
versinya. Situs demo diperbaiki dengan memperbarui versi paket. Ada masalah dengan banyak spasi. Saya tidak tahu apakah lebih baik menggunakan paket yang memiliki opini atau mengabaikan masalahnya. Telah mendapatkan permintaan untuk ini dari berbagai tempat. Saya tetap melanjutkan dan menambahkan trim.Lorem ipsum dolor, sit <many spaces> amet
ini adalah alasan mengapa saya tidak melakukannya sejak awal. Menurut Anda, apa yang harus saya pertimbangkan untuk beberapa spasi dan hanya dihapus jika hanya ada satu?Saya tidak berpikir ini tidak mungkin juga, tetapi solusi untuk ini adalah membuat
<p>
elemen dan memposisikannya dengan Javascript.sumber
fillText()
danstrokeText()
, Anda dapat melakukan hal-hal di luar kemampuan CSS.Saya mengalami ini karena mengalami masalah yang sama. Saya bekerja dengan ukuran font variabel, jadi ini memperhitungkannya:
di mana .noteContent adalah div contenteditable yang diedit pengguna (ini bertumpuk di jQuery setiap fungsi), dan ctx.font adalah "14px Arial" (perhatikan bahwa ukuran piksel lebih dulu)
sumber
Elemen kanvas tidak mendukung karakter seperti baris baru '\ n', tab '\ t' atau tag <br />.
Cobalah:
atau mungkin beberapa baris:
sumber
Solusi ES5 saya untuk masalah ini:
Informasi lebih lanjut tentang masalah ini ada di blog saya .
sumber