Guida HTML5: il Canvas – Parte 3

Benvenuto alla terza parte di questa guida dedicata al Canvas. Ora che conosciamo tutti i meccanismi di base che regolano questo strumento, possiamo cominciare a creare qualcosa di più complesso e decisamente più interessante come un rudimentale programma di disegno.

Prepariamo l’interfaccia

Come prima cosa dobbiamo associare delle azioni a ogni possibile evento del mouse, ovvero: onMouseDown (quando il pulsante del mouse è premuto sull’elemento), onMouseUp (quando il pulsante del mouse viene rilasciato), onMouseOut (quando il puntatore lascia l’elemento) e onMouseMove (quando il puntatore si muove all’interno dell’elemento).

// definisco le variabili
var canvas;
var context;
window.onload = function() {
    // associo canvas e contesto alle variabili
    canvas = document.getElementById("progDisegno");
    context = canvas.getContext("2d");
    // collego gli eventi
    canvas.onmousedown = inizioDisegno;
    canvas.onmouseup = interrompoDisegno;
    canvas.onmouseout = interrompoDisegno;
    canvas.onmousemove = disegno;
};

Per iniziare a utilizzare il programma, l’utente dovrà selezionare uno dei colori differenti dalla barra degli strumenti e definirne lo spessore. Andremo a realizzare questi elementi attraverso dei semplici tag <img> clickabili.

<div class="strumenti">
            seleziona colore<br>
            <img id="rosso" src="imgs/rosso.jpg" alt="rosso" onclick="modificaColore('rgb(203,17,18)', this)">
          <img id="blu" src="imgs/blu.jpg" alt="blu" onclick="modificaColore('rgb(23,17,203)', this)"> 
           <img id="verde" src="imgs/verde.jpg" alt="verde" onclick="modificaColore('rgb(12,167,78)', this)">
      </div>

Come puoi vedere l’attributo onclick del tag <img> richiama una funzione JavaScript denominata modificaColore. Questa funzione dovrà accettare due parametri: il colore e il riferimento all’icona cliccata.

// funzione modificaColore
// Tengo traccia della precedente icona colore selezionata
var colorePrecedente;
function modificaColore(color, img) {
      // modifico il colore in quello corrente.
     context.strokeStyle = color;
     // attribuisco la classe selezionato all’elemento cliccato.
      img.className = "selezionato";
      // rimuovo la classe selezionato agli altri elementi
      if (colorePrecedente != null) colorePrecedente.className = "";
      colorePrecedente = img;
}

Ripetiamo lo stesso procedimento adattandolo per settare lo spessore attraverso il metodo lineWidth:

// funzione modificaSpessore
// Tengo traccia della precedente icona spessore selezionata
var spessorePrecedente;
function modificaSpessore(spessore, img) {
      // modifico il colore in quello corrente.
      context.lineWidth = spessore;
      // attribuisco la classe selezionato all’elemento cliccato.
      img.className = "selezionato";
      // rimuovo la classe selezionato agli altri elementi
      if (spessorePrecedente != null) spessorePrecedente.className = "";
      spessorePrecedente = img;
}

Definiamo le azioni

Come prima cosa abbiamo bisogno di definire e settare una variabile globale, che denomineremo disegnoAttivo, da poter interpellare a ogni azione per conoscere l’attuale stato:

    var disegnoAttivo = false;

Dopodiché possiamo creare la funzione inizioDisegno che all’inizio di quest’articolo abbiamo associato all’evento onmousedown:

function inizioDisegno(e) {
      // setto la variabile su true
      disegnoAttivo = true;
      // inizio un nuovo path con colore e spessore correnti
      context.beginPath();
      // posiziono l'inizio in corrispondenza del puntatore del mouse
      context.moveTo(e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop);
}

Proseguiamo con la funzione disegno:

function disegno(e) {
      if (disegnoAttivo == true) {
        // trovo la posizione attuale del puntatore
        var x = e.pageX - canvas.offsetLeft;
        var y = e.pageY - canvas.offsetTop;
        // disegno la linea fino all'attuale posizione del mouse
        context.lineTo(x, y);
        context.stroke(); 
      }
}

E terminiamo con la funzione interrompoDisegno nella quale settiamo la variabile disegnoAttivo su false:

function interrompoDisegno () {
    disegnoAttivo = false;
}

Salviamo il risultato

Ora che tutte le azioni utili al disegno vero e proprio sono state definite, possiamo creare le ulteriori due necessarie al salvataggio e alla pulizia.

Cominciamo col trattare la più semplice delle due, la funzione pulisci:

function pulisci() {
    context.clearRect(0, 0, canvas.width, canvas.height);
}

Come puoi vedere non è altro che un semplice richiamo al metodo clearRect. La funzione salva, invece, attraverso il metodo toDataUrl converte l’immagine in una sequenza di caratteri formattati come fosse un URL:

function salva() { 
      // aggancio l'elemento img
      var imageCopy = document.getElementById("savedImageCopy");
      // mostro i dati del canvas nell'elemento
      imageCopy.src = canvas.toDataURL();  
      // Visualizzo il div che contiene il tag img
      var imageContainer = document.getElementById("savedCopyContainer");
      imageContainer.style.display = "block";
}

Ovviamente non dimentichiamo di aggiungere i comandi per richiamare l’azione appena definita nell’HTML principale del nostro programma:

<div class="strumenti">
    <button onclick="salva()">salva</button>
    <button onclick="pulisci()">pulisci</button>
    <div id="boxSalvataggio">
      <img id="imgSalvataggio"><br>
      Premi il tasto destro per salvare
    </div>
  </div>

Con questo metodo, tuttavia, per salvare l’immagine sarà necessario che l’utente, attraverso il tasto destro del mouse, faccia clic fisicamente su “Salva immagine con nome…”. Certo, questa non è la soluzione ottimale ma è la più semplice da attuare in un contesto come questa guida che ha come unico argomento l’HTML5.

Conclusione

Nel corso di questo articolo abbiamo imparato come creare un basilare programma di disegno utilizzando pienamente alcuni metodi messi a disposizione da Canvas. Nella prossima lezione impareremo le ultime nozioni sul Canvas, ovvero come ritagliare immagini, utilizzare pattern e sfumature, gestire le ombre.

Ti ricordo che, come consuetudine, puoi scaricare il codice completo di questa versione da questo link!

GUIDA HTML5: GLI ARTICOLI
1) Guida HTML5:Introduzione
2) Guida HTML5: la prima pagina
3) Guida HTML5: la struttura
4) Guida HTML5: Immagini e outlines
5) Guida HTML5: nuovi elementi semantici 
6) Guida HTML5: i form – Parte 1 
7) Guida HTML5: i form – Parte 2
8) Guida HTML5: i form – Parte 3
9) Guida HTML5: i form – Parte 4
10) Guida HTML5:i tag audio e video – parte 1
11) Guida HTML5:i tag audio e video – parte 2
12) Guida HTML5: I player video
13) HTML5: Il Canvas – Parte 1
14) Guida HTML5: Il Canvas – Parte 2
15) HTML5: Il Canvas – Parte 3
16) HTML5: Il Canvas – Parte 4
17) HTML5: Web storage

Tag: , , ,

L'autore

Da sempre appassionato di nuove tecnologie, guadagno il pane quotidiano scrivendo fiumi di funzioni, tonnellate di script, sciami di variabili: insomma un infinità di codice! Amante dei viaggi e del viaggio, scompongo le mie esperienze lontano da casa in complesse logiche procedurali e in stupendi design. Ancora in cerca del tag giusto per descrivere la mia vita.

Altri articoli scritti da

Articoli correlati

Potresti essere interessato anche ai seguenti articoli:

2 commenti

Trackback e pingback

  1. Guida HTML5: il canvas – parte 2 | Your Inspiration Web
    […] 15) HTML5: Il Canvas – Parte 3 […]
  2. Guida HTML5: il canvas – parte 1 | Your Inspiration Web
    […] GUIDA HTML5: GLI ARTICOLI 1) Guida HTML5:Introduzione 2) Guida HTML5: la prima pagina 3) Guida HTML5: la struttura 4)…

Lascia un Commento