vifito.eu

Web Development & Open Source

  • Aumentar o tamaño da fonte
  • Tamaño do texto por defecto
  • Diminuir o tamaño do texto

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:

Código HTML coa tag canvas#cartel
1
<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.

Código javascript que imprime o cartel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<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º)

 

Na seguinte imaxe fanse as correspondencias do código co resultado do debuxo:

cartel-prohibido-fumar

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.

Na sección Código fonte > Javascript das descargas está dispoñible 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.