Pintado carteis con canvas: Prohibido Fumar

O día 2 de xaneiro entrou en vigor a Ley Antitabaco que prohibe fumar na maioría dos locais públicos salvo excepcións contadas. Para lembrarllo a xente ten que existir a cartelería correspondente nos locais. É aquí cando vexo os carteis de "Prohibido Fumar", e o sinxelo que sería debuxalos con simples trazos de liñas e círculos. Entón venme a cabeza a idea de debuxar un cartel de prohibido fumar empregando a tag canvas para deste modo ir probando funcionalidades de HTML5.

Botando man do libro "Dive into HTML5" do autor Mark Pilgrim e do seu capítulo "Let's Call it a Draw(ing Surface)" póñome mans a obra.

Para pintar o cartel precisamos un lenzo (canvas) sobre o que imos aplicar varios métodos de código javascript:

<canvas id="cartel" width="410" height="410"></canvas>

O código javascript non é ningunha marabilla pero amosa as posibilidades da etiqueta canvas. O primeiro que se fai é recuperar o elemento canvas facendo uso de document.getElementById e despois recuperamos o contexto 2d a partir do elemento canvas con getContext.

<script type="text/javascript">
/* <![CDATA[ */
var canvas = document.getElementById('cartel');
var ctxt = canvas.getContext('2d');
var radius = 180;
var width = height = 410;
var x1, y1;
var lineWidth = 20.0;
 
function drawCabicha() {
 // Cigarro
 ctxt.beginPath();
 ctxt.moveTo(105, 200); 
 
 ctxt.lineTo(308, 200);
 ctxt.lineCap = 'butt';
 
 ctxt.lineWidth = lineWidth + 10; 
 ctxt.strokeStyle = "#000";
 ctxt.stroke(); 
 ctxt.closePath(); 
 
 ctxt.fillRect(310, 185, 10, 30);
 ctxt.fillRect(322, 185, 10, 30);
 ctxt.fillRect(334, 185, 10, 30);
}
 
function drawSinal() {
 // Círculo
 ctxt.beginPath(); 
 ctxt.arc(width/2, height/2, radius, 0 , Math.PI * 2, false);
 
 ctxt.lineWidth = lineWidth; 
 ctxt.strokeStyle = "#F00";
 ctxt.stroke(); 
 
 ctxt.closePath();
 
 // Liña
 ctxt.beginPath();
 ctxt.moveTo(0, 0);
 
 x1 = 205 - Math.ceil(Math.PI * 1/4 * radius);
 y1 = 205 - Math.ceil(Math.PI * 1/4 * radius);
 
 ctxt.moveTo(x1 + lineWidth, y1 + lineWidth);
 ctxt.lineTo(width-x1-lineWidth, height-y1-lineWidth);
 ctxt.lineCap = 'round';
 
 ctxt.lineWidth = lineWidth; 
 ctxt.strokeStyle = "#F00";
 ctxt.stroke(); 
 ctxt.closePath();
}
 
function drawFume() {
 // Fume 
 ctxt.beginPath(); 
 ctxt.arc(320, 170, 10, Math.PI/2, -Math.PI/2, false);
 ctxt.arc(320, 150, 10, Math.PI/2, -Math.PI/2, false);
 ctxt.arc(320, 130, 10, Math.PI/2, -Math.PI/2, false);
 
 ctxt.arc(320, 120, 10, -Math.PI/2, Math.PI/2, false);
 ctxt.arc(320, 140, 10, -Math.PI/2, Math.PI/2, false);
 ctxt.arc(320, 160, 10, -Math.PI/2, Math.PI/2, false);
 
 ctxt.lineWidth = 1; 
 ctxt.strokeStyle = "#FFF";
 ctxt.fillStyle = '#CCC';
 ctxt.fill(); 
 ctxt.closePath();
}
 
// Imos imprimindo por partes
setTimeout(drawCabicha, 1000);
setTimeout(drawSinal, 2000);
setTimeout(drawFume, 3000);
/* ]]> */
</script>

Un resumo dos métodos do contexto máis importantes e o que veñen facendo:

  • ctxt.moveTo, moverse a coordenada indicada
  • ctxt.lineTo, pintar unha liña dende o punto actual ao proporcionado no método
  • ctxt.fillRect, pintar un rectángulo
  • ctxt.beginPath e ctxt.closePath, bloque de comezo e fin do trazado dun path
  • ctxt.arc, pinta un arco ou un círculo dependendo dos valores do ángulo (Math.PI * 2 = 360º)

No código fonte establécense uns temporizadores para ir pintando por partes os distintos elementos do debuxo. Evidentemente esta técnica permitiría crear gráficos para estatísticas dinámicos, por exemplo. A etiqueta canvas abre un mundo de posibilidades que con HTML4 tiñamos que botar man de flash, applets java, ... outros plugins.

Descargar o código fonte  do exemplo para quen queira facer as súas modificacións e probas.

NOTA: para que este exemplo funcione en IExploter no apartado What about IE? do libro Dive into HTML5 explícase un workaround empregando o proxecto excanvas.

Última actualización 2012-08-15
2:24 AM (Europe/Madrid)
Data de creación 2011-01-03
12:49 PM (Europe/Madrid)
Pintar un cartel con canvas (HTML5)
javascript html5