Front End

10 set, 2014

Uma abordagem independente de plataforma para programação gráfica com HTML5 – Parte 01

Publicidade

O HTML5 ajuda o navegador a interpretar um aplicativo dinâmico de forma artística e interativa, o que anteriormente era resolvido com aplicativos desktop como o Qt ou Cairo. Podemos citar como exemplo o site do desenvolvedor Marius Watz, que possui um gráfico alterando permanentemente o canvas com movimentos de flâmulas coloridas. Os códigos JavaScript também auxiliam o HTML5, atraindo novos recursos visuais com o pressionar de um botão. O elemento canvas do HTML, em que este artigo se baseia, finalmente dá aos web designers uma ferramenta interativa e livre para desenho – e em quase qualquer plataforma, como você pode ver a partir da lista presente na tabela 1.

Tabela 1: Compatibilidade de navegadores

Navegador Sistema Operacional Canvas (versão) Canvas 3D/WebGL SVG(versão) Inline SVG (versão) Canvas e SVG (data da versão)
Android Android 2.1 3.0 3.0 02/2011
Chrome Linux, OS X, Windows 3.0 9 1.0 7.0 10/2009
Firefox Linux, OS X, Windows 1.5 4.0 1.5/2 4.0 10/2006
Firefox Mobile Android, iPhone 4 Beta 4 Beta 4 Beta em Beta
Internet Explorer Windows 9 9 9 03/2011
Opera Linux, OS X, Windows 9.0 11 8 (SVG Tiny), 9 12 06/2006
Opera Mini Android, iPhone, Windows Mobile (exceto Windows 7) 5.0 (parcial) 4 (limitado) 08/2009
Opera Mobile Vários sistemas 10., Text: 11.0 10.0 03/2010
Safari OS X, Windows 3.1 5.2 3.2 5.1 11/2008
Safari (iPhone) iPhone 3.2 3.1 08/2010
Windows Phone 7 Windows Phone 7 7.5 7.5 7.5 Obsoleto em 2011

Adoção tardia do XML e do SVG

Efeitos semelhantes podem ser alcançados usando JavaScript para manipular imagens SVG. No HTML5, os usuários podem integrar seus códigos XML diretamente na marcação HTML, tornando muito mais fácil acessar os elementos individuais através da interface DOM do navegador. Um exemplo disso – e o princípio de projeto pode ser facilmente aplicado a, por exemplo, manuais interativos – é a visualização animada da coluna de Trajano, pelo utilizador “Hk kng”, da Wikimedia (figura 1).

Figura 1: Imagens SVG não são apenas úteis para imagens estáticas. JavaScript animados com SVG, como esta coluna antiga, que você pode desmontar clicando sobre ela, dá aos desenvolvedores web uma opção fácil de interação através da interface DOM do navegador.
Figura 1: Imagens SVG não são apenas úteis para imagens estáticas. JavaScript animados com SVG, como esta coluna antiga, que você pode desmontar clicando sobre ela, dá aos desenvolvedores web uma opção fácil de interação através da interface DOM do navegador.

O único navegador que faz as coisas por si só, nesse sentido, é o Internet Explorer, que só introduziu o Canvas e o suporte para SVG em março de 2011 na versão 9. Novas melhorias são prometidas para a versão 10. Além disso, algumas bibliotecas JavaScript convertem de forma transparente os elementos da API Canvas e do SVG proprietárias para a linguagem gráfica VML da Microsoft, que foi introduzida no Internet Explorer 6.

Mas um porém deve ser observado: o Internet Explorer 10, que foi apresentado na Microsoft Build Conference, e os aplicativos landscape para Windows 8 (lançado em 2012), dependem fortemente de HTML5. Caso você esteja esperando que o padrão HTML5 esteja maduro em todas as plataformas, deverá ser paciente.

O HTML5 possui um status de “Last Call” no W3C, o que é equivalente a um release candidate em outros sistemas/aplicativos. Embora a padrão HTML5 não seja finalizado formalmente até o final de 2014, pouco deve mudar em termos da API Canvas – com base na experiência dos últimos dois anos. O SVG 1.1 foi padronizado oficialmente no início de 2003; no entanto, sua incorporação com o HTML5 é algo que a maioria dos navegadores não aprenderam até muito recentemente. Além disso, apenas alguns navegadores suportam o escopo completo da norma SVG.

Mobilidade obrigatória

Os recursos SVG e Canvas não estão restritos a PCs; os navegadores de smartphones e tablets usam os mesmos motores de renderização utilizados por seus irmãos maiores (figura 2). Dito isso, o Opera Mini é uma versão mais despojada de navegador e seu suporte para recursos SVG está totalmente ausente no navegador Android até a versão 3.0, devido ao seu escopo.

Figura 2: O navegador Android nativo (à esquerda) não entende o SVG em versões inferiores ao Android 3.
Figura 2: O navegador Android nativo (à esquerda) não entende o SVG em versões inferiores ao Android 3.

A situação é diferente com o Windows Phone 7, da Microsoft: o navegador nativo é baseado no Internet Explorer 7 para PCs, que não subdimensiona as novas normas do HTML5. Até agora, as restrições impostas pela Microsoft para evitar que determinados aplicativos sejam executados, exceto em tecnologias nativas da Microsoft, como C # e Silverlight, têm feito com que o uso de navegadores alternativos seja impossível. No Windows Phone 7.5, isso provavelmente vai melhorar, do ponto de vista de um navegador nativo.

Já o recentemente anunciado, e surpreendente movimento da Microsoft para fomentar o HTML5, ajuda a melhorar a situação do suporte de navegadores substancialmente. Apesar de alguns programas que foram projetados para o navegador dos PCs falharem porque seus recursos de CPU são rasos ou mesmo devido ao tamanho da tela, alguns aplicativos que possuem uma camada JavaScript para manipulação de Canvas e gráficos SVG serão executado em seu telefone de forma transparente e sem grandes modificações.

Os controles precisam de alguma melhoria. Embora manipuladores de eventos onclick capturem movimentos do mouse, e até mesmo toques na tela do smartphone ou tablet, recursos multitoque requerem uma API JavaScript escrita especialmente para esse fim.

O suporte para Canvas 2D e o suporte multiplataforma para SVG é melhor do que qualquer biblioteca construída para PCs: o HTML5 possui capacidades gráficas que estão disponíveis no Linux, Mac OS X, Windows e smartphones Android e iPhone (tabela 1).

Os desenvolvedores podem esperar suporte nativo para os navegadores de qualquer ambiente de trabalho (além do Internet Explorer, embora soluções alternativas deem aos desenvolvedores web uma opção em termos de compatibilidade com versões anteriores, até a versão 6).

Caixa de pintura

Com o Canvas, o JavaScript desenha linhas, elipses e retângulos, bem como curvas de Bézier como faria a maioria dos programas de desenho populares, só que em tempo real. A função de preenchimento de cores para as formas criadas ainda está faltando, mas gradientes e sombras são suportados.

Todo o conteúdo do Canvas pode ser girado, ampliado e modificado. O elemento Canvas é compreendido por simplesmente uma tag chamada canvas como mostrado no seguinte exemplo:

var canvas = document.getElementById("<I>Canvas‐Element<I>");
var ctx = canvas.getContext('2d');

Esse método getContext() retorna um objeto em JavaScript. O objeto contém comandos para desenho como métodos. O contexto 2D é facilmente compreendido. O objeto Canvas 2D criado por esse código fornece comandos para métodos de desenho. Uma documentação muito útil está disponível neste link, como é o padrão W3C correspondente. A listagem 1 contém um exemplo simples dos mais importantes métodos do Canvas (figura 2). As linhas 6 e 7 da listagem mencionam um arquivo de imagem em um objeto JavaScript. Uma vez que o restante do código não possui permissões para executar a imagem diretamente do servidor, este será um documento HTML dependente de um evento onload.

Listagem 1: Exemplo Canvas 2D

01 <!DOCTYPE html PUBLIC "‐//W3C//DTD XHTML 1.0 Transitional//EN" “http://www.w3.org/TR/xhtml1/DTD/xhtml1‐transitional.dtd">
02 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
03  <head>
04 <script type="text/javascript">
05  //Image object
06  var rose = new Image();
07  rose.src="rose.png";
08  //do not run until the image has been loaded
09  window.onload = function(){
10  //Canvas‐Kontext
11  var canvas = document.getElementById("mycanvas");
12 var ctx = canvas.getContext('2d');
13
14  //selling, outline
15  ctx.fillStyle = "rgba(0,255,50,0.5)";
16  ctx.strokeStyle = "rgba(150,75,0,1)";
17
18  //Shadow
19  ctx.shadowOffsetX = 2;
20  ctx.shadowOffsetY = 3;
21  ctx.shadowBlur = 5;
22  ctx.shadowColor = "#888888"
23
24 //Rectangle
25 ctx.fillRect(50,50,125,125);
26  ctx.strokeRect(50,50,125,125);
27 
28  //draw path object
29  ctx.beginPath();
30  ctx.moveTo(25, 25);
31  ctx.lineTo(105, 25);
32  ctx.arc(125, 25, 20, ‐Math.PI, 0, false)
33  ctx.lineTo(145, 125);
34  ctx.bezierCurveTo(80, 145, 105, 105, 25, 125)
35  ctx.closePath();
36
37  //fill path object
38  ctx.fillStyle = "rgba(255,255,50,0.5)";
39  ctx.fill();
40  ctx.stroke();
41
42  //Bitmap
43  ctx.fillStyle = "rgba(0, 0, 0, 1)";
44  ctx.drawImage(rose, 55, 55, 50, 50);
45 }
46 </script>
47  </head>
48  <body>
49 <canvas id="mycanvas" width="200" height="200"></canvas>
50  </body>
51 </html>

Caminhos e linhas

As linhas 11 e 12 da listagem 1 inicializam um contexto 2D do Canvas. As linhas 14 e 15 criam um preenchimento e uma linha para futuras operações de desenho, e as linhas 19 e 22 possuem controles para sombras, nitidez e cores.

Os comandos do primeiro desenho estão presentes nas linhas 25 e 26: o preenchimento do retângulo possui um esquema equivalente e do mesmo tamanho. As linhas de 29 até 35 desenham um caminho de linhas retas, um arco e uma curva de Bézier.

As primeiras duas linhas devem abrir o caminho e definir o ponto de partida. Isso é seguido por uma linha reta, um semicírculo e uma outra linha reta. Note que o método arc() interpreta o início e o fim dos ângulos (quarto e quinto) como parâmetros radianos em vez
de ângulos. A curva de Bézier forma o lado inferior da caixa. Os primeiros quatro parâmetros descrevem as coordenadas x e y dos pontos de controle que definem o sentido de movimento da curva e sua profundidade, como em qualquer programa de desenho (figura 3).

Figura 3: Curvatura personalizada: os dois pontos de controle em uma curva de Bézier (destacado em vermelho) ocorrem como parâmetros na função Canvas bezierCurveTo().
Figura 3: Curvatura personalizada: os dois pontos de controle em uma curva de Bézier (destacado em vermelho) ocorrem como parâmetros na função Canvas bezierCurveTo().

Efeitos

Exemplos de efeitos baseados em Canvas mostram que a estrutura do Canvas permite o uso de baixas taxas de frame-rate para criação de animações suaves, apesar dos efeitos óticos complexos em computadores considerados estado de arte. Mais bibliotecas JavaScript que facilitam o uso do Canvas estão listadas na tabela 2.

Tabela 2: Bibliotecas Canvas

Nome Descrição Site
Processing.js Porta JavaScript para processamento da visualização da linguagem http://​­processingjs.​­org
PloKit Biblioteca para gráficos desenhados em SVG com Canvas http://​­www.​liquidx.net/plotkit/
Kapi Animações sem Flash http://​­jeremyckahn.​­github.​­            com/kapi/
InfoVis Gráficos interativos http://​­thejit.org
SpringY Demonstração minimalista para layouts gráficos http://​­dhotson.​­github.​­com/​­springy/​­demo.html
Cufon Fontes baseadas em Canvas https://​­github.​­com/​­sorccu/​­cufon/
Jqcanvas Cantos arredondados e gradientes sem arquivos de imagens http://​­code.​­google.​­com/​­p/               jqcanvas/

O Canvas do HTML é semelhante a um programa de desenho como o GIMP: é possível selecionar e alterar as seções de uma imagem como um bitmap gráfico. Se quiser modificar um elemento que está escondido sob outro objeto, será necessário apenas redesenhar a seção da imagem. Caso esteja familiarizado com programas de desenho vetorial como Inkscape, você saberá criar animações ainda mais facilmente: as formas que você pode desenhar podem ser manipuladas independentemente do ambiente. Se você prefere utilizar uma abordagem baseada em objetos vetoriais, poderá utilizar a caixa de pintura do Canvas, com a qual podem ser implementados gráficos SVG nos códigos HTML5 da página. O formato de arquivo padronizado pelo W3C possui a vantagem adicional de que programas como o Inkscape o utilizam como formato padrão.

Artes cinematográficas

Os recursos do SVG não param nas imagens estáticas: o navegador pode usar a interface DOM construída em JavaScript para abordar a marcação XML como elementos em uma página web normal. Assim, é possível criar imagens SVG para o navegador que são animadas e interativas. Assim como acontece com as páginas HTML, as folhas de estilo definem os atributos dos elementos de desenho.

Os navegadores mais antigos (tabela 1) somente exibirão imagens SVG caso elas sejam incorporadas como arquivos externos com a tag de objeto correspondente. O código JavaScript para manipulação em tempo de execução também precisa ser armazenado no arquivo externo; isso faz com que o trabalho de desenvolvimento se torne mais complexo, mas não afeta a capacidade interativa.

Quando o W3C lançou a especificação do SVG 1.1, acabaram criando um padrão gráfico altamente poderoso para gráficos vetoriais, que muitas vezes supera formato PDF da Adobe, com seus filtros de efeitos. Ele permite aos usuários criar sombras realistas, assim como luz e efeitos de transição, enquanto arquivos no formato PDF dependem de bitmaps incorporados com uma resolução fixa. O primeiro local para encontrar informações para os recém-chegados é o W3Schools. A tabela 3 mostra uma lista das funções básicas do SVG.

Table 3: Visão geral do SVG

Recurso Funções
Formas básicas Retângulos (também com cantos arredondados), polígonos, círculos e elipses
Linhas Linhas retas, curvas de Bézier e curvas polinomiais
Texto Unicode e também bidirecional e alongamento de linhas
Cores Cores simples, transparências,, gradientes e preenchimentos com texturas
Efeitos de filtro Ajustes de gama, foco e desfocamento, efeitos de espelhamento
Interatividade Scripts com JavaScript, interfaces DOM similares ao HTML, eventos e ações do mouse
Animação Compatível com SMIL [16], um padrão W3C que descreve animações
Fontes Fontes externas ao sistema e embutidas em fontes SVG

Ajuda necessária

Alguns ajudantes são indispensáveis para trabalhar com a interface DOM e bibliotecas JavaScript, jQuery e YUI, que não suportam totalmente SVG. Embora seja possível tratar elementos individuais, os atributos SVG não são restritos, como é o caso do código HTML. Eles têm uma estrutura de objetos que as bibliotecas JavaScript projetadas para HTML não conseguem entender.

Um plugin SVG está disponível para jQuery; infelizmente, é necessário modificar um pouco a biblioteca básica jQuery e, ao fazê-lo, é possível manipular o código XML para uma imagem SVG no estilo que os desenvolvedores web esperam do jQuery. Por esse motivo é que o SVG ainda não desempenha um papel importante na Internet, e isso se deve principalmente por conta da Microsoft. O Internet Explorer 9 ainda tem um suporte muito fraco para o SVG (figura 4). Duas soluções estão disponíveis: a biblioteca JavaScript desenvolvida pelo Google, chamada SVG Web, e a conversão de imagens SVG em objetos Flash.

Figura 4: O Internet Explorer 9 (à esquerda) vê o início do suporte SVG no Microsoft com cerca de 10 anos de atraso. Por causa da falta de apoio ao recurso, as imagens são bastante simples em comparação com o Firefox (à direita). Melhorias são prováveis no IE 10.
Figura 4: O Internet Explorer 9 (à esquerda) vê o início do suporte SVG no Microsoft com cerca de 10 anos de atraso. Por causa da falta de apoio ao recurso, as imagens são bastante simples em comparação com o Firefox (à direita). Melhorias são prováveis no IE 10.

A biblioteca de desenho Raphaël, que também é programada em JavaScript, não usa arquivos SVG pré-construídos. Em vez disso, ela faz a conversão através de comandos, de desenhos em SVG ou VML proprietário, caso você precise oferecer suporte para o Internet Explorer. A API Rafael baseia-se em SVG. Uma vez que dominadas as técnicas SVG, o desenvolvedor não encontrará grandes problemas para utilizar a biblioteca; na verdade, os recém-chegados é que vão achá-lo mais acessível do que trabalhar diretamente com o SVG, porque o Raphaël fornece recursos auxiliares para animações e acesso a elementos SVG através da interface DOM do navegador, incluindo a compatibilidade com Internet Explorer 6 a 9.

***

Na próxima e última parte do artigo, veremos, entre outras coisas, mais detalhes da biblioteca Raphaël, profundidade e WebGL.