<p>A tag <strong>canvas</strong> foi introduzida no <em>html 5</em> como uma das maiores novidades, introduzindo uma área onde podemos desenhar elementos específicos, formas geométricas e imagens através de <em>javascript</em> substituindo em certos aspectos o uso do <em>flash</em>.</p>
<p>Então vamos ao primeiro exemplo:</p>
<pre>
<!DOCTYPE html&gt;
&lt;html&gt;
&lt;body&gt;
&lt;canvas id="canvas" width="200" height="100" style="border:1px solid #000;"&gt;
Se seu navegador não suportar HTML5 você verá esta mensagem.
&lt;/canvas&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<h3>Retângulo</h3>
<p>Para desenhar dentro da área de <em>canvas</em> devemos primeiro pegar o elemento <em>canvas</em> e pegar o contexto 2D.</p>
<pre>
window.addEventListener('load',function(){
var elem = document.getElementById('canvas');
var context = elem.getContext('2d');
});
</pre>
<p>Na linha 1 adicionamos uma função para ser executada após a página ser totalmente carregada, que executará nosso código para desenhar na <em>canvas</em>. Na linha 2 pegamos o elemento através do id que foi definido na tag e na linha 3 para pegar o contexto 2d, você deve estar se perguntando se existe um contexto 3d, no momento não pelo menos como padrão, mas exite algumas iniciativas como o <em>WebGL</em>.</p>
<p>Para desenhar retângulos podemo sutilizar vários métodos e propriedades</p>
<p><strong>fillRect(x , y , w , h ): </strong> desenha um retângulo preenchido com a cor atribuída para o atributo <em>fillStyle</em>(ex.: <em>context.fillStyle=&#8217;#0000FF';</em>). O retângulo será desenhado na posição <strong>x</strong> e <strong>y</strong> sendo esta o canto superior esquerdo e a partir deste ponto desenha para a direita a largura(w) e para baixo a altura(h).</p>
<p><strong> context.strokeRect(x, y, w, h): </strong> desenha um retângulo sem preenchimento e com uma borda. O tamanho e cor utilizados devem ser configurados através dos atributos <em>strokeStyle</em>(ex.: <em>context.strokeStyle = &#8216;#FF0000&#8242;;</em>) e <strong>lineWith</strong>(ex.: <em>context.lineWidth = 5;</em>)</p>
<p><strong>context.clearRect (x, y, w, h): </strong> limpa os pixels no retângulo especificado.</p>
<div>
<img src="http://www.botecodigital.info/wp-content/uploads/2014/12/retangulo.png" height="245" alt="retangulo" width="400" />
</div>
<pre>
context.fillStyle='#0000FF';
context.fillRect(10 , 10 , 100, 50);
context.strokeStyle = '#FF0000';
context.lineWidth = 5;
context.strokeRect(10, 100 , 100, 25);
context.fillRect (10 , 200 , 100, 50);
context.clearRect (30, 190, 50, 30);
</pre>
<p><a href="http://botecodigital.info/exemplos/canvas/teste1.html" target="_blank">Veja o exemplo</a></p>
<h3>Caminhos</h3>
<p>Podemos desenhar retas no <em>canvas</em> para isso utilizamos os métodos <em>moveTo(x,y)</em> e <em>lineTo(x,y)</em>. O método <em>moveTo</em> serve para mover o &#8220;lapís&#8221; para a posição inicial da reta e será traçada uma reta até a posição utilizada para chamar o método<em>lineTo</em>, se não foi chamado inicialmente o método <em>moveTo</em> será utilizado a posição da ultima chamada de <em>lineTo</em>. </p>
<p>Se você chamar somente os dois métodos não irá visualizar nada, porque as linhas só são efetivamente desenhadas no <em>canvas</em> quando chamado o método <em>stroke()</em></p>
<pre>
context.moveTo(10 , 10);
context.lineTo(200 , 200);
context.moveTo(50 , 10);
context.lineTo(250 , 200);
context.stroke();
</pre>
<p><a href="http://botecodigital.info/exemplos/canvas/teste2.html" target="_blank">Veja um exemplo</a></p>
<h3>Texto</h3>
<p>Textos podem ser adicionados a área de desenho com o método <em>fillText(texto , x , y )</em>. Para configurar as características do texto como tamanho, tipo da fonte, negrito/itálico é feito através do da propriedade <em>font</em> que aceita uma string com os valores separados por espaço.</p>
<pre>
context.font = "bold 24px Time New Roman";
context.fillText("Boteco ", 100, 150);
context.fillText("Digital", 140, 180);
</pre>
<p>O texto no <em>canvas</em> não se comporta como o texto no <i>CSS</i>, no caso a propriedade <em>textAlign</em> que aceita os valores <em>left</em>, <em>center</em> e <em>right</em> alinham o texto em relação ao ponto (x,y), no caso se colocarmos o alinhamento &#8220;left&#8221; o ponto informado para desenhar o texto ficará na esquerda do texto, ou seja, o texto começará no ponto. Se o alinhamento for &#8220;right&#8221; o final do texto será o ponto informado. </p>
<pre>
context.textAlign = "right";
context.fillText("right" ,200 ,350 );
</pre>
<p>Outra propriedade diferente é a <em>baseline</em> que recebe os valores <em>bottom</em>, <em>middle</em> e <em>top</em> que irá definir se o texto será plotado abaixo do ponto informado(<em>top</em>), na mesma linha(<em>middle</em>) ou abaixo(<em>top</em>).</p>
<pre>
context.textBaseline = "bottom";
context.fillText("bottom" ,10 ,170 );
</pre>
<p><a href="http://botecodigital.info/exemplos/canvas/teste3.html" target="_blank">Veja o exemplo</a></p>
<h3>Imagens</h3>
<p>Para desenhar uma imagem no <em>canvas</em> utilizamos o método <em>drawImage</em> que pode ter 3 ,5 e 9 parâmetros.</p>
<p><strong>drawImage(image, dx, dy): </strong> desenha na área de desenho a imagem passada por parâmetro a partir do ponto (dx , dy).</p>
<p><strong>drawImage(image, dx, dy, dw, dh)</strong> desenha a imagem passada e escala para a largura de dw e altura de dh.</p>
<p><strong>drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh): </strong>Pega a imagem passada por parâmetro e recorta a partir do ponto(sx,sy) até as dimensões(sw,sh) e desenha no <em>canvas</em> no ponto(dx,dy) e escala para as dimensões(dw,dh).</p>
<p>A imagem que passamos por parâmetros para o método <em>drawImage</em> pode ser um elemento <em>&lt;img&gt;</em>,ou podemos criar um através de um construtor <em>new Image()</em> e atribuir o endereço de uma imagem para o atributo <em>src</em>.</p>
<pre>
img = new Image();
img.src = "img/hero_sprites01.png";
context.drawImage( img , 30, 30);
context.drawImage( img , 200, 30 , 60 , 60);
context.drawImage( img , 0, 0 , 100 , 35 , 10, 200 , 100 , 35);
</pre>
<p><a href="http://botecodigital.info/exemplos/canvas/teste4.html" target="_blank">Veja o exemplo</a></p>
<h3>Um exemplo de animação</h3>
<pre>
var elem = null;
var context = null;
var img = Array();
window.addEventListener('load',function(){
elem = document.getElementById('canvas');
context = elem.getContext('2d');
for( i = 1 ; i &lt; 8 ; i++){
img[i] = new Image();
img[i].src = "img/hero_sprites0"+i+".png";
}
x = 1
window.setInterval(function desenha(){
context.clearRect(30,30, 200,200);
context.drawImage( img[x] , 30, 30);
x++;
if( x &gt; 7 ){
x = 2;
}
console.log(x);
}, 150);
});
</pre>
<p><a href="http://botecodigital.info/exemplos/canvas/teste5.html" target="_blank">Veja o exemplo</a></p>
<p>Da linha 9 até 12 criamos um array de imagem com cada uma das imagens que compõem a animação.</p>
<p>Na linha 14 é criado uma variável para controlar qual das imagens do array que esta sendo mostrado no momento.</p>
<p>Na linha 16 é chamado o método <em>setInterval</em> que recebe dois parâmetros, sendo o primeiro uma função que será executada de tempos em tempos, o intervalo de tempo entre uma chamada e outra é definido no segundo parâmetro, no nosso caso 150, ou seja, nossa animação será desenhada aproximadamente 6 vezes por segundo.</p>
<p>Na linha 18,já dentro da função que será repetida para desenhara animação, chamamos o método <em>clearRect</em> para limpar a área que estamos desenhando antes de desenhar a nova imagem. É necessário chamar este método pois a imagem de sprite que estamos utilizando tem fundo transparente.</p>
<p>Na linha 19 desenhamos a imagem corrente do array de imagens, na posição do <em>canvas</em> que queremos. Na linha 21 incrementamos x para que na próxima execução do método seja desenhada uma imagem diferente e na linha 22 testamos para saber se o array já chegou ao fim, caso tenha chegado voltamos nossa variavel de contator x para o inicio.</p>
<p>Alguns devem estar se perguntando &#8220;ok mas eu poderia fazer a mesma coisa com um gif&#8221;, verdade, mas esse exemplo pode ser modificado para funcionar através do teclado, para o personagem correr somente quando uma tecla for pressionada através do evento de teclado <em>onkeypress</em>, como em um jogo por exemplo.</p>
<p>Mas lembrando esta é somente o básico, já existe muitas bibliotecas de animação, que tornam a animação bem mais fácil.</p>
<p>Bem era isso T++</p>
A tag canvas, desenhando com Javascript
27 de Dezembro de 2014, 11:00 - sem comentários ainda | Ninguém está seguindo este artigo ainda.
Visualizado 42 vezes
0sem comentários ainda