精品欧美一区二区三区在线观看 _久久久久国色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| 欧美激情精品久久久久久变态| 亚洲7777| 伊人手机在线视频| 国产福利资源一区| 亚洲自拍偷拍九九九| 91中文字幕在线| 刘亦菲国产毛片bd| 香蕉久久免费电影| 91在线小视频| 69视频在线免费观看| 欧美丰满熟妇bbb久久久| 国产在线一区二区视频| 精一区二区三区| 按摩亚洲人久久| 欧美日韩在线观看不卡| 欧美日韩国产亚洲沙发| 精品一二三四区| 久久久精品网站| 亚洲av无日韩毛片久久| 自拍视频在线播放| 蜜桃免费网站一区二区三区| 中文字幕在线成人| 亚洲免费999| 欧美黑人激情| 国产在线视视频有精品| 俺去啦;欧美日韩| 国产男女猛烈无遮挡a片漫画| av丝袜在线| 91在线精品一区二区| 91传媒免费看| 日本系列第一页| 久久亚州av| 色噜噜狠狠成人中文综合| 欧美在线视频一区二区三区| 91黑人精品一区二区三区| 国产不卡一区| 5566中文字幕一区二区电影 | 亚洲综合网狠久久| 一区二区三区不卡在线观看 | 97视频精彩视频在线观看| 91小视频在线观看| 国产精品7m视频| 色噜噜噜噜噜噜| 99re8精品视频在线观看| 欧洲一区在线观看| 三上悠亚免费在线观看| 亚洲女同志亚洲女同女播放| 中国女人久久久| 在线视频免费一区二区| 国产成人福利在线| 日本免费精品| 狠狠躁夜夜躁人人躁婷婷91| 亚洲欧洲三级| 国产 日韩 欧美 精品| 国产在线一区二区综合免费视频| 91久久精品美女高潮| 日本少妇在线观看| 亚洲国产高清一区| 中文字幕欧美在线| 日韩av片在线免费观看| 日韩黄色大片网站| 日韩午夜在线影院| 亚洲人成网站在线播放2019| www.蜜臀av| 激情久久一区| 伊人一区二区三区久久精品| 男人操女人下面视频| 中文字幕在线官网| 国产精品天美传媒沈樵| 97人人模人人爽人人喊38tv| 亚洲风情第一页| 日本成人在线一区| 久久久中精品2020中文| 日韩在线不卡av| 综合国产视频| 亚洲第一页在线| 捷克做爰xxxⅹ性视频| 日本欧美不卡| 午夜精品视频一区| 777久久精品一区二区三区无码 | 久久久精品毛片| 欧美私人啪啪vps| 色偷偷噜噜噜亚洲男人| 欧美偷拍一区二区三区| 午夜精品视频一区二区三区在线看| 精品爽片免费看久久| 久久久久亚洲av无码网站| 精品久久对白| 色诱女教师一区二区三区| 日本高清不卡免费| 成人中文在线| 亚洲欧洲视频在线| 亚洲少妇18p| 一本色道69色精品综合久久| 欧美精品一区二区三区四区 | 视频欧美精品| 色狠狠av一区二区三区| 992kp免费看片| 亚洲97av| 欧美日韩成人精品| 99自拍视频在线| 亚洲毛片av| 91精品久久久久| 一区二区 亚洲| 免费在线观看成人| 成人av中文| 成人毛片在线免费观看| 国产亚洲精品aa| 欧美日韩在线高清| 欧美偷拍视频| 久久众筹精品私拍模特| 国产成人一二三区| 久久久久久久性潮| 欧美精选午夜久久久乱码6080| 人人爽人人av| 奇米777国产一区国产二区| 亚洲国产成人爱av在线播放| 成人性视频免费看| 午夜一区在线| 国产va免费精品高清在线| 中文字幕黄色片| 久久经典综合| 国产精品九九九| 中文字幕有码无码人妻av蜜桃| 日韩激情中文字幕| 国产美女精彩久久| 国产精品人妻一区二区三区| 国内一区二区在线| 日本一区二区三区在线视频| www.youjizz.com在线| 欧美丝袜美女中出在线| 国产主播在线看| 青草在线视频| 黄色一区二区在线观看| 可以免费观看av毛片| 成人啊v在线| 日韩电影视频免费| 四虎成人免费影院| 久久精品成人| 久久人人九九| 免费在线观看av网站| 日本韩国视频一区二区| 受虐m奴xxx在线观看| 97精品在线| 欧美激情aaaa| 亚洲av无码乱码国产精品久久 | 欧美黑吊大战白妞| 99热精品在线观看| 国产区二精品视| 91女主播在线观看| 欧美色中文字幕| 不许穿内裤随时挨c调教h苏绵| 91精品二区| 91久久大香伊蕉在人线| 日韩精品亚洲人成在线观看| 欧美性猛交xxxx富婆| 亚洲精品女人久久久| 欧美激情成人| 成人免费黄色网| 欧美拍拍视频| 在线精品观看国产| 手机av在线不卡| 精品影院一区二区久久久| www.-级毛片线天内射视视| 玖玖玖视频精品| 一区二区国产精品视频| 国产精品露脸视频| caoporen国产精品视频| 天天人人精品| 欧美成人福利| 欧美人与性动交| 人妻妺妺窝人体色www聚色窝 | 国产午夜精品理论片在线| 精品无人码麻豆乱码1区2区 | 国产鲁鲁视频在线观看特色| 日韩一区二区精品葵司在线| 中文字幕一区二区三区手机版| 99精品视频中文字幕| 黄色av免费在线播放| 五月天综合网站| 欧美专区在线观看| 性生交大片免费看女人按摩| 亚洲午夜三级在线| 亚洲免费在线播放视频| 亚洲人成久久| 亚洲欧美综合一区| 成人h动漫免费观看网站| 精品国内亚洲在观看18黄| www.国产视频| 在线视频一区二区三区| 九九热国产在线| 国产一区二区影院| 97超碰青青草| 久久久国产精品| 久久综合九九| 国产色播av在线| 中文字幕精品一区二区精品| 黄片毛片在线看| 欧美视频一区二| xxxx日本黄色| 久久先锋影音| 国产高清在线精品一区二区三区| www久久日com| 日韩三级精品电影久久久| www.国产色| 2020国产成人综合网| 日韩在线不卡一区| 国产乱码精品| 欧美在线3区| gogo久久日韩裸体艺术| 国产精品自拍网| 亚洲欧美se| 国a精品视频大全| 国产成人午夜| 日韩亚洲精品视频| 九九九伊在人线综合| 第一福利永久视频精品| 最新一区二区三区| 欧美极品美女视频| 中文字幕国产免费| 国产精品99久久| 日本欧美色综合网站免费| 国产无遮挡裸体免费久久| 亚洲一区中文字幕在线观看| 岛国一区二区| 久久久久99精品久久久久| 国产视频第一页在线观看| 欧美日本韩国一区二区三区视频| 色偷偷www8888| 久久精品视频在线免费观看| 亚洲中文字幕一区| 国产成+人+日韩+欧美+亚洲| 欧美视频在线观看网站| 综合亚洲自拍| 91av在线免费观看视频| 亚洲第一图区| 超薄丝袜一区二区| 天堂网2014av| 欧美色老头old∨ideo| 国产视频1区2区| 欧美日韩亚洲系列| 久久久精品免费看| 欧美日韩亚洲国产一区| 亚洲日本韩国在线| 欧美日韩亚洲天堂| 欧美一区免费看| 欧美午夜精品久久久久久超碰| 亚洲 欧美 中文字幕| 日韩欧美成人免费视频| 中文字幕在线欧美| 欧美主播一区二区三区| 老熟妇一区二区三区啪啪| 在线观看日韩一区| 在线观看视频二区| 午夜激情久久久| 日韩特黄一级片| 中日韩av电影| wwwww黄色| 亚洲欧美日韩国产手机在线| 少妇光屁股影院| 久久久久久亚洲综合影院红桃| a级大片在线观看| 国产精品水嫩水嫩| 日韩亚洲欧美中文字幕| 91视频观看视频| 亚洲av综合一区二区| 国产视频在线观看一区二区三区| 日本猛少妇色xxxxx免费网站| 国产精品三级av在线播放| 欧美在线一级片| 久久欧美中文字幕| 免费91在线观看| 亚洲精品成a人| 最新日韩免费视频| 亚洲美女淫视频| 亚洲国产精品午夜在线观看| 91国偷自产一区二区三区成为亚洲经典| 波多野结衣av无码| 91精品国产黑色紧身裤美女| 中日韩av在线| 日韩视频一区二区| 欧美日本韩国一区二区| 久久视频在线免费观看| 国产乱码精品一区二三赶尸艳谈| 国产精品美女网站| 人人视频精品| 亚洲一区二区日本| 色狼人综合干| 精品国产乱码久久久久久蜜柚| 深夜激情久久| 欧美激情第一页在线观看| 亚洲成人精品| 各处沟厕大尺度偷拍女厕嘘嘘| 美女网站视频久久| 水蜜桃av无码| 亚洲人精品一区| av黄色免费在线观看| 亚洲自拍偷拍网站| 亚洲无码久久久久久久| 日韩av在线资源| 成人免费观看视频大全| 51午夜精品视频| 国产免费拔擦拔擦8x在线播放 | 精品国产亚洲一区二区三区| 久久影视中文粉嫩av| 欧美精品啪啪| 中文字幕在线综合| 91免费在线看| 国产女人被狂躁到高潮小说| 91久久久免费一区二区| 蜜臀久久99精品久久久| 久久视频在线视频| 国精品产品一区| 欧美大陆一区二区| 亚洲第一伊人| 老女人性生活视频| 国产成人综合亚洲91猫咪| 妖精视频在线观看| 国产精品午夜春色av| 台湾佬中文在线| 亚洲国产精品久久久久| 蜜桃av中文字幕| 欧美成年人在线观看| 888av在线视频| 亚洲xxxx做受欧美| 91精品国产91久久综合| 一区二区三区免费播放| 国产婷婷一区二区| www.久久久久久久| 精品视频在线播放色网色视频| av在线不卡免费| 国产精品三区四区| 国产一区三区在线播放| 久久久久久久久久久视频| 成人免费电影视频| 国产精品无码网站| 亚洲国产精品成人久久综合一区 | 成人区精品一区二区不卡| 国产精品视频成人| 欧美色网址大全| 欧美第一页浮力影院| 欧美国产日本韩| 中文字幕免费高清在线观看| 中文字幕日韩精品在线观看| 欧美在线一级| 天天做天天爱天天高潮| 亚洲激情影院| 少妇被狂c下部羞羞漫画| 午夜久久福利影院| 涩涩视频在线观看免费| 热门国产精品亚洲第一区在线| 亚洲第一二三区| 手机在线免费观看毛片| 国产99久久久国产精品| 精品少妇久久久| 欧美亚洲国产怡红院影院| eeuss影院www在线观看| 久久久久久久久爱| 国产精品99| 公共露出暴露狂另类av| 国产福利91精品一区二区三区| 国产一级做a爰片在线看免费| 欧美在线一二三| 午夜伦全在线观看| 91高潮在线观看| 欧美极品中文字幕| 成人亚洲免费视频| 夜夜精品视频一区二区| 日韩av资源| 成人在线中文字幕| 今天的高清视频免费播放成人| 在线观看av中文字幕| 欧美专区亚洲专区| 日本在线视频www鲁啊鲁| 久久亚洲午夜电影| 毛片不卡一区二区| 精品人妻互换一区二区三区| 欧美色涩在线第一页| 色在线视频网| 日本不卡一区二区三区视频| 久久国产精品99久久久久久老狼 | 91在线无精精品一区二区| 在线观看亚洲| 一级片黄色录像| 亚洲аv电影天堂网| 精品视频一区二区三区四区五区| 狠狠色综合色区| 免费精品视频在线| 精品无码黑人又粗又大又长| 亚洲色无码播放| 亚洲一区网址| 三上悠亚在线一区| 欧美日韩国产在线看| gogo在线高清视频|