精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

圖形編輯器開發(fā):最基礎(chǔ)但卻復(fù)雜的選擇工具

開發(fā) 前端
選擇工具,是一款圖形設(shè)計軟件最基礎(chǔ)的功能。它的作用是選中的圖形,對它們進(jìn)行操作,目的是 更新指定圖形屬性。最基礎(chǔ)的操作是移動,接著是通過控制點實現(xiàn)的增強操作。控制點操作的兩個基本能力是旋轉(zhuǎn)和縮放。然后我們會根據(jù)不同類型的圖形,去實現(xiàn)不同的控制點邏輯。

大家好,我是前端西瓜哥。

對于一個圖形設(shè)計軟件,它最基礎(chǔ)的工具是什么?選擇工具

但這個選擇工具,卻是相當(dāng)?shù)膹?fù)雜。這次我來和各位,細(xì)說細(xì)說選擇工具的一些彎彎道道。

我正在開發(fā)的圖形設(shè)計工具:

https://github.com/F-star/suika

線上體驗:

https://blog.fstars.wang/app/suika/

單選

最基本的,要做到單個圖形的選中。

光標(biāo)停留在圖形上方,按下鼠標(biāo)左鍵,這個圖形就被選中了。這就是一個簡單的選中了單個圖形的場景。

注意必須是 mousedown,不是 click。后面會說為什么。

在代碼層,我們會使用 “圖形拾取” 算法確定光標(biāo)落在哪個圖形的點擊區(qū)域上,注意考慮隱藏、鎖定、組的情況。

隱藏和鎖定的圖形會被忽略,如果點的是組下的一個元素,要將整個組的所有元素都選中。

清空 被選中圖形集合(暫且叫做 selectSet),然后把這個圖形添加進(jìn)去。

selectSet.clear()
selectSet.add(targetEl)

選中集合保存的是被選中的圖形,可以保存 id,也可以是圖形對象。

在渲染層,會對被選中的圖形進(jìn)行輪廓高亮,讓用戶有感知。

此外還會有一個 矩形選中框,上面還會有控制點,讓用戶可以縮放和旋轉(zhuǎn)圖形。

選中框是圖形的包圍盒,通常是 帶旋轉(zhuǎn)的 OBB 包圍盒。

如果點擊到空白區(qū)域,要將 selectSet 清空。

圖片

多選

有時候我們希望選中出多個圖形。

通常的做法是,按住 Shift 鍵,然后點擊一個圖形。注意是在鼠標(biāo)按下時就按住

同時也要 支持取消選中:原來被選中的一個圖形,我按住 Shift 再

代碼的核心邏輯是:

如果這個圖形不在 selectSet 中,將其加入;如果這個圖形在 selectSet,將其移除。

if (event.shiftKey) {
  if (selectSet.has(targetEl)) {
    selectSet.delete(targetEl)
  } else {
    selectSet.add(targetEl)
  }
}

多個圖形被選中了,除了給它們高亮輪廓線,我們還需要用一個更大的矩形選中框包裹所有被選中圖形。

一個小點:如果是取消選中的邏輯,需要鼠標(biāo)釋放后才更新 selectSet。因為要防止和后面會說的按住 Shift 水平垂直拖拽沖突。

圖片

框選

框選,提供了 一次性選中大量特定區(qū)域內(nèi)圖形 的能力。

在空白區(qū)域按下鼠標(biāo)拖拽,然后釋放,可以構(gòu)造出一個矩形,這個矩形我們稱為 “選區(qū)”。

圖片

選區(qū)矩形會和圖形進(jìn)行碰撞檢測判斷,決定將哪些圖形是被框選中的。

碰撞檢測有三種方案:

  1. 選區(qū)矩形和選中圖形的包圍盒屬于 包含(contain)關(guān)系;
  2. 選區(qū)矩形和選中圖形的包圍盒屬于 相交(intersect)關(guān)系;
  3. 不使用包圍盒,精準(zhǔn)判斷是否有真正的 像素上的相交

個人比較推薦相交的判斷方案,figma 也選擇了該方案。

框選可以和多選結(jié)合。即你可以按住 Shift 鍵,然后去框選。

它的效果是和按住 Shift 一個個去選中圖形的效果是一樣的。

核心代碼實現(xiàn):

if (!event.shiftKey) {
  selectSet.clear();
}

for (const el of elementsInScence) {
  // 判斷是否碰撞,這個方法
  if (isRectIntersect(selectionBox, el)) {
    // 普通框選
    if (!event.shiftKey) {
      selectSet.add(el);
    }
    // 連續(xù)和框選的組合
    else {
      if (selectSet.has(el)) {
        selectSet.delete(el);
      } else {
        selectSet.add(el);
      }
    }
  }
}

移動

選擇工具,主要是用來選擇,選中后一個很普遍的操作是:移動選中元素。

所以這也是它有時候也被叫做 移動工具 的原因。

移動的交互過程:

  1. 光標(biāo)停留在已經(jīng)被選中的圖形上,按下鼠標(biāo)不放。
  2. 然后拖拽鼠標(biāo),被選中圖形跟隨光標(biāo)移動。
  3. 釋放鼠標(biāo),表示移動到目標(biāo)位置,移動結(jié)束。

圖片

代碼核心實現(xiàn):

  1. 移動前此時記錄圖形的位置,和起始位置。
  2. 拖拽時計算相對位移,更新圖形的位置。
  3. 釋放時重置狀態(tài),以及記錄到歷史記錄中。
// 圖形移動前位置
let elStartCoords = [];
// 鼠標(biāo)按下事件的光標(biāo)位置,計算偏移量時作為基準(zhǔn)
let startCoord = { x: undefined, y: undefined };

const onStart = (e) => {
  // 記錄初始坐標(biāo)
  elStartCoords = elements.map((el) => ({ x: el.x, y: el.y }));
  startCoord.x = e.clientX;
  startCoord.y = e.clientY;
};

const onDrag = (e) => {
  // 計算偏移量,更新坐標(biāo)
  const dx = e.clientX - startCoord.x;
  const dy = e.clientY - startCoord.y;
  elements.forEach((el, i) => {
    el.x = elStartCoords[i].x + dx;
    el.y = elStartCoords[i].y + dy;
  });
};

const onEnd = () => {
  // 重置狀態(tài)
  elStartCoords = [];
  startCoord = { x: undefined, y: undefined };
};

按住 Shift 鍵的垂直水平移動

假設(shè)我們做好了幾個對齊的圖形,當(dāng)我們移動其中一個圖形的時候,希望能夠保持原來的對齊。

這時候,限制移動為水平或垂直方向就很有用。

通常通過在拖拽時按住 Shift 來開啟這個能力。

圖片

要點:

  1. 拖拽的中途從沒按住 Shift 到按住,要立即響應(yīng),代碼實現(xiàn)上要補一個鍵盤事件監(jiān)聽,而不是靠鼠標(biāo)移動事件,因為你不移動鼠標(biāo),被選中元素就不會更新。
  2. 比較 dx 和 dy 的大小。dx 大,水平移動;dy 大,垂直移動。這樣圖形就能盡量靠近十字線(水平線+垂直線)

對齊到像素網(wǎng)格

對齊到網(wǎng)格,開啟后,讓圖形在移動的時候,讓圖片盡量貼到網(wǎng)格線上。

圖片

做法是將一個或多個圖形的包圍盒(AABB)的左上角坐標(biāo),進(jìn)行取余,得到一個落在網(wǎng)格線上的位置,用這位置去更新選中圖形。

擴(kuò)展能力:控制點

選中圖形,是為了對它們進(jìn)行操作。

這些 操作的實現(xiàn),要通過控制點來落地。

常見的有:

  • 縮放控制點,在圖形選中框的 4 個角上。
  • 旋轉(zhuǎn)控制點,拖拽它設(shè)置圖形的旋轉(zhuǎn),旋轉(zhuǎn)控制點。
  • 給圖形設(shè)置漸變填充色,需要指定兩種顏色的顏色和位置,需要的 漸變色控制點。

下面是 figma 的縮放和旋轉(zhuǎn)演示,我開發(fā)的編輯器還沒實現(xiàn)完整。

圖片

此外,不同圖形繪制工具可能會有它們獨有的操作方式,這些都需要你根據(jù)圖形的特性去設(shè)計。

看看 Figma 對不同圖形的特殊控制點邏輯。

圖片

所以選擇工具模塊在設(shè)計上,要提供 注冊各種類型圖形控制點邏輯 的能力。

在 “圖形拾取” 時,要把控制點也考慮進(jìn)來,光標(biāo)是否點在控制點上。

如果點在控制點上,拖拽邏輯就要走控制點的邏輯,不再走選擇工具的基礎(chǔ)邏輯。

其他

還有一些可考慮實現(xiàn)的增強能力:

  • 雙擊,進(jìn)入編輯模式,進(jìn)行一些更復(fù)雜的操作,比如可以變成貝塞爾曲線操作任意點。
  • 移動時,用線條顯示和其他圖形的點(比如中點、選中框角落的 4 個點)的距離,并在很接近時吸附過去。

結(jié)尾

總結(jié)一下,選擇工具,是一款圖形設(shè)計軟件最基礎(chǔ)的功能。

它的作用是選中的圖形,對它們進(jìn)行操作,目的是 更新指定圖形屬性。

最基礎(chǔ)的操作是移動,接著是通過控制點實現(xiàn)的增強操作。

控制點操作的兩個基本能力是旋轉(zhuǎn)和縮放。然后我們會根據(jù)不同類型的圖形,去實現(xiàn)不同的控制點邏輯。

說是工具的一種,但它其實的定位更多是底層的基礎(chǔ)建設(shè)。

責(zé)任編輯:姜華 來源: 前端西瓜哥
相關(guān)推薦

2023-09-07 08:24:35

圖形編輯器開發(fā)繪制圖形工具

2023-10-19 10:12:34

圖形編輯器開發(fā)縮放圖形

2023-02-06 16:59:57

Canvas編輯器

2023-09-26 07:39:21

2023-08-31 11:32:57

圖形編輯器contain

2023-10-08 08:11:40

圖形編輯器快捷鍵操作

2024-01-08 08:30:05

光標(biāo)圖形編輯器開發(fā)游標(biāo)

2023-09-11 09:02:31

圖形編輯器模塊間的通信

2023-04-07 08:02:30

圖形編輯器對齊功能

2023-01-18 08:30:40

圖形編輯器元素

2023-02-01 09:21:59

圖形編輯器標(biāo)尺

2023-10-10 16:04:30

圖形編輯器格式轉(zhuǎn)換

2023-08-28 08:10:50

Hex圖形編輯器

2023-07-07 13:56:01

圖形編輯器畫布縮放

2024-01-03 08:43:17

圖形編輯器旋轉(zhuǎn)控制點縮放控制點

2023-04-10 08:45:44

圖形編輯器排列移動功能

2023-07-31 08:46:07

圖形編輯器圖形自動對齊

2023-02-02 14:07:00

圖形編輯器Canvas

2023-08-08 08:12:25

圖形編輯器幾何算法

2023-05-09 08:15:32

圖形編輯器撤銷重做功能
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲精品久久久久久久久久久久久久| 日韩精品国产一区| 免费在线看黄色| 国产999精品久久久久久绿帽| 91大神在线播放精品| 午夜一区二区三区免费| 日韩免费在线电影| 午夜电影久久久| 一级二级三级欧美| 午夜激情在线视频| 极品美女销魂一区二区三区| 97视频人免费观看| 国精产品久拍自产在线网站| 日韩系列在线| 日韩丝袜美女视频| 丰满少妇在线观看| 1区2区3区在线| 中文字幕在线不卡| 另类欧美小说| 精品国产黄色片| 青草国产精品久久久久久| 欧美精品成人91久久久久久久| 日本一级免费视频| 黄色成人美女网站| 日韩女优av电影在线观看| 国产97色在线 | 日韩| 国产原厂视频在线观看| 91免费版在线看| 91亚色免费| 影音先锋国产资源| 老司机亚洲精品| 午夜精品久久久久久久99黑人| 少妇愉情理伦三级| 免费短视频成人日韩| 337p日本欧洲亚洲大胆色噜噜| 国内外成人免费在线视频| 忘忧草在线影院两性视频| 亚洲蜜臀av乱码久久精品蜜桃| 日本日本精品二区免费| 性感美女一级片| 成人永久免费视频| 999热视频在线观看| 在线播放一级片| 蜜臀av一区二区在线免费观看| 青青久久av北条麻妃海外网| 日韩少妇高潮抽搐| 狠色狠色综合久久| 欧美高跟鞋交xxxxhd| 国产高潮流白浆| 外国成人激情视频| 久久久av免费| 91久久国产综合| 久久久久久久久久久妇女| 最近2019年好看中文字幕视频| 亚洲理论片在线观看| 亚洲婷婷影院| 亚洲日韩欧美视频一区| 中文字幕av网址| 亚洲成aⅴ人片久久青草影院| 亚洲第一综合天堂另类专| 亚洲精品久久一区二区三区777| 久久久精品区| 欧美电影精品一区二区| 激情综合激情五月| 国产色噜噜噜91在线精品| 欧美精品一区二区蜜臀亚洲| 午夜剧场免费看| 日韩高清成人在线| 亚洲欧洲第一视频| 超薄肉色丝袜一二三| 色狮一区二区三区四区视频| www.午夜精品| 麻豆视频在线观看| 国产欧美高清| 国产精品久久久久av| 中文字幕乱码在线观看| 国内精品久久久久影院薰衣草 | 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 欧美军同video69gay| 91高清国产视频| 亚洲精品一区二区三区中文字幕 | 国模吧视频一区| 91精品成人久久| 国产情侣免费视频| 国产乱码一区二区三区| 国产在线观看一区| 成黄免费在线| 亚洲福利视频一区| 999在线免费视频| 久久久91麻豆精品国产一区| 日韩精品中文字| 久久嫩草捆绑紧缚| 在线播放一区| 国产精品一区二区久久| 亚洲免费成人网| 国产喷白浆一区二区三区| 国产资源第一页| 二吊插入一穴一区二区| 欧美v亚洲v综合ⅴ国产v| 韩国三级hd中文字幕| 午夜电影亚洲| 国产成人高清激情视频在线观看 | 日韩精品在线视频| 日韩在线观看免| 久久精品1区| 99re在线视频观看| 国产理论电影在线观看| 亚洲一区二区美女| 亚洲男人电影天堂| 北条麻妃高清一区| 成人av电影观看| 亚洲电影在线免费观看| 欧美第一页浮力影院| 久久99精品国产自在现线| 自拍偷拍亚洲一区| 国内免费精品视频| 国产一区不卡精品| 亚洲精品高清视频| 手机av在线| 日韩精品一区二区三区中文不卡 | 欧美激情一区二区三区在线| 精品成在人线av无码免费看| 久久精品嫩草影院| 亚洲精品自在久久| 五月天婷婷久久| hitomi一区二区三区精品| 国产奶头好大揉着好爽视频| 日韩美女在线看免费观看| 亚洲精品videossex少妇| 日韩a级片在线观看| 久久99国产精品免费网站| 欧美中文娱乐网| 欧美理论影院| 国产午夜精品久久久| 久草国产精品视频| 不卡av在线免费观看| 国产无限制自拍| 中文字幕一区日韩精品| 欧美激情精品久久久久久免费印度 | 欧美一区二区播放| 亚洲色图27p| 美女视频一区二区三区| 性欧美大战久久久久久久免费观看| 少妇视频在线观看| 亚洲男人天堂网| 狠狠人妻久久久久久| 26uuu国产日韩综合| 国产黄视频在线| 亚洲区小说区图片区qvod| 69久久夜色精品国产69| 亚洲色图狠狠干| 欧美性色xo影院| 亚洲女优在线观看| 日韩av午夜在线观看| 亚洲福利一二三区| 成人中文字幕在线| 一女被多男玩喷潮视频| 亚洲人挤奶视频| 国产精品av电影| av资源网站在线观看| 日本韩国视频一区二区| 亚洲女优在线观看| 韩国毛片一区二区三区| 日韩欧美一级在线| 日本午夜精品| 国产精品av网站| 欧美午夜电影一区二区三区| 日韩欧美在线综合网| 国产在线欧美在线| 久久久久久夜精品精品免费| 国产成人精品无码播放| 99国产精品免费视频观看| 91在线高清免费观看| 男女羞羞视频在线观看| 日韩高清不卡av| 成人黄色片在线观看| 亚洲视频免费在线| 黄色国产在线视频| 日欧美一区二区| 最新av网址在线观看| 国产91精品入| 国产精品免费久久久| 伊人电影在线观看| 亚洲精品理论电影| 91中文字幕在线播放| 亚洲一卡二卡三卡四卡无卡久久| 欧美丰满少妇人妻精品| 蜜芽一区二区三区| 国产一区二区片| 不卡中文字幕| 国产一区免费在线观看| 777午夜精品电影免费看| 欧美美最猛性xxxxxx| 黄色软件在线| 欧美xxx久久| 在线观看免费高清视频| 午夜视频久久久久久| 性の欲びの女javhd| 丁香一区二区三区| 不卡的av中文字幕| 亚洲毛片在线| 国产又大又长又粗又黄| 日韩大片在线免费观看| 91色琪琪电影亚洲精品久久| 国模冰冰炮一区二区| 欧美极品少妇xxxxx| av中文在线| 日韩av在线一区二区| 一级黄在线观看| av在线之家电影网站| 欧美日韩美女在线观看| 日韩女优一区二区| 亚洲国产精品黑人久久久| 这里只有精品在线观看视频| 久久草av在线| 日韩免费高清在线| 一本色道88久久加勒比精品| 波多野结衣激情| 欧美日韩色图| 蜜桃传媒视频麻豆一区 | 成年人看的免费视频| 99re在线精品| aaa黄色大片| 国产一区二区三区四区五区入口| www日韩在线观看| 久久都是精品| 国产免费黄色小视频| 亚洲一级网站| www.激情网| 中文字幕一区二区三区乱码图片| 亚洲国产一区二区三区在线播 | 国产成人在线影院 | 午夜视频一区二区在线观看| 国产日韩精品电影| 高清在线一区| 国产精品一区二区三区免费视频| 草民电影神马电影一区二区| 青青在线视频一区二区三区| 男女视频在线| 久久久久久中文字幕| 青青草原av在线| 欧美高清第一页| 中文字幕在线播放网址| 美日韩在线视频| 色婷婷av在线| 久久久久久久久久久91| 天堂av最新在线| 欧美激情精品久久久久久大尺度| sm在线观看| 97超级碰碰人国产在线观看| 涩涩视频网站在线观看| 热re91久久精品国99热蜜臀| 竹内纱里奈兽皇系列在线观看| 欧美在线播放视频| 手机看片久久| 国产精品网红福利| 57pao成人永久免费| 91久久国产婷婷一区二区| 欧美激情三级| 国产欧美一区二区视频| 婷婷精品在线观看| 欧美最大成人综合网| 欧美日韩黑人| 欧美国产日韩在线观看| 久久成人激情视频| 国产精品私人自拍| 亚洲不卡在线播放| 亚洲综合一区二区三区| 日韩成人免费在线视频| 欧美视频二区36p| 波多野结衣高清视频| 7777精品伊人久久久大香线蕉完整版 | 亚洲自拍偷拍色片视频| 99国产精品久久一区二区三区| 久久99精品久久久久久久久久| 国产成人av| 综合网五月天| 亚洲黄色免费| 国产情侣av自拍| 国产成人在线影院| 精品人妻无码一区二区三区 | 国产美女娇喘av呻吟久久| www.com日本| 久久久不卡网国产精品二区| 亚洲精品国产精品乱码在线观看| 一区二区日韩av| 成人公开免费视频| 日韩欧美一区中文| 黄色大片在线免费观看| 久久婷婷国产麻豆91天堂| 麻豆视频在线看| 国产精品在线看| 红杏aⅴ成人免费视频| 亚洲欧洲日韩综合二区| 亚洲欧洲另类| 激情黄色小视频| 99精品欧美一区| 国产在线免费看| 精品日韩中文字幕| 国产999久久久| 国产一区二区三区四区在线观看| 91久久久在线| 一区视频网站| 亚洲午夜激情| 99精品国产一区二区青青牛奶| 爱爱爱爱免费视频| 91久色porny| 九九视频免费观看| 欧美区在线观看| 久蕉在线视频| 久久久久久久999| www一区二区三区| 欧洲一区二区日韩在线视频观看免费| 亚洲精品a级片| 欧美自拍小视频| av动漫一区二区| 久草视频中文在线| 51久久夜色精品国产麻豆| 嫩草精品影院| 97福利一区二区| 日韩一区二区三区色| 亚洲国产欧美一区二区三区不卡| 日韩一级网站| 欧洲成人午夜精品无码区久久| 中文字幕一区二区视频| 国产精品久久久久久99| 亚洲精品一区二区三区蜜桃下载 | 欧美激情aaaa| 国产视频一区二| 中文字幕一区二区三区精彩视频| 石原莉奈在线亚洲三区| 在线观看日韩精品视频| 亚洲成av人片一区二区三区| 精品国自产拍在线观看| 久久在精品线影院精品国产| 久久久久毛片| 亚洲国产午夜伦理片大全在线观看网站 | 国产又黄又爽免费视频| 日韩二区在线观看| 日本爱爱爱视频| 欧美优质美女网站| 国产高清av在线| 国产精品入口免费视频一| 精品国产乱码久久久久久蜜坠欲下 | 国产精品二区三区| 好看的日韩av电影| 国产大学生视频| 精品国产1区2区| 日本在线一二三| 国产高清在线不卡| 经典一区二区| 中文字幕在线观看第三页| 国产清纯在线一区二区www| 中文永久免费观看| 日韩视频中文字幕| 老司机亚洲精品一区二区| 欧美性潮喷xxxxx免费视频看| 国产成人超碰人人澡人人澡| 久久久久久久久99| 日韩成人在线电影网| 中文在线аv在线| 午夜精品区一区二区三| 久久黄色级2电影| 欧美日韩精品在线观看视频| 精品国产乱码久久久久久免费| 爱福利在线视频| 欧美日韩在线一区二区三区| 久久久国产精品一区二区中文| 日本少妇xxxxx| 这里是久久伊人| 波多野结衣在线观看| 欧美亚洲另类久久综合| 久久99久久99小草精品免视看| 真实国产乱子伦对白在线| 精品成人免费观看| 性欧美18一19sex性欧美| 中文字幕中文字幕在线中一区高清 | 亚洲自拍偷拍综合| 国产在线91| 91精品天堂| 性欧美xxxx大乳国产app| 在线不卡一区二区| jizz在线观看视频| 亚洲综合日韩在线| 免费日韩av片| 欧美黑人猛猛猛| 亚洲欧洲黄色网| 深夜福利一区| 宅男噜噜噜66国产免费观看| 亚洲精品免费一二三区| 日本大臀精品| 91在线|亚洲| 日韩精品欧美成人高清一区二区| 777777国产7777777| 亚洲精品久久久久久久久久久久| 国产精品麻豆成人av电影艾秋| 日本五级黄色片| 国产精品国产馆在线真实露脸 | 国产日韩欧美不卡| 亚洲春色一区二区三区|