Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Por que não funciona assim?

Olá :) Gostaria de saber o por quê do código não funcionar caso:

1- Eu tire a function "desabilitaDesenhar". Se eu não estiver apertando o botão esquerdo (ação que torna o desenha = true), meu desenha já não é automaticamente = false, já que ele foi predefinido assim como uma variável?

2- Qual a funcionalidade do 'onmousemove' exatamente? Por que eu não poderia utilizar por exemplo apenas o tela.onmousedown e chamar através dele minha função desenhaCirculo - excluindo assim a necessidade da variável desenha? Ex.:

function desenhaCirculo(evento) {

            var x = evento.pageX - tela.offsetLeft;
            var y = evento.pageY - tela.offsetTop;
            pincel.fillStyle = cores[indiceCorAtual];
            pincel.beginPath();

             if (evento.shiftKey && evento.altKey) {

                alert('Só aperte uma tecla por vez, por favor!');

            } else if(evento.shiftKey && raio + 10 <= 40) {
                raio = raio + 10;

            } else if(evento.altKey && raio - 5 >= 10) {
                raio = raio - 5;

            }


            pincel.arc(x, y, raio, 0, 2 * 3.14);
            pincel.fill();
            console.log(x + ',' + y);

    }

    tela.onmousedown = desenhaCirculo;

Esse é o código original/ que funciona:

<canvas width="600" height="400"></canvas>

<script>
    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');

    pincel.fillStyle = 'black';
    pincel.fillRect(0, 0, 600, 400);

    var cores = ['lightblue', 'lightgreen', 'purple', 'lightpink']
    var indiceCorAtual = 0; // começa com blue
    var raio = 10;
    var desenha = false;

    function desenhaCirculo(evento) {

        if(desenha){

            var x = evento.pageX - tela.offsetLeft;
            var y = evento.pageY - tela.offsetTop;
            pincel.fillStyle = cores[indiceCorAtual];
            pincel.beginPath();

             if (evento.shiftKey && evento.altKey) {

                alert('Só aperte uma tecla por vez, por favor!');

            } else if(evento.shiftKey && raio + 10 <= 40) {
                raio = raio + 10;

            } else if(evento.altKey && raio - 5 >= 10) {
                raio = raio - 5;

            }


            pincel.arc(x, y, raio, 0, 2 * 3.14);
            pincel.fill();
            console.log(x + ',' + y);
        }

    }

    tela.onmousemove = desenhaCirculo;

    function habilitaDesenhar(){

        desenha = true;
    }

    function desabilitaDesenhar(){

        desenha = false;
    }

    tela.onmouseup = desabilitaDesenhar;
    tela.onmousedown = habilitaDesenhar;

    function mudaCor() {

        indiceCorAtual++;

        if(indiceCorAtual >= cores.length) {
            indiceCorAtual = 0; // volta para a primeira cor, azul
        }

        return false; // para não exibir o menu padrão do canvas
    }

    tela.oncontextmenu = mudaCor;

</script>

Obrigada desde já :D

2 respostas

Boa tarde Maria!

executei seu código aqui sem a função "desabilitaDesenhar" como você mencionou, e com isso existem duas possibilidades, são elas:

- Removemos a "function desabilitaDesenhar()", mas mantermos no código o comando "tela.onmouseup = desabilitaDesenhar;":

Se fizermos desta forma, o navegador vai apresentar a tela "Canvas" na cor preta normalmente, mas não vai desenhar, desta forma, se abrirmos o console do navegador, observamos que o programa não foi de fato completamente executado, indicando erro na linha quando chamamos a função "desabilitaDesenhar"`, pois de fato esta não existe mais em nosso código.

Você pode ver o print neste link

ou

2a - Removemos a "function desabilitaDesenhar()", mas lembramos também de remover no código o comando "tela.onmouseup = desabilitaDesenhar;":

Se fizermos desta forma, o programa irá inicialmente "rodar" normal, porém ao darmos o primeiro click com o botão esquerdo do mouse, o valor da variável "desenha" mudará para "true```", e nada no código reverte este estado para "false`", sendo assim, o movimento do mouse na tela desenhará infinitamente.

Espero ter ajudado!

se tiver ficado alguma dúvida, manda aqui.

solução!

Maria vi que você editou o post enquanto eu respondia rs, por isso a resposta ficou meia desconexa, mas vou tentar de novo:

1º pergunta -

você inicialmente declara "var desenha = false;", porém ao clicar a primeira vez com o Botão esquerdo do mouse, ele atribuirá o valor "true" para esta variável, como não existe mais nenhum comando para retornar ela para o "false;", o programa desenhará na tela infinitamente.

2º pergunta -

o comando "onmousedown"(clique aqui para saber mais) verifica se o botão está apertado e enquanto isto for verdade, ele executa uma única vez a função à ele atribuída.

já o comando "onmousemove"(clique aqui para saber mais) verifica se o ponteiro está se movendo a cada movimento, ele executa a função à ele atribuída, sendo assim, repetindo a função a cada movimento do mouse, possibilitando que o ponteiro "desenhe" na tela.

Espero novamente ter ajudado!

se tiver ficado alguma dúvida, manda aqui.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software