我使用 React 和 Canvas API 创建了一个很棒的绘画应用程序

2025-05-24

我使用 React 和 Canvas API 创建了一个很棒的绘画应用程序

我刚刚为Hashnode 圣诞节黑客马拉松提交了这个应用程序,所以我想在这里更详细地讨论它。

我没有机会使用 HTML 画布和Canvas API,所以这次黑客马拉松给了我一个很好的理由去深入研究它。

我还想添加一些独特的元素,让结果更具魔力,所以我添加了动态颜色画笔和动态宽度画笔。事实证明,这个效果确实看起来更加魔幻梦幻。

技术栈

  • React(使用自定义 React hooks)
  • 画布 API
  • 原生颜色选择器和范围输入
  • 字体真棒图标
  • Netlify 托管

介绍屏幕

由于我主要从事前端开发,并且特别注重设计和细节,所以我想为这个应用创建一个漂亮的启动画面。我的灵感来自于水彩和颜料套装盒的设计。

我记得我买学校用的绘画套装的时候,盒子上的图案给我留下了深刻的印象。它们展示了一幅美丽的画,并暗示着“你可以用这套画来画出这幅美丽的画”。所以我想用启动画面来模仿这种感觉。

如果您想知道我是如何在标题文本上叠加渐变的,这里有一个代码片段。



  background: linear-gradient(
    90deg,
    hsl(0, 100%, 50%),
    hsl(211, 100%, 50%) 50%,
    hsl(108, 100%, 40%)
  );
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;


Enter fullscreen mode Exit fullscreen mode

自定义钩子

我使用自定义钩子添加了带有事件监听器和 Canvas API 的绘画功能,该钩子返回切换画笔、设置 Canvas 引用和跟踪活动状态所需的一系列状态和函数。

动态颜色和画笔宽度

这就是魔法发生的地方。在魔法画笔模式下,我会在每次绘制时改变 HSL 颜色的色相值。最终的效果是一个美妙的色彩渐变。我还添加了控制按钮来调整颜色渐变的饱和度和亮度,以提供更多选项和氛围。



ctx.current.strokeStyle = `hsl(${hue.current},${selectedSaturation.current}%,${selectedLightness.current}%)`;
ctx.current.globalCompositeOperation = "source-over";

hue.current++;

if (hue.current >= 360) hue.current = 0;


Enter fullscreen mode Exit fullscreen mode

与魔法画笔模式类似,我还添加了动态宽度模式,可以在最小值和最大值之间上下调整画笔大小值。与魔法画笔模式结合使用,您可以创作出一些令人惊叹的艺术作品和效果。



  const dynamicLineWidth = useCallback(() => {
    if (!ctx || !ctx.current) {
      return;
    }
    if (ctx.current.lineWidth > 90 || ctx.current.lineWidth < 10) {
      direction.current = !direction.current;
    }
    direction.current ? ctx.current.lineWidth++ : ctx.current.lineWidth--;
  }, []);


Enter fullscreen mode Exit fullscreen mode

应用程序演示

https://magic-painter.netlify.app/

源代码

在评论中发布您使用该应用程序创作的艺术作品!:)

如果您喜欢我为 Hashnode 编写的黑客马拉松项目的这篇文章,请查看我为 DEV x DigitalOcean 编写的黑客马拉松项目


这些文章都是咖啡带来的灵感。所以,如果你喜欢我的文章,觉得它有用,不妨请我喝杯咖啡!我会非常感激的。

给我买杯咖啡

感谢您花时间阅读这篇文章。如果您觉得它有用,请点赞 ❤️ 或 🦄,分享并评论。

文章来源:https://dev.to/adrianbdesigns/i-ve-created-an-awesome-painting-app-using-react-and-canvas-api-47o9
PREV
让我们仅使用 HTML 和 CSS 创建一个浮动标签输入
NEXT
CSS Houdini 简介及 CSS 的未来 Houdini 是什么?CSS 的未来