이 complete DEMO
globalCompositeOperation
캔버스 API의 가장 좋은 기능 중 하나입니다 참조하십시오.
원하는 효과를 얻으려면 multiple canvas layers
과 globalCompositeOperation
을 사용합니다. 이 솔루션에서
우리는 3 개 개의 층이 있습니다
층 1- 바닥을 레이어 2 - 중간
,727,
레이어 3 - 상단
중동 및 최고 층 정적 만 중간 계층 동적 globalCompositeOperation
을 사용하여 클리어입니다. globalCompositeOperation = "xor"
함께
middleCtx.globalCompositeOperation = "xor";
는 브러시 층 위에 그려진이 그려진 캔버스의 부분을 소거한다.
최종 결과는 다음과 같습니다
UPDATE :
는 윈도우가 완전히 내가 다른 층의 같은 크기의 숨겨진 캔버스를 만들고 청소하고 그려되었는지 확인하려면 그 위에 검은 색 사각형이 있습니다. 캔버스 위로 마우스를 드래그하면 투명 그라디언트 색상의 원으로 레이어 2 (중간)가 지워지고 이제는 숨겨진 캔버스 위에 흰색이있는 원 (검정과 다른 색상 일 수 있음)이 그려집니다.
이렇게하면 숨겨진 캔버스의 픽셀 만 확인하고 검은 픽셀이없는 경우 창을 청소합니다. 때문에
pixels = imageData.data;
requestAnimationFrame
루틴이 성능 이유에 사용되는 : 이미지 데이터로부터의 픽셀을 얻을 다음
imageData = context.getImageData(x, y, width, height)
과 :
우리는 같은 것을 사용하는 데 필요한 이미지 데이터를 얻으려면
getImageData
은 느릴 수 있습니다. 코드의 주요 변경 사항은 각 마우스 이동 이벤트에서 해당 동작을 수행하는 대신 마우스를 끌 때 브러시 동작을 애니메이션 프레임 안에 넣는 것입니다. 이렇게하면 프로세서가 픽셀 데이터 검증을 수행하는 데 더 많은 시간을 가질 수 있습니다. 여기
창 청소 때 픽셀 데이터 검증 및 경고와 수정 된 바이올린입니다 :
는
jsFiddle link
좋은 답변 - 창이 완전히 지워졌을 때 제자리에 놓일 수있는 일종의 콜백 함수가 있습니까? –
@ 티타늄 : 예! 픽셀 조작으로 인해 다소 힘들지 만 끝내고 답변을 업데이트했습니다. (다른 방법 일 수도 있습니다, 이것은 단지 내 것입니다). 희망이 도움이됩니다. –