前端使用 Konva 实现可视化设计器(4)

给上一章做一个补充,就是实现通过上下左右按键移动所选节点。

继续求 Star ,希望大家多多一键三连,十分感谢大家的支持~

创作不易,Star 50 个,创作加速!

github源码

gitee源码

示例地址

通过按键移动节点

准备工作

给 SelectionTool 添加两个必要的方法:

ts 复制代码
  // 更新已选位置
  selectingNodesAreaMove(offset: Konva.Vector2d) {
    this.selectingNodesArea?.x(this.selectingNodesArea.x() + offset.x)
    this.selectingNodesArea?.y(this.selectingNodesArea.y() + offset.y)
  }

  // 更新节点位置
  selectingNodesMove(offset: Konva.Vector2d) {
    for (const node of this.render.selectionTool.selectingNodes) {
      node.x(node.x() + offset.x)
      node.y(node.y() + offset.y)
    }
  }

根据上一章的设计,选中一个/多个节点的时候,还会伴随一个 group 作为辅助,所以我们除了移动所选节点的同时,还需要移动 selectingNodesArea。

按键控制,就是需要处理 dom 的 keydown 和 keyup 两个事件,放在 KeyMoveHandlers 文件中,这里是核心代码:

ts 复制代码
      keydown: (e: GlobalEventHandlersEventMap['keydown']) => {
        if (!e.ctrlKey) {
          if (
            Object.values(Types.MoveKey)
              .map((o) => o.toString())
              .includes(e.code)
          ) {
            if (e.code === Types.MoveKey.上) {
              this.render.selectionTool.selectingNodesAreaMove({ x: 0, y: -this.speed })
              this.render.selectionTool.selectingNodesMove({ x: 0, y: -this.speed })
            } else if (e.code === Types.MoveKey.左) {
              this.render.selectionTool.selectingNodesAreaMove({ x: -this.speed, y: 0 })
              this.render.selectionTool.selectingNodesMove({ x: -this.speed, y: 0 })
            } else if (e.code === Types.MoveKey.右) {
              this.render.selectionTool.selectingNodesAreaMove({ x: this.speed, y: 0 })
              this.render.selectionTool.selectingNodesMove({ x: this.speed, y: 0 })
            } else if (e.code === Types.MoveKey.下) {
              this.render.selectionTool.selectingNodesAreaMove({ x: 0, y: this.speed })
              this.render.selectionTool.selectingNodesMove({ x: 0, y: this.speed })
            }

            if (this.speed < this.speedMax) {
              this.speed++
            }
          }
        }
      },
      keyup: () => {
        this.speed = 1
      }

这里设计的规则是,按一下移动 1 像素,按着不动则会按 1 像素增速移动,松开按键则恢复原来速度。

接下来,计划实现下面这些功能:

  • 放大缩小所选的"磁贴效果"(基于网格)
  • 拖动所选的"磁贴效果"(基于网格)
  • 节点层次单个、批量调整
  • 键盘复制、粘贴
  • 等等。。。

是不是更加有趣呢?是不是值得更多的 Star 呢?勾勾手指~

源码

gitee源码

示例地址

相关推荐
Agent世界5 小时前
用 CDP 做发布自动化:四道机器闸门与产物验收
前端·javascript
FungLeo5 小时前
成为全栈·Vue 管理后台篇·编辑器图片上传:从文件选择到文章附件关联
前端·vue.js·编辑器·markdown·文件上传·formdata·附件管理
某哈压力大5 小时前
SSH 突然 Connection reset?不是密钥坏了,是 OpenSSL 把 sshd 干趴了
前端·node.js·命令行
程序员大阳6 小时前
副队长ES6+教程(3)--解构赋值
前端·javascript·es6·赋值·解构
神膘护体小月半6 小时前
css - 元素背景图由 hover 触发,初次加载时闪动的解决办法
前端·javascript·css
程序员大阳6 小时前
副队长ES6+教程(2)--let 与 const
前端·javascript·es6·const·let·var
deli0076 小时前
写满 200GB 后 SSD 为什么掉到 95MB/s?SLC 缓存模型实测
前端
曦樂~7 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript
deli0077 小时前
HTTPS 的锁是怎么挂上的?TLS 1.3 握手 6 步实测
前端
程序员大阳8 小时前
副队长ES6+教程(1)--ES6+初识
前端·ecmascript·es6