Untitled
unknown
plain_text
3 years ago
2.4 kB
18
Indexable
import React, { MouseEvent, useEffect, useRef, useState } from 'react';
export const HTML5Canvas = () => {
const canvasRef = useRef<HTMLCanvasElement>(null);
const [ctx, setCtx] = useState<CanvasRenderingContext2D | null>(null);
const [drawing, setDrawing] = useState(false);
const [direction, setDirection] = useState(true);
const [{ lastX, lastY }, setLastPosition] = useState({ lastX: 0, lastY: 0 });
const [{ lineWidth, hue }, setCanvasConfig] = useState({ lineWidth: 100, hue: 1 });
const onDraw = ({ nativeEvent: { offsetX, offsetY } }: MouseEvent<HTMLCanvasElement>) => {
if (!drawing || !canvasRef.current) {
return;
}
if (ctx) {
ctx.strokeStyle = `hsl(${hue}, 100%, 50%)`;
ctx.beginPath();
ctx.moveTo(lastX, lastY);
ctx.lineWidth = lineWidth;
ctx.lineTo(offsetX, offsetY);
ctx.stroke();
setLastPosition({ lastX: offsetX, lastY: offsetY });
setCanvasConfig(prevState => ({
...prevState,
hue: prevState.hue + 1,
}));
if (hue >= 360) {
setCanvasConfig(prevState => ({
...prevState,
hue: 0,
}));
}
if (ctx.lineWidth >= 100 || ctx.lineWidth <= 1) {
setDirection(prevState => !prevState);
}
console.log(direction, lineWidth);
if (direction) {
setCanvasConfig(prevState => ({
...prevState,
lineWidth: prevState.lineWidth + 1,
}));
} else {
setCanvasConfig(prevState => ({
...prevState,
lineWidth: prevState.lineWidth - 1,
}));
}
}
};
const startDraw = ({ nativeEvent: { offsetX, offsetY } }: MouseEvent<HTMLCanvasElement>) => {
setDrawing(true);
setLastPosition({ lastX: offsetX, lastY: offsetY });
};
const stopDraw = () => {
if (ctx) {
ctx.closePath();
}
setDrawing(false);
};
useEffect(() => {
const canvas = canvasRef.current;
if (canvas) {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
setCtx(canvas.getContext('2d'));
}
}, []);
return (
<canvas
onMouseMove={onDraw}
onMouseDown={startDraw}
onMouseUp={stopDraw}
onMouseOut={stopDraw}
ref={canvasRef}
/>
);
};
Editor is loading...