Depois de experimentar operações compostas e desenhar imagens na tela, agora estou tentando remover imagens e composição. Como eu faço isso?
Preciso limpar a tela para redesenhar outras imagens; isso pode continuar por um tempo, então não acho que desenhar um novo retângulo toda vez seja a opção mais eficiente.
javascript
html
canvas
html5-canvas
composite
Richard
fonte
fonte
clearRect
você precisa ter um contexto não transformado ou acompanhar seus limites reais.context.clearRect(0, 0, context.canvas.width, context.canvas.height)
. É efetivamente a mesma coisa, mas uma menor dependência (1 variável em vez de 2)Usar:
context.clearRect(0, 0, canvas.width, canvas.height);
Essa é a maneira mais rápida e descritiva de limpar a tela inteira.
Não use:
canvas.width = canvas.width;
A redefinição
canvas.width
redefine todo o estado da tela (por exemplo, transformações, lineWidth, strokeStyle etc.), é muito lento (comparado ao clearRect), não funciona em todos os navegadores e não descreve o que você está realmente tentando fazer.Lidando com coordenadas transformadas
Se você modificou a matriz de transformação (por exemplo
scale
, usando,,rotate
outranslate
),context.clearRect(0,0,canvas.width,canvas.height)
provavelmente não limpará toda a parte visível da tela.A solução? Redefina a matriz de transformação antes de limpar a tela:
Edit: Acabei de fazer alguns perfis e (no Chrome) é 10% mais rápido para limpar uma tela de 300 x 150 (tamanho padrão) sem redefinir a transformação. À medida que o tamanho da sua tela aumenta, essa diferença diminui.
Isso já é relativamente insignificante, mas na maioria dos casos você estará atraindo consideravelmente mais do que está limpando e acredito que essa diferença de desempenho seja irrelevante.
fonte
canvas
variável local usandoctx.canvas
.canvas.width
ecanvas.height
ao limpar. Eu não fiz nenhuma análise numérica sobre a diferença de tempo de execução em comparação com a redefinição da transformação, mas suspeito que isso proporcionaria um desempenho um pouco melhor.Se você estiver desenhando linhas, não se esqueça:
Caso contrário, as linhas não serão limpas.
fonte
beginPath
quando você começar um novo caminho , não assuma isso apenas porque você estão limpando a tela que você deseja limpar também o caminho existente! Isso seria uma prática horrível e é uma maneira de olhar para trás ao desenhar.beginPath
não limpa nada da tela, redefine o caminho para que as entradas anteriores sejam removidas antes de você desenhar. Você provavelmente precisou, mas como uma operação de desenho, não como uma operação de limpeza. clear e, em seguida, beginPath e draw, não clear e beginPath e, em seguida, draw. A diferença faz sentido? Veja aqui um exemplo: w3schools.com/tags/canvas_beginpath.aspOutros já fizeram um excelente trabalho respondendo à pergunta, mas se um
clear()
método simples no objeto de contexto seria útil para você (era para mim), esta é a implementação que utilizo com base nas respostas aqui:Uso:
fonte
context.clearRect ( x , y , w , h );
como sugerido por @ Pentium10, mas o IE9 parece ignorar completamente esta instrução.canvas.width = canvas.width;
mas não apaga linhas, apenas formas, figuras e outros objetos, a menos que você também use a solução de @John Allsopp para alterar primeiro a largura.Portanto, se você tiver uma tela e um contexto criados assim:
Você pode usar um método como este:
fonte
context.clearRect(0,0,context.canvas.width,context.canvas.height)
.function clearCanvas(ctx) { ctx.beginPath(); ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height); }
Estamos em 2018 e ainda não existe um método nativo para limpar completamente a tela para redesenho.
clearRect()
não limpa a tela completamente. Desenhos do tipo sem preenchimento não são limpos (por exemplo,rect()
)1.Para limpar completamente a tela, independentemente de como você desenha:
Prós: preserva strokeStyle, fillStyle etc .; Sem atraso;
Contras: desnecessário se você já estiver usando beginPath antes de desenhar qualquer coisa
2. Usando o corte de largura / altura:
OU
Prós: Funciona com o IE Contras: Redefine strokeStyle, fillStyle para preto; Laggy;
Fiquei me perguntando por que uma solução nativa não existe. Na verdade,
clearRect()
é considerada a solução de linha única porque a maioria dos usuáriosbeginPath()
antes de desenhar qualquer novo caminho. Embora o beginPath seja usado apenas ao desenhar linhas e não como caminho fechado,rect().
Essa é a razão pela qual a resposta aceita não resolveu meu problema e acabei perdendo horas tentando diferentes hacks. Maldito mozilla
fonte
Use o método clearRect passando coordenadas x, y e altura e largura da tela. O ClearRect limpará toda a tela como:
fonte
Há uma tonelada de boas respostas aqui. Outra observação é que às vezes é divertido limpar apenas parcialmente a tela. isto é, "desbota" a imagem anterior em vez de apagá-la completamente. isso pode dar bons efeitos de trilhas.
é fácil. supondo que a cor de fundo seja branca:
fonte
Uma maneira rápida é fazer
Idk como funciona, mas funciona!
fonte
É isso que eu uso, independentemente dos limites e das transformações matriciais:
Basicamente, ele salva o estado atual do contexto e desenha um pixel transparente com
copy
asglobalCompositeOperation
. Em seguida, restaura o estado de contexto anterior.fonte
Isso funcionou para o meu pieChart no chart.js
fonte
Descobri que em todos os navegadores que testo, a maneira mais rápida é realmente preencher o Rect com branco ou com a cor que você desejar. Eu tenho um monitor muito grande e, no modo de tela cheia, o clearRect é extremamente lento, mas o fillRect é razoável.
A desvantagem é que a tela não é mais transparente.
fonte
no webkit, você precisa definir a largura para um valor diferente e, em seguida, configurá-lo novamente para o valor inicial
fonte
fonte
Uma maneira simples, mas não muito legível, é escrever o seguinte:
fonte
Eu sempre uso
fonte
preencha o retângulo fornecido com os valores RGBA:
0 0 0 0: com Chrome
0 0 0 255: com FF e Safari
Mas
deixe o retângulo preenchido com
0 0 0 255,
não importa o navegador!
fonte
Exemplo:
context.clearRect(0, 0, canvas.width, canvas.height);
fonte
o caminho mais curto:
fonte
maneira mais rápida:
fonte
clearRect
.Se você usar apenas o clearRect, se o tiver em um formulário para enviar seu desenho, você receberá um envio em vez da limpeza, ou talvez ele possa ser limpo primeiro e depois fazer o upload de um desenho nulo, portanto, você precisará adicionar um preventDefault no início da função:
Espero que ajude alguém.
fonte
Eu sempre uso isso
NOTA
combinar clearRect e requestAnimationFrame permite uma animação mais fluida, se é isso que você procura
fonte
Estes são ótimos exemplos de como você limpa uma tela padrão, mas se você estiver usando o paperjs, isso funcionará:
Defina uma variável global em JavaScript:
No PaperScript, defina:
Agora, onde quer que você defina clearCanvas como true, ele limpará todos os itens da tela.
fonte