You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: chapters/19-projeto-um-programa-de-pintura.md
+13-13Lines changed: 13 additions & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -11,7 +11,7 @@ Nosso aplicativo será um programa de desenho baseado na web, aos moldes do Micr
11
11
12
12
Pintar pelo computador é ótimo. Você não precisa se preocupar com materiais, habilidades ou talento. Você apenas precisa começar a manchar.
13
13
14
-
##Implementação
14
+
##Implementação
15
15
16
16
A interface para o programa de pintura mostra um grande elemento `<canvas>` na parte superior, com os campos do formulário abaixo dele. O usuário desenha na imagem ao selecionar uma ferramenta de um campo `<select>` e em seguida clicando ou arrastando em toda a tela. Existem ferramentas para desenhar linhas, apagar partes da imagem, adicionar texto e assim por diante.
17
17
@@ -23,7 +23,7 @@ Você pode carregar uma imagem no programa de duas formas. A primeira usa um cam
23
23
24
24
Imagens são salvas em um lugar atípico. O link de salvar está no canto direito da imagem ao lado do tamanho do pincel. Ele pode ser seguido, compartilhado ou salvo. Eu vou explicar como isso é possível em um momento.
25
25
26
-
##Construindo o DOM
26
+
##Construindo o DOM
27
27
28
28
A interface do nosso programa é criado a partir de mais de 30 elementos DOM. Nós precisamos construir esses de alguma maneira.
29
29
@@ -53,7 +53,7 @@ function elt(name, attributes) {
53
53
54
54
Isso nos permite criar elementos facilmente, sem fazer nosso código fonte tão longo e maçante quanto um contrato de usuário final corporativo.
55
55
56
-
##A fundação
56
+
##A fundação
57
57
58
58
O núcleo do nosso programa é a função `createPaint`, que acrescenta a interface de pintura em um elemento do DOM que é dado como argumento. Porque nós queremos construir nosso programa pedaço por pedaço, definimos um objeto chamado `controls`, que realizará funções para inicializar vários controles abaixo da imagem.
59
59
@@ -76,7 +76,7 @@ Cada controle tem acesso ao contexto da tela de desenho e, através da proprieda
76
76
77
77
Nós envolvemos a tela e os controles em elementos `<div>` com classes que seja possível adicionar um pouco de estilo, como uma borda cinza envolta da imagem.
78
78
79
-
##Ferramenta de seleção
79
+
##Ferramenta de seleção
80
80
81
81
O primeiro controle que nós adicionamos é o elemento `<select>` que permite o usuário a selecionar uma ferramenta de desenho. Tal como com os controles, vamos usar um objeto para coletar as várias ferramentas de modo que não temos que codificá-las em um só lugar e nós podemos adicionar ferramentas novas mais tarde. Esse objeto associa os nomes das ferramentas com a função que deverá ser chamada quando ela for selecionada e quando for clicado na tela.
82
82
@@ -167,7 +167,7 @@ A ferramenta `apagar` define `globalCompositeOperation` para `destination-out`,
167
167
168
168
Isso nos dá duas ferramentas para nosso programa de pintura. Nós podemos desenhar linhas pretas em um único pixel de largura (o padrão `strokeStyle` e `lineWidth` para uma tela) e apagá-los novamente. É um trabalho, mesmo que ainda bastante limitado, programa de pintura.
169
169
170
-
###Cor e tamanho do pincel
170
+
###Cor e tamanho do pincel
171
171
172
172
Partindo do princípio que os usuários vão querer desenhar em cores diferentes do preto e usar tamanhos diferentes de pincéis, vamos adicionar controles para essas duas definições.
O código gera opções a partir de uma `array` de tamanhos de pincel e, novamente, garante que o `lineWidth` seja atualizado quando um tamanho de pincel é escolhido.
207
207
208
-
###Salvando
208
+
###Salvando
209
209
210
210
Para explicar a implementação do link salvar, eu preciso falar sobre `data URLs`. Um `data URL` é uma URL com dados: como seu protocolo. Ao contrário de `http`: normal e `https`: URLS, URLs de dados não apontam para algum recurso mas sim, contém todo o recurso em si. Esta é uma URL de dados contendo um simples documento HTML.
211
211
@@ -249,7 +249,7 @@ Para evitar esse tipo vazamento de informações, os navegadores irá deixar a t
249
249
250
250
É por isso que precisamos das instruções `try/catch` na função `update` para o link salvar. Quando o `canvas` ficou corrompido, chamando `toDataURL` irá lançar uma exceção que é uma instância do `SecurityError`. Quando isso acontece, nós definimos o link para apontar para outro tipo de URL, usando o `javascript`: protocolo. Esses links simplesmente executam o script dado após os dois pontos para que o link irá mostrar uma janela de `alert` informando o usuário do problema quando é clicado.
251
251
252
-
###Carregando arquivos de imagem
252
+
###Carregando arquivos de imagem
253
253
254
254
Os dois controles finais são usados para carregar arquivos de imagens locais e a partir de URLs. Vamos precisar da seguinte função auxiliar, que tenta carregar um arquivo de imagem a partir de uma URL e substitui o conteúdo do `canvas` por ela.
Nós temos agora definidos todos os controles que o nosso simples programa de pintura precisa, mas isso ainda poderia usar mais algumas ferramentas.
308
308
309
-
###Finalizando
309
+
###Finalizando
310
310
311
311
Nós podemos facilmente adicionar uma ferramenta de texto que peça para o usuário qual é o texto que deve desenhar.
312
312
@@ -380,7 +380,7 @@ Nós agora temos um programa de pintura funcionando. Execute o código abaixo pa
380
380
381
381
Ainda há muito espaço para melhorias nesse programa. Vamos adicionar mais algumas funcionalidades como exercício.
382
382
383
-
###Retângulos
383
+
###Retângulos
384
384
385
385
Definir uma ferramenta chamada `Retângulo` que preenche um retângulo (veja o método `fillRect` a partir do [Capítulo 16](http://eloquentjavascript.net/16_canvas.html#fill_stroke)) com a cor atual. O retângulo deve espalhar a partir do ponto onde o usuário pressionar o botão do mouse para o ponto onde ele é liberado. Note-se que este último pode estar acima ou a esquerda do primeiro.
386
386
@@ -411,7 +411,7 @@ Mostrando o retângulo durante o arrastar do mouse requer um conjunto semelhante
411
411
412
412
Você pode, então, criar uma `<div>` e definir seu `style.position` como `absolute`. Ao definir os estilos de posicionamento, não se esqueça de acrescentar `px` para os números. O nó deve ser adicionado ao documento (você pode acrescentá-la à `document.body`) e também remover novamente quando o arrasto do mouse terminar e o retângulo real for desenhado na tela.
413
413
414
-
###Seletor de cores
414
+
###Seletor de cores
415
415
416
416
Outra ferramenta que é comumente encontrada em programas gráficos é um seletor de cores, o que permite que o usuário clique na imagem e seleciona a cor sob o ponteiro do mouse. Construa este.
417
417
@@ -456,13 +456,13 @@ O método `getImageData` está sujeito as mesmas restrições como `toDataURL` i
456
456
<script>createPaint(document.body);</script>
457
457
</body>
458
458
```
459
-
####Exibir dicas
459
+
####Exibir dicas
460
460
461
461
Você de novo vai precisar usar `relativePos` para descobrir qual pixel foi clicado. A função `pixelAt` no exemplo demonstra como obter os valores para um determinado pixel. Colocar eles em uma `string rgb` exige apenas algumas concatenações.
462
462
463
463
Certifique-se de verificar se a exceção que você pegar é uma instância de `SecurityError` de modo que você não trate acidentalmente o tipo errado de exceção.
464
464
465
-
###Preenchimento
465
+
###Preenchimento
466
466
467
467
Este é um exercício mais avançado do que os dois anteriores, e isso vai exigir que você projete uma solução não trivial para um problema complicado. Certifique-se de que você tem bastante tempo e paciência antes de começar a trabalhar neste exercício e não desanime por falhas iniciais.
468
468
@@ -497,7 +497,7 @@ Eu recomendo chamando `fillRect` para pixels individuais quando um pixel que dev
497
497
</body>
498
498
```
499
499
500
-
####Exibir dicas
500
+
####Exibir dicas
501
501
502
502
Dado um par de coordenadas de partida e os dados da imagem para todo o canvas, esta abordagem deve funcionar:
0 commit comments