前端使用 Konva 实现可视化设计器(4)- 快捷键移动元素
1.前端使用 Konva 实现可视化设计器(2)- 参考线、svg、gif图片加载2.前端使用 Konva 实现可视化设计器(1)- 无限画布、比例尺
3.前端使用 Konva 实现可视化设计器(4)- 快捷键移动元素
4.前端使用 Konva 实现可视化设计器(3)- 单选、多选、选择框5.前端使用 Konva 实现可视化设计器(5)- 磁贴效果6.前端使用 Konva 实现可视化设计器(6)- 复制粘贴、删除、位置、zIndex调整7.前端使用 Konva 实现可视化设计器(7)- 导入导出、上一步、下一步8.前端使用 Konva 实现可视化设计器(8)- 预览框9.前端使用 Konva 实现可视化设计器(9)- 另存为SVG10.前端使用 Konva 实现可视化设计器(10)- 对齐线11.前端使用 Konva 实现可视化设计器(11)- 对齐效果12.前端使用 Konva 实现可视化设计器(12)- 连接线 - 直线13.前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用【思路篇】14.前端使用 Konva 实现可视化设计器(14)- 折线 - 最优路径应用【代码篇】15.前端使用 Konva 实现可视化设计器(15)- 自定义连接点、连接优化16.前端使用 Konva 实现可视化设计器(16)- 旋转对齐、触摸板操作的优化17.前端使用 Konva 实现可视化设计器(17)- 素材嵌套 - 生成阶段18.前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段19.前端使用 Konva 实现可视化设计器(19)- 连接线 - 直线、折线20.前端使用 Konva 实现可视化设计器(20)- 性能优化、UI 美化21.前端使用 Konva 实现可视化设计器(21)- 绘制图形(椭圆)22.前端使用 Konva 实现可视化设计器(22)- 绘制图形(矩形、直线、折线)23.前端使用 Konva 实现可视化设计器(23)- 绘制曲线、属性面板给上一章做一个补充,就是实现通过上下左右按键移动所选节点。
继续求 Star ,希望大家多多一键三连,十分感谢大家的支持~
创作不易,Star 50 个,创作加速!
通过按键移动节点
准备工作
给 SelectionTool 添加两个必要的方法:
// 更新已选位置
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 文件中,这里是核心代码:
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 呢?勾勾手指~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?