国产一区二区美女诱惑_国产精品免费播放_91精品国产综合久久香蕉麻豆 _久久精品30_久久综合88_国产精品亚洲成人_黑人极品videos精品欧美裸_亚洲色图欧美激情

原創生活

國內 商業 滾動

基金 金融 股票

期貨金融

科技 行業 房產

銀行 公司 消費

生活滾動

保險 海外 觀察

財經 生活 期貨

當前位置:滾動 >

圖形編輯器開發:最基礎但卻復雜的選擇工具

文章來源:前端西瓜哥  發布時間: 2023-06-12 10:24:26  責任編輯:cfenews.com
+|-

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


(資料圖片)

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

但這個選擇工具,卻是相當的復雜。這次我來和各位,細說細說選擇工具的一些彎彎道道。

我正在開發的圖形設計工具:

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

線上體驗:

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

單選

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

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

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

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

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

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

selectSet.clear()selectSet.add(targetEl)

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

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

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

選中框是圖形的包圍盒,通常是帶旋轉的 OBB 包圍盒。

如果點擊到空白區域,要將 selectSet 清空。

多選

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

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

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

代碼的核心邏輯是:

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

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

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

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

框選

框選,提供了一次性選中大量特定區域內圖形的能力。

在空白區域按下鼠標拖拽,然后釋放,可以構造出一個矩形,這個矩形我們稱為 “選區”。

選區矩形會和圖形進行碰撞檢測判斷,決定將哪些圖形是被框選中的。

碰撞檢測有三種方案:

選區矩形和選中圖形的包圍盒屬于包含(contain)關系;選區矩形和選中圖形的包圍盒屬于相交(intersect)關系;不使用包圍盒,精準判斷是否有真正的像素上的相交

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

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

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

核心代碼實現:

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

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

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

移動的交互過程:

光標停留在已經被選中的圖形上,按下鼠標不放。然后拖拽鼠標,被選中圖形跟隨光標移動。釋放鼠標,表示移動到目標位置,移動結束。

代碼核心實現:

移動前此時記錄圖形的位置,和起始位置。拖拽時計算相對位移,更新圖形的位置。釋放時重置狀態,以及記錄到歷史記錄中。
// 圖形移動前位置let elStartCoords = [];// 鼠標按下事件的光標位置,計算偏移量時作為基準let startCoord = { x: undefined, y: undefined };const onStart = (e) => {  // 記錄初始坐標  elStartCoords = elements.map((el) => ({ x: el.x, y: el.y }));  startCoord.x = e.clientX;  startCoord.y = e.clientY;};const onDrag = (e) => {  // 計算偏移量,更新坐標  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 = () => {  // 重置狀態  elStartCoords = [];  startCoord = { x: undefined, y: undefined };};
按住 Shift 鍵的垂直水平移動

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

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

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

要點:

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

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

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

擴展能力:控制點

選中圖形,是為了對它們進行操作。

這些操作的實現,要通過控制點來落地。

常見的有:

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

下面是 figma 的縮放和旋轉演示,我開發的編輯器還沒實現完整。

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

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

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

在 “圖形拾取” 時,要把控制點也考慮進來,光標是否點在控制點上。

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

其他

還有一些可考慮實現的增強能力:

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

總結一下,選擇工具,是一款圖形設計軟件最基礎的功能。

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

最基礎的操作是移動,接著是通過控制點實現的增強操作。

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

說是工具的一種,但它其實的定位更多是底層的基礎建設。

關鍵詞:

專題首頁|財金網首頁

投資
探索

精彩
互動

獨家
觀察

京ICP備2021034106號-38   營業執照公示信息  聯系我們:55 16 53 8 @qq.com 關于我們 財金網  版權所有  cfenews.com
亚洲国产精品一区二区www在线| 日韩欧美卡一卡二| 午夜影视日本亚洲欧洲精品| 欧美日韩国产色视频| 欧美日韩一区不卡| 亚洲色在线视频| 国产黄色片在线播放| a级片在线免费| 91色婷婷久久久久合中文| 国产色综合一区| 色婷婷亚洲精品| 亚洲欧美另类小说| 欧美日韩电影一区| 色婷婷综合久久久久中文一区二区| 欧美日韩一区二区欧美激情| 黄a大片av永久免费| av在线女优影院| 成人1区2区| 99re6这里只有精品| 蜜桃一区二区三区在线观看| 国产精品天干天干在线综合| 欧洲av在线精品| 成视频在线免费观看| 成人影院在线播放| 日本在线啊啊| 日韩电影二区| 国产成人小视频| 欧美日韩国产丝袜另类| 国产网红在线| 黄色综合网址| 欧美在线不卡| 在线午夜精品| 国产精品人成在线观看免费 | 精品久久久久久久久久久久久久久| 日本护士...精品国| 亚洲一区二区av| 日韩五码在线| 亚洲在线观看| 亚洲人一二三区| 亚洲摸下面视频| www.综合网.com| 精品久久网站| 久久激情综合| 亚洲午夜三级在线| 免费黄色网页| 男女激情视频网站| 一级毛片久久久| jiujiure精品视频播放| 99成人在线视频| 97久久精品人人做人人爽| 欧美日韩一区二区不卡| 91吃瓜网在线观看| 色先锋久久影院av| 麻豆精品久久久| 欧美日韩一区二区在线视频| 国内av一区二区三区| 成人精品毛片| 久久99精品国产| 在线观看亚洲精品视频| 69视频在线观看| 成人91在线| 欧美激情一区在线观看| 日韩成人在线视频观看| free性护士videos欧美| 中国成人一区| 最近中文字幕一区二区三区| 精品国产成人在线影院| 成人影院在线视频| 99热这里只有精品8| 亚洲婷婷国产精品电影人久久| 亚洲欧洲在线视频| japansex久久高清精品| 国产一区二区导航在线播放| 欧美久久婷婷综合色| 97超碰资源站在线观看| 欧美一区二区| 亚洲成人高清在线| 国产视频第一页在线观看| 国产精品99视频| 一区二区三区日韩欧美| 欧美巨乳在线| 久久视频在线| 一区二区三区精品在线观看| 国产露出视频在线观看| 亚洲色图88| 欧美午夜视频一区二区| 色爱综合区网| 久久久久免费| 欧美一区二区成人6969| 色999韩欧美国产综合俺来也| 欧美人体视频| 亚洲伊人观看| 制服丝袜一区二区三区| 日韩中文在线播放| 白白色亚洲国产精品| 午夜影院免费看| 天海翼亚洲一区二区三区| 国产精品三级视频| av电影在线观看一区二区三区| 欧美日韩福利| 91黄色免费观看| 亚洲精品伦理| 欧美国产欧美综合| 岛国在线大片| 国产精品久久久久久久免费软件| 91精品在线麻豆| 视频精品国内| 亚洲精品国产精品乱码不99| 二区三区在线观看| 日韩二区三区四区| 亚洲毛片在线免费观看| 日本亚洲不卡| 亚洲欧美国产三级| av老司机在线观看| 国产成人精品www牛牛影视| 国外av网站| 一区精品久久| 亚洲精品国产综合区久久久久久久| 日本午夜精品| 日韩欧美在线网址| 9999在线精品视频| 综合欧美一区二区三区| 可以直接在线观看的av| 日本麻豆一区二区三区视频| 老司机在线免费视频| 亚洲欧美综合| 日韩成人中文字幕在线观看| 国产一区2区| 欧美日韩一卡二卡| 日韩成人av在线资源| 色欧美乱欧美15图片| 午夜无码国产理论在线| 伊人一区二区三区| 草莓视频成人appios| 国产日产精品1区| 日韩精品免费观看| 亚洲a∨精品一区二区三区导航| 成人小视频免费观看| 午夜视频在线观看网站| 成人av在线播放网址| 成人福利网站| 国产亲近乱来精品视频| 国内激情视频在线观看| 国产精品卡一卡二| 欧美日韩精品一区二区三区视频| 91蜜桃网址入口| 欧洲在线视频| 亚洲欧美色一区| 久久久精品一区二区毛片免费看| 亚洲精品一二三| vam成人资源在线观看| 色94色欧美sute亚洲13| 久久亚洲道色| 日韩欧美国产成人一区二区| 亚洲国产精品久久久天堂 | 麻豆成全视频免费观看在线看| 久久精品欧美一区二区三区麻豆| 国产一二三在线| 亚洲成人在线免费| 欧美男gay| 亚洲欧美日韩天堂一区二区| 日韩专区中文字幕一区二区| www.黄在线观看| 久久久91精品国产一区二区三区| 欧美日韩亚洲国产| 91精品1区2区| 欧美阿v一级看视频| 永久在线免费观看| 成人在线综合网站| 日韩电影大全网站| 色综合久久久久综合体| 999久久久91| 亚洲日韩欧美视频一区| 精品综合免费视频观看| 久久不射影院| 岛国av一区二区三区| 亚洲女同一区| 岛国视频免费在线观看| 中文字幕在线一区二区三区| www.久久热| 亚洲黄一区二区| 狠狠色2019综合网| sis001欧美| 日韩欧美在线综合网| 日韩精品乱码av一区二区| 亚洲丝袜一区| 一本到一区二区三区| 亚洲黄色三级| 欧美丝袜第一区| 欧美日韩1区2区3区| av免费在线网站| 欧洲精品在线观看| 视频在线观看一区| 日本韩国欧美| 精品国产一二三| 99久久综合狠狠综合久久| 亚洲理论电影| www.在线播放| 91久久精品网| 国内精品不卡在线|