從0到1實(shí)現(xiàn)流程圖02-畫(huà)布篇

開(kāi)始

下面我們開(kāi)始實(shí)現(xiàn)流程圖的畫(huà)布功能,從兩個(gè)方面著手,第一個(gè)是畫(huà)布的樣式,包括網(wǎng)格和背景,第二個(gè)是畫(huà)布的操作,包括平移和縮放。首先來(lái)看看兩個(gè)經(jīng)典的流程圖應(yīng)用 DrawioBPMN editor

1621050423111-90fb9062-60f0-446e-aa87-76891a0d7548.png

1621050582560-384b65c5-dbd5-4493-ad05-a48a4e8e4b7a.png

從上圖我們可以看到兩種不同的畫(huà)布,帶滾動(dòng)條的和不帶滾動(dòng)條的,兩種類型畫(huà)布都有各自的優(yōu)缺點(diǎn),比如帶滾動(dòng)條的畫(huà)布可以根據(jù)滾動(dòng)條位置清晰的了解當(dāng)前畫(huà)面處于整個(gè)畫(huà)布的位置,但是滾動(dòng)條在 windows 下樣式不夠美觀。不帶滾動(dòng)條的畫(huà)布也能實(shí)現(xiàn)和滾動(dòng)條畫(huà)布一樣的無(wú)限拖拽、縮放等效果,但是如果畫(huà)布上圖形較分散,容易丟失視野,比較難以查找。

X6 同時(shí)支持上面兩種類型畫(huà)布,在這里我們還是看重畫(huà)布的顏值,所以選擇不帶滾動(dòng)條的,如果需要實(shí)現(xiàn)帶滾動(dòng)條的畫(huà)布,可以參考這里。

實(shí)現(xiàn)

初始化

首先進(jìn)入安裝步驟,如果再 Vue/React/Angular 等項(xiàng)目中使用,可以使用 npm 或者 yarn 進(jìn)行安裝,如果使用 script 標(biāo)簽引入,可以使用 CDN 地址。

# npm
$ npm install @antv/x6 --save

# yarn
$ yarn add @antv/x6

# cdn
# <script ></script>

然后我們?cè)陧?yè)面上創(chuàng)建一個(gè)容納畫(huà)布的容器:

<div id="container"></div>

接下來(lái)我們就可以初始化一個(gè)畫(huà)布了:

new Graph({
  container: document.getElementById('container'),
  width: 800,
  height: 800,
})

網(wǎng)格與背景

X6 可以在 Grpah 中全局配置網(wǎng)格形態(tài)與樣式,例如下面配置了雙線條網(wǎng)格,主網(wǎng)格尺寸為 10px * 10px,主網(wǎng)格線條顏色為 #E7E8EA,寬度為 1px,次網(wǎng)格線條顏色為 #CBCED3,寬度為 1px,次網(wǎng)格線條之間間隔 4 個(gè)主網(wǎng)格。同樣可以在 Graph 中全局配置畫(huà)布的背景顏色和背景圖片,如果需要配置,可以參考官網(wǎng)。

new Graph({
  grid: {
    size: 10,
    visible: true,
    type: 'doubleMesh',
    args: [
      {
        color: '#E7E8EA',
        thickness: 1,
      },
      {
        color: '#CBCED3',
        thickness: 1,
        factor: 4,
      },
    ],
  },
})

畫(huà)布呈現(xiàn)的樣式如下圖:


1621063209671-496ca50b-dd0b-4c92-ae3e-d98549b09b9d.png

平移與縮放

畫(huà)布的拖拽平移與滾輪縮放是高頻操作,是畫(huà)布需要具備的基本功能。首先來(lái)看拖拽平移,基本用法:

new Graph({
  // 等價(jià)于 panning: true
  panning: {
    enabled: true,
  }
})

這樣在按下鼠標(biāo)左鍵,移動(dòng)鼠標(biāo)就可以拖拽畫(huà)布,有些用戶習(xí)慣用右鍵或者觸摸板來(lái)進(jìn)行畫(huà)布的平移操作,X6 也是支持的,其中左鍵移動(dòng)和右鍵移動(dòng)有一個(gè)小小的區(qū)別:在圖形上按下左鍵不會(huì)觸發(fā)畫(huà)布平移,但是右鍵可以。

new Graph({
  panning: {
    enabled: true,
    eventTypes: ['leftMouseDown', 'rightMouseDown', 'mouseWheel']
  }
})

在 Graph 上配置 mousewheel 可以實(shí)現(xiàn)畫(huà)布縮放功能,基本用法:

new Graph({
  // 等價(jià)于 mousewheel: true
  mousewheel: {
    enabled: true,
  }
})

實(shí)驗(yàn)后發(fā)現(xiàn)三個(gè)問(wèn)題:

  1. 縮放和平移沖突,滾動(dòng)滾輪或者滑動(dòng)觸摸板的時(shí)候,畫(huà)布既會(huì)縮放,同時(shí)也會(huì)平移
  2. 畫(huà)布總是按照畫(huà)布中心點(diǎn)進(jìn)行縮放,想要的是按照鼠標(biāo)位置進(jìn)行縮放
  3. 沒(méi)法控制縮放的最小和最大級(jí)別

閱讀官網(wǎng)文檔后發(fā)現(xiàn),這些問(wèn)題 X6 都有考慮到,可以用以下方式來(lái)解決:

  1. 設(shè)置修飾鍵 modifiers 為 ctrl,這樣在觸摸板上使用雙指縮放或者按下 Ctrl 鍵再滾動(dòng)鼠標(biāo)才會(huì)觸發(fā)畫(huà)布縮放,就不會(huì)和拖拽平移沖突
  2. 設(shè)置 zoomAtMousePosition 為 true,這樣畫(huà)布會(huì)以鼠標(biāo)位置為中心點(diǎn)進(jìn)行縮放
  3. 設(shè)置 minScale 和 maxScale 可以控制畫(huà)布可縮放的最小和最大級(jí)別

最終的配置和效果如下:

new Graph({
  // 等價(jià)于 mousewheel: true
  mousewheel: {
    enabled: true,
    zoomAtMousePosition: true,
    modifiers: 'ctrl',
    minScale: 0.5,
    maxScale: 3,
  }
})
1621070049484-7a9743aa-8ab9-4074-8d02-c01137f15ecc.gif

最后

從上面實(shí)現(xiàn)的過(guò)程來(lái)看,X6 不僅有完備的功能,而且在每個(gè)功能上考慮得很細(xì)致,通過(guò)組合一些配置項(xiàng)就能完成基本的功能,體現(xiàn)了 X6 開(kāi)箱即用的特點(diǎn)。

  1. 源碼:傳送門(mén)
  2. 記得給 X6 倉(cāng)庫(kù)加星
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容