前端使用 Konva 实现可视化设计器(16)- 旋转对齐、触摸板操作的优化

konva · 浏览次数 : 0

小编点评

# Konva.js:优化快捷键与磁贴对齐 这一章主要解决了两个缺陷,包括调整快捷键以适应 Mac 触摸板,以及修复素材节点旋转后磁贴对齐失效的问题。 ## 1. 调整快捷键 为了使 Mac 触摸板能够正常操作,我们决定调整部分快捷键。具体如下: - 将 `Cmd` + `R` 键更新为刷新页面 - 将 `Cmd` + `Backspace` 键更新为删除页面 此外,缩放功能也进行了优化,现在缩放以触摸板双指缩放为准。若您需要了解更多关于快捷键和缩放的信息,请 [移步查看代码差异](https://github.com/konvajs/konva/blob/master/src/Render/handlers/SelectionHandlers.ts)。 ## 2. 修复磁贴对齐问题 在修复磁贴对齐问题时,我们注意到一个特殊情况:即使素材节点被旋转,也需要正常触发磁贴对齐效果。为了解决这个问题,我们将磁贴的 `attract` 功能移动到了一个新的 `AttractTool` 中,并新增了 `AttractDraw` 辅助调试。 在处理多选素材节点时,我们需要通过 transformer 获取正确的区域信息。经过一番努力,我们发现 transformer 中必定包含一个名为 `back` 的层,它正是我们需要的区域信息来源。这样一来,我们就可以正确地计算磁贴坐标了。更多细节请参阅 [相关代码示例](https://github.com/konvajs/konva/blob/master/src/Render/handlers/SelectionHandlers.ts)。 ## 结语 感谢您阅读本文,如果您发现任何问题或错误,请随时通过 [GitHub](https://github.com/konvajs/konva) 提交 issue。您的支持是我们前进的动力!如果您喜欢本文,请给项目点个星,您的认可将激励我们继续改进。再次感谢您的支持!

正文

这一章解决两个缺陷,一是调整一些快捷键,使得 Mac 触摸板可以正常操作;二是修复一个 Issue,使得即使素材节点即使被旋转之后,也能正常触发磁贴对齐效果,有个小坑需要注意。

请大家动动小手,给我一个免费的 Star 吧~

大家如果发现了 Bug,欢迎来提 Issue 哟~

github源码

gitee源码

示例地址

快捷键、触摸板的优化

  • 兼容 MacOS Command 键
  • Ctrl(Win)/Command(Mac) + R 刷新
  • 退格键也作为删除键
  • 缩放以触摸板双指缩放为准(即鼠标改为上滚轮放大、下滚轮缩小)

请移步查看代码差异,比较简单。

旋转对齐的支持

把磁贴 attract 移动至新增的 AttractTool 中,并新增 AttractDraw 方便调试

先看看 Issue 反馈的问题:

以水平方向上为例,没有旋转之前,逻辑上的对齐线大概如此:

image

只是,旋转之后,按原来计算坐标+宽高的方式就不合适了:

image

这里,符合直觉的,应该如下:

image

正好,官方有个合适的 API 可以获得上面黄线的矩形区域信息,就是 getClientRect。
如果仅考虑单个素材节点,直接获取该节点的 getClientRect 信息,替换掉此前的计算逻辑即可。
可是,这里考虑的还有多选的情况,这个时候就应该通过 transformer 获取了,这里有一个坑,如下:

image

通过 transformer 的 getClientRect,以为获得左边的区域信息,可事实是左边那样。
这就导致了,计算的磁贴坐标都出现的偏移。
上结论,按 Konva 定结构特点, transformer 必定包含一个 name 为 back 的层,正正是上面左边需要的区域,获取该区域信息就正确了。

// /src/Render/handlers/SelectionHandlers.ts

// 原来通过以下的 x、y、width、height 信息计算:
const pos = this.render.transformer.position()
const width = this.render.transformer.width()
const height = this.render.transformer.height()

需改为

// /src/Render/handlers/SelectionHandlers.ts

// 现在改为通过以下 rect 信息的 x、y、width、height 信息计算:
const rect = this.render.transformer.findOne('.back')!.getClientRect()

最新在线示例,提供了测试调试用例,可以查看连接线的变化:

image

image

这样,按新的区域信息计算就满足了:

image

More Stars please!勾勾手指~

源码

gitee源码

示例地址

与前端使用 Konva 实现可视化设计器(16)- 旋转对齐、触摸板操作的优化相似的内容:

前端使用 Konva 实现可视化设计器(16)- 旋转对齐、触摸板操作的优化

这一章解决两个缺陷,一是调整一些快捷键,使得 Mac 触摸板可以正常操作;二是修复一个 Issue,使得即使素材节点即使被旋转之后,也能正常触发磁贴对齐效果,有个小坑需要注意。

前端使用 Konva 实现可视化设计器(18)- 素材嵌套 - 加载阶段

本章主要实现素材的嵌套(加载阶段)这意味着可以拖入画布的对象,不只是图片素材,还可以是嵌套的图片和图形。

前端使用 Konva 实现可视化设计器(15)- 自定义连接点、连接优化

本章将处理一些缺陷的同时,实现支持连接点的自定义,一个节点可以定义多个连接点,最终可以满足类似图元接线的效果。

前端使用 Konva 实现可视化设计器(14)- 折线 - 最优路径应用【代码篇】

话接上回[《前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用【思路篇】》](https://www.cnblogs.com/xachary/p/18238704),这一章继续说说相关的代码如何构思的,如何一步步构建数据模型可供 AStar 算法进行路径规划,最终画出节点之间的...

前端使用 Konva 实现可视化设计器(13)- 折线 - 最优路径应用【思路篇】

这一章把直线连接改为折线连接,沿用原来连接点的关系信息。关于折线的计算,使用的是开源的 AStar 算法进行路径规划,启发方式为 曼哈顿距离,且不允许对角线移动。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示

前端使用 Konva 实现可视化设计器(12)- 连接线 - 直线

这一章实现的连接线,目前仅支持直线连接,为了能够不影响原有的其它功能,尝试了2、3个实现思路,最终实测这个实现方式目前来说最为合适了。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示例地址 相关定义 连接点 记

前端使用 Konva 实现可视化设计器(11)- 对齐效果

这一章补充一个效果,在多选的情况下,对目标进行对齐。基于多选整体区域对齐的基础上,还支持基于其中一个节点进行对齐。

前端使用 Konva 实现可视化设计器(10)- 对齐线

前端使用 Konva 实现可视化设计器,这次实现对齐线的交互功能,单个、多个、多选都可以对齐,同时还能磁贴。

前端使用 Konva 实现可视化设计器(9)- 另存为SVG

请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示例地址 另存为SVG 这一章增强了另存为的能力,实现“另存为SVG”,大概是全网唯一的实例分享了吧。 灵感来源:react-konva-custom-context

前端使用 Konva 实现可视化设计器(8)- 预览框

请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了明显的 Bug,可以提 Issue 哟~ 这一章我们实现一个预览框,实时、可交互定位的。 github源码 gitee源码 示例地址 预览框 定位方法 移动画布,将传入 x,y 作为画布中心: // 更新中心位置 updateCenter