2012-08-10 10 views
11

Sto provando a utilizzare la tela HTML5 per tracciare una linea rossa a sinistra di una linea verde. Qui è il mio javascript:Perché non riesco a disegnare due righe di colori diversi nel mio canvas HTML5?

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 
var canvasContext = canvas.getContext('2d'); 
canvasContext.beginPath(); 

// Draw the red line. 
canvasContext.strokeStyle = '#f00'; 
canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.stroke(); 

// Draw the green line. 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#0f0'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas);​ 

Tuttavia, in Google Chrome, ottengo una linea verde scuro a sinistra di una linea verde chiaro. Perché? Ho chiamato ictus due volte giusto? Quindi, perché il mio primo colpo dovrebbe influenzare il mio secondo?

Here è un JSFiddle che illustra cosa intendo.

risposta

17

Non si sta chiamando canvasContext.beginPath(); quando si inizia a disegnare la seconda linea.

Per rendere le sezioni di disegno più indipendente, ho aggiunto spazio bianco:

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 

var canvasContext = canvas.getContext('2d'); 

// Draw the red line. 
canvasContext.beginPath(); 
canvasContext.strokeStyle = '#f00'; 
canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.stroke(); 

// Draw the green line. 
canvasContext.beginPath(); 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#0f0'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas); 

Demo: http://jsfiddle.net/AhdJr/2/

+0

Grazie, se è il caso, ho una seconda domanda: perché la linea a sinistra è più scura dell'altra? Non ho impostato un valore di opacità per nessuna riga, quindi perché la tela ha unito i colori? – dangerChihuahua007

+0

Sinceramente non ne ho idea. Guardando la [documentazione] (http://dev.w3.org/html5/2dcontext/#dom-context-2d-beginpath), sembra che 'beginPath()' cancella i sottotracciati, quindi probabilmente la seconda linea è (in qualche modo) una combinazione di quella precedente e quella attuale. – Blender

+0

Penso che sia perché lo hai disegnato due volte, se togli il tratto iniziale, saranno entrambi gli stessi colori, anche se questo è ancora strano, non penso che i frame buffer siano stati cancellati, quando chiami più volte stroke, o qualcosa a che fare con l'opacità predefinita. –

3

molto interessante per quanto posso dire il modo in cui WebGL e del lavoro OpenGL è come una grande macchina a stati, in cui si definisce uno stato, disegnare, aggiornare lo stato di disegnare di nuovo, e così via ...

Benchè Non sono sicuro che la tela segua gli stessi principi anche se è pensata per semplici rendering 2D.

Sono riuscito a farlo funzionare semplicemente iniziando un nuovo percorso.

var canvas = document.createElement('canvas'); 
canvas.height = 150; 
canvas.width = 150; 
var canvasContext = canvas.getContext('2d'); 
canvasContext.beginPath(); 

// Draw the red line. 

canvasContext.moveTo(10, 0); 
canvasContext.lineTo(10, 100); 
canvasContext.strokeStyle = '#FF0000'; 
canvasContext.stroke(); 

canvasContext.beginPath(); // begin new path 
// Draw the green line. 
canvasContext.moveTo(50, 0); 
canvasContext.strokeStyle = '#00FF00'; 
canvasContext.lineTo(50, 100); 
canvasContext.stroke(); 

document.body.appendChild(canvas);​ 

ho limitato esperienza con WebGL così se Im sbaglio per favore correggetemi.

+0

Sono abbastanza sicuro che l'elemento Canvas e WebGL sono cose diverse. – Blender

+0

@Blender sì, penso che il loro strumento sia diverso Non sono sicuro che la tela segua gli stessi principi che * segue, sembra proprio dai codici di esempio rispetto ad opengl, sai come ottenere il contesto impostando il colore e così, così Non posso davvero essere troppo sicuro, grazie. –

Problemi correlati