前端使用 Konva 實現視覺化設計器(16)- 旋轉對齊、觸控板操作的最佳化

xachary發表於2024-06-17

這一章解決兩個缺陷,一是調整一些快捷鍵,使得 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原始碼

示例地址

相關文章