React 中的 Konva 无限网格

2023-11-29

我正在尝试学习如何通过包react-konva使用canvas。我找到了我需要在 javascript 中编写的确切内容,但我需要像反应组件一样,并在单击按钮时添加矩形的图像。任何人都可以帮我重新组织代码以在反应中显示它......这是我在网上找到的小提琴......https://jsfiddle.net/kiksy/jqo2h3dx/2/

const stage = new Konva.Stage({
            container: 'container',
            width: window.innerWidth,
            height: window.innerHeight,
            draggable: true
        });

        const layer = new Konva.Layer();
        stage.add(layer);


        const WIDTH = 100;
        const HEIGHT = 100;

        const grid = [
            ['red', 'yellow'],
            ['green', 'blue']
        ];

        const blocks = [
            { w: 150, h: 150 , background: "white" , image: "/img/test2.png" , fullImage: false, title: "" , text: "" },
            { w: 150, h: 150 , background: "white" , image: "/img/person-icon.png" ,  fullImage: false ,title: "" , text: "" },
            { w: 150, h: 150 , background: "#575756" , image: "" ,  fullImage: false, title: "Title" , text: "" },
            { w: 300, h: 300 , background: "white" , image: "/img/test.png", fullImage: true, title: "" , text: "" }

        ];

            function checkShapes() {
            const startX = Math.floor((-stage.x() - stage.width()) / WIDTH) * WIDTH;
            const endX = Math.floor((-stage.x() + stage.width() * 2) / WIDTH) * WIDTH;

            const startY = Math.floor((-stage.y() - stage.height()) / HEIGHT) * HEIGHT;
            const endY = Math.floor((-stage.y() + stage.height() * 2) / HEIGHT) * HEIGHT;



            var i = 0;
            for(var x = startX; x < endX; x += WIDTH) {
                for(var y = startY; y < endY; y += HEIGHT) {

                    if(i === 4)
                    {
                        i = 0;
                    }

                    const indexX = Math.abs(x / WIDTH) % grid.length;
                    const indexY = Math.abs(y / HEIGHT) % grid[0].length;

                    layer.add(new Konva.Rect({
                        x,
                        y,
                        width: WIDTH,
                        height: HEIGHT,
                        fill: grid[indexX][indexY],
                        stroke: 'black',
                        strokeWidth: 4
                    }))

                    if(blocks[i].title != ""){

                        var complexText = new Konva.Text({
                            x,
                            y,
                            text: "TEST TEXT",
                            fontSize: 14,
                            fontFamily: 'Calibri',
                            fill: 'white',
                            width: WIDTH,
                            height: HEIGHT,
                            verticalAlign: 'middle',
                            align : "center"
                        });

                        layer.add(complexText);

                    }



                }
                i++
            }

        }

        checkShapes();
        layer.draw();

        stage.on('dragend', () => {
            layer.destroyChildren();
            checkShapes();
            layer.draw();
        })

这是我的解决方案:

const WIDTH = 100;
const HEIGHT = 100;

const grid = [["red", "yellow"], ["green", "blue"]];

const App = () => {
  const [stagePos, setStagePos] = React.useState({ x: 0, y: 0 });
  const startX = Math.floor((-stagePos.x - window.innerWidth) / WIDTH) * WIDTH;
  const endX =
    Math.floor((-stagePos.x + window.innerWidth * 2) / WIDTH) * WIDTH;

  const startY =
    Math.floor((-stagePos.y - window.innerHeight) / HEIGHT) * HEIGHT;
  const endY =
    Math.floor((-stagePos.y + window.innerHeight * 2) / HEIGHT) * HEIGHT;

  const gridComponents = [];
  var i = 0;
  for (var x = startX; x < endX; x += WIDTH) {
    for (var y = startY; y < endY; y += HEIGHT) {
      if (i === 4) {
        i = 0;
      }

      const indexX = Math.abs(x / WIDTH) % grid.length;
      const indexY = Math.abs(y / HEIGHT) % grid[0].length;

      gridComponents.push(
        <Rect
          x={x}
          y={y}
          width={WIDTH}
          height={HEIGHT}
          fill={grid[indexX][indexY]}
          stroke="black"
        />
      );
    }
  }
  return (
    <Stage
      x={stagePos.x}
      y={stagePos.y}
      width={window.innerWidth}
      height={window.innerHeight}
      draggable
      onDragEnd={e => {
        setStagePos(e.currentTarget.position());
      }}
    >
      <Layer>{gridComponents}</Layer>
    </Stage>
  );
};

您只需要以相同的方式生成节点即可。

Demo: https://codesandbox.io/s/react-konva-infinite-grid-kkndq

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 中的 Konva 无限网格 的相关文章

随机推荐

  • 将图像作为文件存储在文件系统中或作为二进制文件存储在 BLOB 数据库字段中[重复]

    这个问题在这里已经有答案了 可能的重复 在数据库中存储图像 是还是否 哪种方法更好 有什么优点和缺点 在我看来 将图像存储在数据库中的优点是 数据库完整性 使用外键保持所有数据库条目有效比密切关注文件系统并在数据库的每次更改期间进行所需的更
  • icontains 和 getlist django python

    我们正在尝试返回 Django API 的标题列表 其中标题可以包含一些关键字 例如 如果我们使用 icontains搜索 金钱 和 世界 的方法 api com keyworld money keyword world 这将返回包含金钱
  • ERROR_DLL_INIT_FAILED是什么意思?

    我在调用非托管程序集的托管 C 应用程序中看到以下异常 捕获 System IO FileLoadException 动态链接库 DLL 初始化例程失败 HRESULT 异常 0x8007045A 这个 HRESULT 是什么意思 我应该从
  • 具有动态掩码的 Tensorflow boolean_mask

    boolean mask 的文档说必须静态地知道掩模的形状 但如果你这样做 mask set shape None tf boolean mask tensor mask 看起来效果很好 有什么理由不这样做吗 看着文档密切揭示它涉及维数面具
  • C++ 西班牙语问号

    我开始用 C 进行开发 并且正在控制台中开发一个简单的计算器 当我的程序询问用户是否要退出时 字符 不会出现 西班牙语中的问题位于 和 之间 有人能帮我吗 PD 这个问题只发生在Windows中 而不是Linux中 编辑 这是输出代码的代码
  • pyqt QTableWidgetItem 连接信号

    当我更改单元格中的值时 我试图让 QTableWidget 调用某个函数 self table QtGui QTableWidget tableItem QtGui QTableWidgetItem str attr GetValue se
  • 为什么 ObjectInputStream readObject() 抛出 EOF 异常

    我被这个非常奇怪的问题困住了 在客户端中 我传递像这样的对象 try oos writeObject new GameStartSerializedObject oos flush catch Exception e e printStac
  • 使用 python 在现有 xml 文档中插入 xml 节点

    我正在尝试在此文档中插入 xml 节点 我写了这段代码 导入 xml dom minidom 作为 m doc m parse monfichier xml valeurs doc getElementsByTagName provider
  • android: Project.Properties - 不编辑,您的更改会被删除吗?

    我好像有问题 我想在 android 项目中的 project properties 中添加一些额外的配置信息 但我注意到当我打开它时 有评论告诉我不要编辑它 编辑是否安全 它会在某个时候重新生成 这样我就会丢失我的更改吗 还有其他选择吗
  • 应用镜像变换来翻转/反射 QML 控件

    我可以在 QML 中水平翻转 反射形状项目吗 例如 我有以下形状 我可以水平翻转 反射它以产生 我知道我可以编辑 QML 代码来以不同的方式绘制线条 但如果可能的话 仅使用 QML 动画或翻转它的东西会简单得多 Shape id annot
  • 如何在 MS Access 中指定 blob 类型?

    如何在 MS Access 中指定 blob 类型 我安装的是office 2007 我正在使用 jdbc 但这对于我传递的 SQL 查询来说应该不重要 尝试向其传递长度或 FILE 类型 但没有帮助 CREATE TABLE mytabl
  • 比较 UIImage

    如何将一张图像与另一张图像进行比较 Thanks 这是我在单元测试中用来比较图像的方法 与其他方法不同 例如 UIImagePNGRepresentation 即使图像具有不同的颜色空间 例如 RGB 和灰度 它也可以工作 implemen
  • findViewById() 对于布局 XML 中的自定义组件返回 null,对于其他组件则不返回 null

    我有一个res layout main xml包括这些元素和其他元素
  • 在 JavaScript 中重定向到相对 URL

    我的问题是我想通过 JavaScript 重定向到上面的目录 My code location href location href substr 0 location href lastIndexOf folder 网址如下所示 exam
  • 使用 NSURLConnection 上传时将进度设置为 UIProgressView

    我正在尝试刷新 UIProgressView 中的进度条以获取上传请求NSURLConnection 目标是在上传图片时刷新进度条 经过多次搜索 我设法使用didSendBodyData我的连接委托来检查进度 如下所示 void conne
  • 使用单个 Python 脚本从 Linux、Mac 和 Windows 上的剪贴板复制数据

    我正在尝试用 Python 创建一个脚本 该脚本将收集用户放入剪贴板的数据 并最好将其保存为列表或文本文件或字符串 数组 变量以便稍后使用 这应该适用于 Linux 所有版本 我假设是 Ubuntu Mac OS 所有版本和 Windows
  • 无法将参数值传递到 findOneBy Symfony 存储库

    我正在使用 Symfony 版本 2 5 0 DEV 和 mongodb 食谱http symfony com doc current bundles DoctrineMongoDBBundle index html 我现在被困在试图将定义
  • 使用 Jackson 将递归对象序列化到一定深度

    我有一个需要序列化的树对象结构 我希望每次都能够使用 jackson 或任何其他库 我是开放的 基于参数来控制序列化的深度 我的班级是这样的 class Node private String id private Node child 这
  • 如何更改 JTable 中已编辑单元格的背景颜色?

    我到处搜索 但似乎仍然找不到我的问题的答案 我已经阅读了有关单元格渲染器和单元格编辑器的所有内容 但仍然不知道 我有一个 JTable 我想确保用户清楚地看到他们正在编辑哪个单元格 默认情况下 JTable 中编辑的单元格会获得较暗的边框
  • React 中的 Konva 无限网格

    我正在尝试学习如何通过包react konva使用canvas 我找到了我需要在 javascript 中编写的确切内容 但我需要像反应组件一样 并在单击按钮时添加矩形的图像 任何人都可以帮我重新组织代码以在反应中显示它 这是我在网上找到的