JavaScript


Canvas API

Remi Forax

Canvas API ?

“The canvas element is part of HTML5 and allows for dynamic, scriptable rendering of 2D shapes and bitmap images. It is a low level, procedural model that updates a bitmap.”

source: Wikipedia.org - Canvas Element

API des Canvas ?

“L'élément canvas est une partie du HTML5 et permet d'afficher dynamiquement avec un script des figures 2D et des images bitmap. C'est un modèle procédural de bas niveau qui met à jour une image.”

source : Wikipedia.org - L'élément Canvas

Historique des versions

La spécification est en 2 parties
  1. un élément canvas
  2. un objet context 2D

 

HTML 5 Canvas2014
Context 2D2015

Un Canvas

Déclaré avec la balise <canvas>


<canvas id="canvas-id"
        width="250"
        height="180"></canvas>
                                        

accessible en Javascript avec getElementById

document.getElementById()

L'arbre DOM correspondant au canvas doit avoir été créé au moment de l'appel à document.getElementById()

 


<script>
  let canvas = document.getElementById("canvas-id");
  // canvas == null
</script>
<canvas id="canvas-id"></canvas>
                    

Sinon document.getElementById() renvoie null

window.onload

permet enregistrer une fonction qui sera appelée une fois que le document HTML est chargé


<script>
  window.onload = () => {
    let canvas = document.getElementById("canvas-id");
    // canvas != null
  };
</script>
<canvas id="canvas-id"></canvas>
                    

window.onload() est appelée après que le canvas a été créé

L'API Canvas

permet de dessiner avec JavaScript sur un canvas HTML

 


<canvas id="canvas-example1"
        width="250"
        height="180"></canvas>
                                        

Le context 2D

On récupère l'élément Canvas par son nom
puis on demande le contexte de dessin 2D pour dessiner.

 

Il existe aussi un context 3D, défini par la specification WebGL.

Les coordonnées

Le point (x=0, y=0) est en haut à gauche

x : coordonnée sur l'axe horizontal (vers la droite)
y : coordonnée sur l'axe vertical (vers le bas)

 

L'état du context

La façon d'afficher dépend de l'état de propriétés du context

Par exemple, l'affichage de la couleur d'un rectangle dépend de la propriété stokeStyle

Couleur

Les couleurs sont les mêmes que les couleurs de CSS

Gradient linéaire

On définit un gradient linéaire par deux points (x1, y1) (x2, y2) puis plusieurs couleurs (color stops) sur une échelle entre 0 et 1

Gradient circulaire

On définit un gradient circulaire par 2 cercles (x1, y1, r1) (x2, y2, r2)

opérations sur un canvas

  • Afficher un texte
  • Afficher une figure simple
  • Afficher des figures complexes
  • Afficher une image
  • Gestion des évènements

Afficher un texte

stroke = trait
fill = remplissage

On peut faire des effets d'ombre en dessinant avec un décalage d'1 ou 2 pixels

Afficher un rectangle

stroke = trait
fill = remplissage

Afficher une ligne

moveTo déplace le crayon, lineTo place une ligne,
beginPath indique le début d'un chemin, stroke dessine

Style d'une ligne

lineWith
épaisseur du trait
lineCap: butt | round | square
bout des lignes
lineJoin: bevel | round | miter
jointure entre les lignes

Afficher un cercle/ellipse

arc(x, y, radius, startAngle, endAngle)
les angles sont en radians !

Le point d'angle 0 est au centre à droite et on tourne dans le sens des aiguilles d'une montre

Afficher une image

Lorsqu'une est fini de charger, image.onload() est appelée.

Afficher une image (2)

On peut spécifier onLoad en utilisant une closure, ce qui évite de devoir trouver un nom à la fonction.

c'est une closure car les variables context et image sont prises du scope englobant !

Évènements

Évènements clavier

La fonction window.addEventListener permet d'enregistrer une fonction qui sera appelée sur un évènement clavier d'un type donné.

Appuyer sur la touche 'a'

keydow / keyup

"keydown" si on appuie sur une touche,
"keyup" si on relâche la touche.

Appuyer sur la touche 'a'

Récupérer les touches

keyCode permet de récupérer le code (plus ou moins ASCII) de la touche

Utiliser les touches 'r' et 't' pour bouger le carré

Évènements souris

onmousedown, onmousemove, onmouseup sont appelées lorsque l'on utilise la souris sur un élément

La fonction recoit un évènement (event) contenant les coordonées (offsetX et offsetY)

Évènements souris (2)

onmousemove est appelée lorsque l'on bouge la souris,
si l'on veut détecter si l'on bouge en appuyant,
il faut un booléen supplémentaire

setTimeout

setTimeout(action, temps) permet de déclencher une action après un temps d'attente (en ms)

setTimeout (2)

on peut appeler setTimeout() plusieurs fois avec la même fonction

 

setInterval

window.setInterval permet de rappeler une fonction à intervalles réguliers

 

requestAnimationFrame

demande une animation dès que possible