Javascript는 캔버스 원형 지우개를 구현합니다.

王林
풀어 주다: 2023-05-17 15:17:07
원래의
1177명이 탐색했습니다.

프론트엔드 개발에서 캔버스는 다양한 그래픽을 그리고 매우 멋진 효과를 얻을 수 있게 해주는 매우 중요한 기술입니다. 많은 경우 낙서, 그림 등 캔버스의 일부 요소를 사용자가 지울 수 있도록 지우개 기능을 구현해야 합니다. 이번 글에서는 자바스크립트를 이용해 캔버스 원형 지우개를 구현하는 방법을 소개하겠습니다.

먼저 캔버스 요소를 생성하고 해당 컨텍스트를 가져와야 합니다.

<html>
  <body>
    <canvas id="myCanvas" width="500" height="500"></canvas>
  </body>
</html>

<script>
  const canvas = document.getElementById("myCanvas");
  const ctx = canvas.getContext("2d");
</script>
로그인 후 복사

다음으로 사용자가 마우스 움직임을 통해 캔버스의 요소를 지울 수 있도록 캔버스의 마우스 이벤트를 수신해야 합니다. 다음 코드를 사용하여 달성할 수 있습니다.

let isErasing = false;

canvas.addEventListener("mousedown", () => {
  isErasing = true;
});

canvas.addEventListener("mouseup", () => {
  isErasing = false;
});

canvas.addEventListener("mousemove", (e) => {
  if (isErasing) {
    const x = e.offsetX;
    const y = e.offsetY;
    const radius = 20;

    ctx.beginPath();
    ctx.arc(x, y, radius, 0, 2 * Math.PI);
    ctx.globalCompositeOperation = "destination-out";
    ctx.fill();
  }
});
로그인 후 복사

코드 설명:

  • 먼저 사용자가 지우고 있는지 식별하기 위해 isErasing 변수를 만듭니다. isErasing,用于标识用户是否正在擦除。
  • 然后,我们监听了canvas的mousedown事件和mouseup事件,用于在用户按下和松开鼠标时改变isErasing的值。
  • 最后,我们监听了canvas的mousemove事件,当isErasingtrue时,我们获取鼠标的坐标和半径,使用ctx.arc()方法绘制圆形,并使用ctx.globalCompositeOperation = "destination-out"将其与canvas上的元素进行混合,实现橡皮擦的效果。

这里需要注意的是,我们使用的是globalCompositeOperation属性的destination-out值,它表示只有当前绘制的图形与canvas上已有的图形重叠的部分会被擦除。

好了,现在我们已经实现了canvas圆形橡皮擦的功能。为了让用户更好地使用橡皮擦,我们还可以增加一些交互效果,比如显示当前擦除半径、变换擦除颜色等。完整的代码实现如下:

const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");

let isErasing = false;
let eraserRadius = 20;
let eraserColor = "#ffffff";

canvas.addEventListener("mousedown", () => {
  isErasing = true;
});

canvas.addEventListener("mouseup", () => {
  isErasing = false;
});

canvas.addEventListener("mousemove", (e) => {
  if (isErasing) {
    const x = e.offsetX;
    const y = e.offsetY;

    ctx.beginPath();
    ctx.arc(x, y, eraserRadius, 0, 2 * Math.PI);
    ctx.globalCompositeOperation = "destination-out";
    ctx.fillStyle = eraserColor;
    ctx.fill();

    const eraser = document.getElementById("eraser");
    eraser.style.left = `${x - eraserRadius}px`;
    eraser.style.top = `${y - eraserRadius}px`;
    eraser.style.display = "block";
  }
});

canvas.addEventListener("mouseleave", () => {
  const eraser = document.getElementById("eraser");
  eraser.style.display = "none";
});

const eraserRange = document.getElementById("eraserRange");
eraserRange.addEventListener("input", () => {
  eraserRadius = parseInt(eraserRange.value);
  const eraser = document.getElementById("eraser");
  eraser.style.width = `${eraserRadius * 2}px`;
  eraser.style.height = `${eraserRadius * 2}px`;
});

const eraserColorPicker = document.getElementById("eraserColorPicker");
eraserColorPicker.addEventListener("input", () => {
  eraserColor = eraserColorPicker.value;
});

const eraser = document.getElementById("eraser");
eraser.style.width = `${eraserRadius * 2}px`;
eraser.style.height = `${eraserRadius * 2}px`;
로그인 후 복사

代码解释:

  • 我们还增加了一个eraserRadius变量,用于保存当前擦除半径,以及一个eraserColor变量,用于保存当前擦除颜色。
  • 我们使用HTML中的<input>元素和<div>元素,在canvas之外创建了一个橡皮擦大小调节器和颜色选择器,用于动态调整橡皮擦的大小和颜色。
  • 当用户移动鼠标时,我们通过document.getElementById()获取到橡皮擦的DOM元素,并根据当前鼠标的位置设置它的lefttop
  • 그런 다음 사용자가 마우스를 눌렀다가 놓을 때 isErasing을 변경하는 데 사용되는 캔버스의 mousedown 이벤트와 mouseup 이벤트를 수신했습니다. . 값.
  • 마지막으로 캔버스의 mousemove 이벤트를 수신했습니다. isErasingtrue일 때 다음을 사용하여 마우스의 좌표와 반경을 얻습니다. ctx.arc() 메서드는 원을 그리고 ctx.globalCompositeOperation = "destination-out"를 사용하여 이를 캔버스의 요소와 혼합하여 지우개 효과를 얻습니다. .
여기서 주목해야 할 점은 globalCompositeOperation 속성의 destination-out 값을 사용하고 있다는 점입니다. 즉, 현재 그려진 그래픽만 기존 그래픽과 겹칩니다. 캔버스 부분의 그래픽이 지워집니다.

자, 이제 캔버스 원형 지우개 기능을 구현했습니다. 사용자가 지우개를 더 잘 사용할 수 있도록 현재 지우기 반경 표시, 지우기 색상 변경 등과 같은 일부 대화형 효과를 추가할 수도 있습니다. 전체 코드 구현은 다음과 같습니다.

rrreee

코드 설명: 🎜🎜🎜또한 현재 지우개 반경을 저장하기 위해 eraserRadius 변수와 eraserColor 변수를 추가했습니다. 현재 지우기 색상을 저장합니다. 🎜🎜HTML의 <input> 요소와 <div> 요소를 사용하여 캔버스 외부에 지우개 크기 조정기와 색상 선택기를 생성합니다. 지우개의 크기와 색상. 🎜🎜사용자가 마우스를 움직이면 document.getElementById()를 통해 지우개의 DOM 요소를 얻고 현재에 따라 left를 설정합니다. 마우스 위치 >top속성. 이렇게 하면 사용자는 현재 삭제 반경이 무엇인지 확인할 수 있습니다. 🎜🎜사용자가 캔버스 밖으로 이동할 때 지우개를 숨깁니다. 🎜🎜마지막으로 페이지 로드 시 지우개 크기를 동적으로 설정합니다. 🎜🎜🎜요약: 🎜🎜캔버스와 자바스크립트를 사용하면 사용자 정의 가능한 원형 지우개를 쉽게 구현할 수 있습니다. 이 지우개는 다양한 낙서, 사진 및 기타 요소를 지우는 데 사용할 수 있어 사용자의 상호 작용 경험을 향상시킵니다. 실제 프로젝트에서는 특정 요구에 따라 맞춤형 개발을 수행하여 보다 세련된 효과를 얻을 수 있습니다. 🎜

위 내용은 Javascript는 캔버스 원형 지우개를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!