2012-08-24 16 views
5

Nella mia tela html 5, disegno il testo (che deve essere su 1 riga) ma deve essere una dimensione e uno stile di carattere costanti e anche la larghezza dello spazio che ho è costante. Pertanto il testo deve adattarsi a quello spazio, ma il problema si verifica quando il testo è troppo lungo e supera lo spazio.html5 canvas - Come posso allungare il testo?

Quindi c'è un modo per estendere/comprimere il testo in orizzontale? (come in PhotoShop)

Qualcosa come convertirlo in un'immagine quindi cambiare la larghezza dell'immagine? Non sono sicuro se questo è il modo migliore ...

Grazie

+0

si desidera allungare/comprimerlo ma il testo deve essere una dimensione costante? –

+0

deve essere una dimensione costante prima del tratto. Ad esempio, lo stile del carattere deve essere 30px Arial, e quindi se supera il limite, ottiene un ridimensionamento della larghezza dell'80%. – omega

+0

@omega: si desidera ridimensionare solo se non si adatta o ridimensionarlo sempre alla larghezza esatta dello spazio? – pimvdb

risposta

1

Una soluzione semplice è quello di richiamare il testo in un altro (in memoria) tela e poi usare drawImage per incollare il contenuto di tela in tela vera destinazione.

Qualcosa di simile (lascia che sia parametrizzabile a seconda delle esigenze, qui si estende con un rapporto di 100 a 80):

var tempimg = document.createElement('canvas'); 
tempimg.width = 100; 
tempimg.height = 10; 
oc = tempimg.getContext('2d'); 
oc.fillText(...) 
yourdestcontext.drawImage(tempimg, 0, 0, 100, 10, x, y, 80, 10); 
+0

per la larghezza, posso usare la percentuale invece dei pixel? – omega

+0

In questo caso, poiché la sorgente è larga 100 px, sì. Altrimenti dovresti calcolare la larghezza di destinazione in base alla tua percentuale. –

9

È possibile utilizzare measureText per determinare la dimensione del testo, poi scala la tela, se necessario: http://jsfiddle.net/eGjak/887/.

var text = "foo bar foo bar"; 
ctx.font = "30pt Arial"; 

var width = ctx.measureText(text).width; 
if(width <= 100) { 
    ctx.fillText(text, 0, 100); 
} else { 
    ctx.save(); 
    ctx.scale(100/width, 1); 
    ctx.fillText(text, 0, 100); 
    ctx.restore(); 
} 
+2

Ciò equivale a fornire 'maxWidth' come da suggerimento @MrOBrian: http://jsfiddle.net/eGjak/888/. – pimvdb

+0

+1 Non conoscevo la funzione di scala di Canvas. Questa è una risposta molto migliore della mia. –