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

Segurando o clique fora do canvas

Percebi que quando eu seguro o mouse para desenhar e ele sai do limite do canvas, ao retornar para o limite ele volta desenhando mesmo sem estar segurando tanto o meu código quanto do instrutor, dessa forma tentei melhorar o código acrescentando uma margem invisível que ao desenhar não saia do canvas. Se houver uma outra solução é bem vinda. Segue meu código abaixo:

<meta charset="UTF-8">

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

<script>

    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    pincel.fillStyle = 'white';
    pincel.fillRect(0, 50, 600, 400); // espaço em branco ou margem
    pincel.fillStyle = 'lightgray';
    pincel.fillRect(50, 50, 500, 300); // espaço cinza onde vai ser desenhado

    var desenha = false;
    var corAtual = 'blue';
    var xVermelho = 0;
    var xVerde  = 50;
    var xAzul = 100;
    var yQuadrados = 0;
    var tamanhoQuadrados = 50;

    function desenhaQuadrado(x, y, tamanho, cor) {

        pincel.fillStyle = cor;
        pincel.fillRect(x, y, tamanho, tamanho)
        pincel.fill();
    }

    function desenhaCirculo(x, y, raio, cor) {

        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * 3.14);
        pincel.fill();

    }

    function desenhaPaletaDeCores() {

        desenhaQuadrado(xVermelho, yQuadrados, tamanhoQuadrados, 'red');
        desenhaQuadrado(xVerde, yQuadrados, tamanhoQuadrados, 'green');
        desenhaQuadrado(xAzul, yQuadrados, tamanhoQuadrados, 'blue');

    }

    function lidaComMovimentoDoMouse(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;

        if(y > 55 && y < 350 && x > 50 && x < 550){ // se estiver dentro do espaço cinza
            if(desenha) {
                desenhaCirculo(x, y, 5, corAtual);
            }
        }

    }

    function habilitaDesenhar() {

        desenha = true;
    }

    function desabilitaDesenhar() {

        desenha = false;
    }

    function escolheCor(evento){
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;

        if((x > xVermelho - tamanhoQuadrados) && (x < xVermelho + tamanhoQuadrados)) {
            corAtual = 'red'
        }else if((x > xVerde - tamanhoQuadrados) && (x < xVerde + tamanhoQuadrados)){
            corAtual = 'green'
        }else if((x > xAzul - tamanhoQuadrados) && (x < xAzul + tamanhoQuadrados)){
            corAtual = 'blue'
        }
    }

    desenhaPaletaDeCores(); // mostra os quadrados de seleção de cores

    tela.onclick = escolheCor;

    tela.onmousemove = lidaComMovimentoDoMouse;

    tela.onmousedown = habilitaDesenhar;

    tela.onmouseup = desabilitaDesenhar;

</script>
2 respostas
solução!

Germano,

bela ideia tentar bloquear este efeito indesejado (pointerlock). Sua borda previne este problema, mas quando você ultrapassa os limites externos da borda, o problema volta a ocorrer. Poderia fazer uma borda até os limites da tela, talvez resolvesse este problema.

Já tinha desistido de descobrir uma maneira de evitar esse efeito. Mas sua problematização (valeu!) me instigou novamente a procurar uma solução mais definitiva: com o evento onmouseout, o navegador identifica quando o mouse sai do canvas. E desabilita o "desenhar", sendo necessário fazer onmousedown de novo pra voltar a desenhar. Experimente!

Modifiquei o código com instruções que não sei se já viu nas aulas, mas se quiser implementar no seu código, basta inserir uma function e a chamada dela, abaixo. O resto é compatível. Ah, e aí pode eliminar a borda branca.

function mouseFantasma(){
    desenha = false;
}

tela.onmouseout = mouseFantasma;

Bons estudos!


Abaixo o meu código completo:

<meta charset="UTF-8">
<canvas width="600" height="400"></canvas>

<script>

    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    pincel.fillStyle = "lightgray";
    pincel.fillRect(0, 0, 600, 400);

    var desenha = false;
    var cores = ["#ff7605", "hsl(319, 94%, 50%)", "rgb(87, 130, 224)", "hsl(110, 62%, 66%)"];
    var corAtual = cores[3];
    var xCores = [0, 40, 80, 120];
    var yCores = 0;
    var tamanhoQuadrados = 40;
    var raio = 4;


    function desenhaPaletaDeCores() {

        for(i = 0; i < cores.length; i++){
            desenhaQuadrado(xCores[i], yCores, tamanhoQuadrados, cores[i]);
        }
    }


    function desenhaQuadrado(x, y, tamanho, cor) {

        pincel.fillStyle = cor;
        pincel.fillRect(x, y, tamanho, tamanho);
        pincel.fill();
    }


       function podeDesenharNaArea(x, y) {

        if(x >= 0 && x < cores.length * tamanhoQuadrados + raio + 1 && y >= 0 && y < tamanhoQuadrados + raio + 1){
            return false;

        }else{
            return true;
        }

    }


    function selecionaCor(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;

        if(y > yCores && y < yCores + tamanhoQuadrados){

            for(j = 0; j < cores.length; j++){
                if(x > xCores[j] && x < xCores[j] + tamanhoQuadrados){
                    corAtual = cores[j];       
                }
            }
        }
    }


    function desenhaCirculo(x, y, cor) {
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * Math.PI);
        pincel.fill();

    }


    function lidaComMovimentoDoMouse(evento) {
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        if(desenha && podeDesenharNaArea(x, y)){
            desenhaCirculo(x, y, corAtual);
        }
    }


    function habilitaDesenhar() {
        desenha = true;
    }


    function desabilitaDesenhar() {
        desenha = false;
    }


    function mouseFantasma(){
        desenha = false;
    }


    desenhaPaletaDeCores();
    tela.onclick = selecionaCor;
    tela.onmousemove = lidaComMovimentoDoMouse;
    tela.onmousedown = habilitaDesenhar;
    tela.onmouseup = desabilitaDesenhar;
    tela.onmouseout = mouseFantasma;

</script>

Muito bom! funcionou perfeitamente acrescentar onmouseout, nao conhecia esse comando, estava tentando colocar onmouseup se o mouse ficasse fora do canvas, agora esta perfeito!