国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

圖形編輯器:防誤操作之拖拽阻塞

開發 前端
為了解決這類用戶微小操作的問題,我們可以巧妙地給拖拽行為加一個阻塞閾值。具體就是就是按下鼠標后,移動鼠標的距離要大于某個值,我們才認為發生了拖拽,并執行對應工具的邏輯。

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

在圖形編輯器中,想象這么一個場景,我們撤銷了一些重要的操作,然后想選中一個圖形,看看它的屬性。你點了上去,然后你發現你再也無法重做了。

你以為你點了一下,但其實你點擊的時候,鼠標還是小小移動了一點,飄了一個像素點。對編輯器來說,它識別到讓圖形移動一個像素點的操作,就生成了一個新的版本,然后重做棧(redoStack)被清空了,你退回前的操作就沒了。

為了解決這類用戶微小操作的問題,我們可以巧妙地給拖拽行為加一個阻塞閾值。具體就是就是按下鼠標后,移動鼠標的距離要大于某個值,我們才認為發生了拖拽,并執行對應工具的邏輯。

下面為我們要實現的效果。此處為了更好地演示效果,將閾值設置得很大。通常設置個 4px 就夠了。

圖片

可以看到,按下鼠標然后移動,如果移動的位移太小,矩形是不會被移動的,直到達到一定位移閾值后,矩形才會乖乖聽話跟隨鼠標進行移動。

閾值表示位移距離,使用的是視口坐標系,而不是場景坐標系。

代碼改造

原來的邏輯:

let isPressing = false;
let currentTool = null; // 當前工具對象

// 鼠標按下
function handleDown(e) {
isPressing = true;
currentTool.start(e);
}

// 鼠標移動
function handleMove(e) {
if (isPressing) {
currentTool.drag(e);
} else {
// 非拖拽的移動事件
// 比如選擇工具停留在圖形上,圖形要高亮,此時沒發生拖拽
currentTool.move(e);
}
}

// 鼠標釋放
function handleUp(e) {
currentTool.end(e);
isPressing = false;
}

鼠標按下時,isPressing 設置為 true,表示發生了鼠標按下事件。

此時鼠標再移動,我們就能知道這是一個 “拖拽” 的行為,即按下鼠標不放然后移動鼠標的行為。此時調用工具對象的 drag 方法。

最后鼠標釋放,將狀態 isPressing 重置。

現在我們進行改造。

let isPressing = false;
let currentTool = null; // 當前工具對象

let isEnableDragging = false; // 是否調用工具對象的 drag 方法
let startPos = null; // 保存鼠標按下時的坐標
const blockStep = 4; // 閾值

function handleDown(e) {
isPressing = true;
isEnableDragging = false;
startPos = { x: e.clientX, y: e.clientY };
currentTool.start(e);
}

function handleMove(e) {
// 判斷位移是否突破閾值,是的話更新狀態為 “可拖拽”
if (
!isEnableDragging &&
(Math.abs(e.clientX - startPos.x) > blockStep ||
Math.abs(e.clientX - startPos.x) > blockStep)
) {
isEnableDragging = true;
}
if (isPressing) {
if (isEnableDragging) {
// “可拖拽” 狀態,調用工具的 drag 方法
currentTool.drag(e);
}
} else {
currentTool.move(e);
}
}

function handleUp(e) {
currentTool.end(e);

// 初始化狀態
isPressing = false;
isEnableDragging = false;
startPos = null;
}

核心思路是引入 isEnableDragging 狀態,表示鼠標移動時,是否達到移動的條件。

我們在鼠標移動事件中,計算鼠標按下和鼠標移動之間的距離是否超過某個值,如果超過閾值,就將 isEnableDragging 狀態轉換為 true。

然后判斷 isEnableDragging 為 true,就調用工具對象的 drag 方法。

需要注意的是,不要只用位移距離來判斷是否可以拖拽,要配合狀態。否則突破閾值后,又移動回來,你會發現你又卡住了,因為此時閾值因為再次計算,沒能達到閾值。

所以加了個 isEnableDragging 狀態,在第一次突破閾值設置為 true 后,就再也不用計算位移了,之后一直都是可拖拽狀態,直到鼠標釋放重置狀態。

結尾

拖拽阻塞是開發圖形編輯器的一點小細節,并不復雜,但能帶來很好的用戶體驗。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2023-10-19 10:12:34

圖形編輯器開發縮放圖形

2023-08-31 11:32:57

圖形編輯器contain

2023-09-07 08:24:35

圖形編輯器開發繪制圖形工具

2023-01-18 08:30:40

圖形編輯器元素

2023-02-01 09:21:59

圖形編輯器標尺

2023-02-06 16:59:57

Canvas編輯器

2023-04-07 08:02:30

圖形編輯器對齊功能

2020-10-14 14:00:39

VIM編輯器

2023-09-26 07:39:21

2023-04-10 08:45:44

圖形編輯器排列移動功能

2023-09-11 09:02:31

圖形編輯器模塊間的通信

2023-05-09 08:15:32

圖形編輯器撤銷重做功能

2024-01-08 08:30:05

光標圖形編輯器開發游標

2023-02-09 07:02:30

圖形編輯器修改圖形

2023-10-08 08:11:40

圖形編輯器快捷鍵操作

2023-10-10 16:04:30

圖形編輯器格式轉換

2023-08-28 08:10:50

Hex圖形編輯器

2023-02-02 14:07:00

圖形編輯器Canvas

2023-07-31 08:46:07

圖形編輯器圖形自動對齊

2024-01-03 08:43:17

圖形編輯器旋轉控制點縮放控制點
點贊
收藏

51CTO技術棧公眾號

亚洲视频一区二区在线| 亚洲一二三四区不卡| 欧美最猛性xxxxx免费| 天堂av在线网| 精品电影在线观看| 三级影片在线观看欧美日韩一区二区 | 91av在线免费播放| 免费高清在线视频一区·| 国产在线精品一区二区三区》| 欧美理论在线播放| 青青久久aⅴ北条麻妃| 亚洲一区二区三区免费| 中文字幕亚洲图片| 日本欧美不卡| 日韩在线欧美在线| 精品三级在线| 日韩在线观看免费全| 精品美女一区| 美女啪啪无遮挡免费久久网站| 青青伊人久久| 欧美成人一二三| japansex久久高清精品| 久久久精品欧美| 欧美国产中文高清| 久久久亚洲网站| 99热亚洲精品| 国产美女在线观看一区| 日韩欧美亚洲天堂| 亚洲免费精品| 国精产品999国精产品官网| 欧美影院一区| 国产一区二区无遮挡| 在线亚洲观看| 欧美极品一区| 国产午夜精品美女毛片视频| 97在线免费公开视频| 国产一区二区三区黄视频| 51国偷自产一区二区三区的来源 | 视频欧美精品| 国产精品欧美一区二区三区| 欧美一进一出视频| 亚洲国产一区二区精品专区| 色偷偷偷亚洲综合网另类| 免费在线看黄色| 亚洲欧美日韩久久精品| www.xxx亚洲| 国产精品国产a| 亚洲精品久久久中文字幕| 99精品偷自拍| h动漫在线视频| 亚洲天堂福利av| 亚洲一区二区三区午夜| 玖玖在线精品| 欧美卡1卡2卡| 欧美视频在线第一页| 视频一区二区中文字幕| 精品国产一二三四区| 最近2019中文免费高清视频观看www99 | 伊大人久久香线焦宗合一75大| 26uuu国产在线精品一区二区| 欧美日韩dvd| **欧美大码日韩| 亚洲不卡视频在线| 日韩欧美在线123| 久久精品国产亚洲5555| 欧美伦理视频网站| 在线成人视屏 | 黄色av免费在线播放| 午夜精品在线视频一区| 女同视频在线观看| 久久久久久高潮国产精品视| 亚洲一级黄色| 波多野结衣作品集| 欧美区在线观看| 日韩成人久久| 久久天天狠狠| 国产精品三级电影| bl在线肉h视频大尺度| 欧洲成人免费视频| 国产乱人伦精品一区二区在线观看| 樱桃国产成人精品视频| 伊人影院在线视频| 97香蕉久久超级碰碰高清版| 久久国产精品99国产| 午夜大尺度福利视频| 精品福利一二区| 日韩深夜福利| 国产 欧美 日本| 欧美自拍偷拍一区| 日韩激情啪啪| 国产精品igao激情视频| 欧美日韩另类一区| 精品av一区二区| 日批视频在线免费看| 69av一区二区三区| 日韩电影免费网址| 日韩无套无码精品| 亚洲老板91色精品久久| 红桃视频亚洲| 992tv在线观看| 欧美另类在线播放| 国产成人aaa| 欧美性爽视频| 国产日产精品一区二区三区四区| 国产精品私人自拍| yw.尤物在线精品视频| 乱色588欧美| 91福利国产精品| 国产日产一区| 91福利免费在线| 欧美人成在线视频| 精品在线一区二区三区| 免费在线观看av| 亚洲最大成人在线| 亚洲成人动漫在线观看| 性欧美xxxx免费岛国不卡电影| 国产不卡一区二区视频| 亚洲男女自偷自拍图片另类| 日韩精品午夜视频| 欧美家庭影院| 性欧美videosex高清少妇| 欧美一区二区三区男人的天堂| 欧美一区久久| 人成在线免费视频| 91丝袜脚交足在线播放| 91久久奴性调教| 一级成人国产| 久久香蕉av| 自拍亚洲欧美老师丝袜| 日韩精品视频观看| 国产成人午夜视频| 久久天堂影院| 国产aaa一级片| 久久成人精品视频| 国产日韩成人精品| 久9re热视频这里只有精品| 99热最新网址| 国产精品国产三级国产aⅴ9色| 亚洲精选免费视频| 久久99蜜桃| 日本不卡免费播放| 国产亚洲一区二区三区在线播放 | 天天综合天天| 国产精品精品国产| 欧美丝袜一区二区三区| 欧美精品三区| av蜜臀在线| 欧美在线观看视频免费| 中文字幕日韩欧美在线| 久久综合狠狠综合| 日韩欧美在线精品| 日本国产在线| 日韩免费三级| 久久精品99久久香蕉国产色戒| 国产精品护士白丝一区av| 国产精品午夜一区二区三区| 国外av在线| 免费看啪啪网站| 欧美疯狂做受xxxx高潮| 亚洲最大的成人av| 一区二区三区成人精品| 黄色亚洲网站| 欧美hdsex| 好吊色欧美一区二区三区视频 | 国产日产一区二区| 久久久久久久久久久99| 国产成人精品日本亚洲专区61| 色婷婷久久久久swag精品 | 毛片无码国产| 羞羞小视频视频| 国产一区二区久久久| 亚洲女人天堂网| 亚洲色图20p| 国产欧美综合一区二区三区| 91在线亚洲| 日本福利午夜视频在线| 国产在线视频综合| 国产精品国模在线| 日韩高清av在线| 一级特黄大欧美久久久| 男男成人高潮片免费网站| 国产极品模特精品一二| 成人免费视频| 国产黄色片免费在线观看| 成人激情av在线| 亚洲人成在线播放| 伊人久久大香线蕉无限次| av播放在线观看| 蜜臀av午夜一区二区三区| 91精品久久久久久久久久久久久久 | 欧美s码亚洲码精品m码| 91久久中文字幕| 亚洲男人天堂2023| 偷拍一区二区三区四区| 国产大陆a不卡| 亚洲一级二级| 亚洲综合福利| 欧美大片网站| 青青草原国产在线| 亚洲最新合集|