2010-04-03 29 views
14

Non riesco a trovare la funzione per rimuovere una forma o un percorso dalla tela dopo che è stata creata.Javascript/jQuery: rimuovi forma/percorso dalla tela

Così Sto creando una curva di Bezier tra 2 punti con

beginPath(); 
bezierCurveTo(); 
stroke(); 
closePath(); 

Come posso rimuovere questo dalla tela una volta che è stato creato? Devo essere in grado di chiamare la funzione di rimozione tramite toggle() e blur(). Sono sicuro che esiste qualcosa per questo ...

Grazie in anticipo per qualsiasi aiuto!

+4

Volevo solo menzionare che l'uso di 'closePath()' qui e in molte delle risposte è sbagliato. È usato per completare un percorso disegnando una linea all'inizio del percorso. Chiamarlo dopo 'stroke' fa ** assolutamente nulla. ** http://stackoverflow.com/questions/10807230/what-exactly-is-a-canvas-path-and-what-is-the-use-of- ctx-closepath –

risposta

3

Grazie per il grande ingresso a tutti voi - mi ha aiutato a trovare la soluzione:

context.clearRect(x,y,w,h); 

(link)

Questo sarà chiaro tutto ciò all'interno di tale rettangolo.

Ho trovato il metodo sulla pagina che ho trovato mentre scavo la risposta di ILog per salvare/ripristinare il contesto, ed è tutto lì. Grazie ancora.

0

Per quanto ricordo le specifiche, è necessario chiamare context.save() prima di disegnare, quindi disegnare qualcosa, quindi chiamare context.restore() per tornare allo stato precedente.

+1

Grazie per il suggerimento - Ho provato questo (senza successo) e poi ho trovato questa risorsa (http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html # the-canvas-state) affermando: "Il percorso corrente e la bitmap corrente non fanno parte dello stato del disegno.Il percorso corrente è persistente e può essere ripristinato solo utilizzando il metodo beginPath(). proprietà della tela, non il contesto. " Grazie comunque, molto apprezzato! Il salvataggio/ripristino – bobsoap

+0

opera solo su determinate proprietà del contesto e il loro richiamo non avrà mai un effetto visibile sull'immagine se non si disegna qualcosa successivamente. [Questo articolo] (http://www.tutorialspoint.com/html5/canvas_states.htm) fornisce ulteriori informazioni. –

3

Non è possibile rimuovere un tracciato/forma dall'area di disegno. Puoi disegnare qualcos'altro su di esso o cancellare la tela.

1

Si potrebbe provare a utilizzare SVG invece di tela. C'è una fantastica libreria chiamata Raphaël che rende il lavoro con SVG un gioco da ragazzi. Funziona anche su tutti i browser, incluso IE6.

Con SVG ogni forma è il proprio elemento che può essere spostato, trasformato o rimosso.

+0

Questo sembra fantastico, ci sto già guardando. Grazie! – bobsoap

+0

Un commento retrospettivo qui: se stai disegnando molto, SVG sarà generalmente meno performante del canvas. Attualmente sto rifattorizzando un'app che fa molto disegno in SVG sull'uso della tela. –

0

Se stai usando JQuery:

var elem = $("selector"); 
var canvas = elem.get(0); 
var context = canvas.getContext("2d"); 

context.clearRect(0, 0, canvas.width, canvas.height); 
context.beginPath(); 

sostituire "selettore" con il selettore attuale JQuery.

1

Per cancellare la tela, utilizzare il seguente codice

canvas_context.clearRect(0,0,canvas_1.width,canvas_1.height); 

Usare sempre BeginPath metodo quando si stanno iniziando a tracciare un nuovo percorso e metodo closePath dopo aver finito di disegnare il vostro percorso.

NOTA:percorsi che non sono chiusi non possono essere cancellati.

Se i percorsi non vengono cancellati, deve essere a causa del motivo sopra.

Tutti percorso deve iniziare con BeginPath() e finire con closePath()

Esempio:

 canvas_context.beginPath(); 
    canvas_context.moveTo(x1,y1); 
    canvas_context.lineTo(x2,y2); 
    canvas_context.stroke(); 
    canvas_context.closePath(); 

Il codice seguente cancella anche la tela

canvas_1.width = canvas_1.width; 

NOTA:L'istruzione sopra riportata reinizializza una tela quindi cancella una tela. Qualsiasi istruzione che reinizializza una tela cancellerà una tela.

+1

"Tutto il percorso DEVE iniziare con beginPath() e termina con closePath()" - Wrong! vedi http://stackoverflow.com/questions/10807230/what-exactly-is-a-canvas-path-and-what-is-the-use-of-ctx-closepath –

+0

Appena testato di nuovo nel mio Chrome e tu sono giusti. Nel 2011, quando ho provato questo in Chrome, i percorsi che non erano stati chiusi non sono mai stati cancellati. Comunque, grazie per l'aggiornamento. –

6

Questa è una cosa importante da realizzare su <canvas>. È un'immagine appiattita composta da pixel. Una volta che qualcosa viene attirato, è fuso nella griglia dei pixel e non può essere differenziato dagli altri pixel.

Se è necessario essere in grado di separare gli elementi dell'immagine si potrebbe:

  1. Overlay <canvas> elementi in una pila di strati
  2. Uso <svg> in cui ogni elemento visivo è distinto dagli altri elementi e può essere manipolato in modo indipendente

Si può pensare a <canvas> come a un singolo livello in PhotoShop/Gimp/Fireworks o in un documento MSPaint.

Si può pensare a <svg> come documento in Illustrator/InkScape.

18

Prova questa:

ctx.save(); 
ctx.globalCompositeOperation = "destination-out"; 
// drawing here you path second time 
ctx.restore(); 

"L'attributo globalCompositeOperation imposta come forme e immagini sono disegnati sulla bitmap zero" specs

Come funziona si può vedere here.