日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > HTML > 正文

Canvas高級路徑操作之拖拽對象的實現

2024-08-26 00:21:39
字體:
來源:轉載
供稿:網友

為了追蹤所畫內容,諸如畫圖應用程序、計算機輔助設計系統(computer-aided design system 簡稱CAD系統)以及游戲等許多應用程序,都會維護一份包含當前顯示對象的列表。通常來說,這些應用程序都允許用戶對當前顯示在屏幕上的物體進行操作。比方說,在CAD應用程序中,我們可以對設計中的元素進行選擇、移動、縮放等操作

——《HTML5 Canvas核心技術》

在Canvas中 實現拖拽 也同樣如此,Canvas提供了一個名為 isPointInPath(x, y) 的API,判斷 點(x, y) 是否在路徑之中。如果在路徑之中,則返回true。于是我們可以有如下思路:

維護一個可以描述各個路徑的 數組 ,通過 ispointInPath(x, y) 判斷點擊位置是否在某一個路徑之中,如果在此路徑之中,選中此路徑,進行操作(移動、縮放等),再繪制圖形

此文我以 多邊形拖拽為例進行說明 ,Demo如下(后面的印子是錄屏軟件的原因:japanese_ogre:):

 

 
Canvas,高級路徑,拖拽對象 

 

CodePen打開

Demo中的多邊形如何繪制之前做過總結,不再贅述:ghost::Canvas多邊形繪制

思路說明

下圖給了大致的說明及偽代碼,思路并不難,但有部分細節需要處理

 

 
Canvas,高級路徑,拖拽對象 

 

代碼結構說明

此處列舉代碼結構及標注其思路,更詳細的代碼注釋已在CodePen之中

因為本文重點在拖拽(drag),所以對繪圖部分描述會較少

//繪制多邊形路徑函數function drawPolygonPath//多邊形類定義class Polygon{    ...}//根據點擊事件返回在canvas中的位置function positoinInCanvas//獲取兩點間直線距離function getDistance//開始階段,記錄拖拽對象canvas.onmousedown//拖拽階段,畫路徑,描邊canvas.onmousemove//結束階段,更新拖拽對象位置canvas.onmouseup

關鍵部分說明

接下來開始代碼中的關鍵部分及細節處理

如何維護拖拽對象數組

在程序初始化時,我們定義一個polygonArray數組

polygonArray = []

在每次畫一個新的多邊形之后,都會new一個多邊形對象推入數組中進行維護

const polygon = new Polygon(mouseStart.get('x'), mouseStart.get('y'), sideNum, radius);polygonArray.push(polygon);//記錄路徑對象

在后續點擊操作時,需要根據對應信息確定點擊位置是否在路徑之中

點擊時,如何選取要拖拽的對象

首先獲取點擊時在 canvas中 的對應位置,我的代碼用 mouseStart 記錄 x 及 y 
接著遍歷 polygonArray 中的 polygon ,遍歷中調用 polygon.createPath() ,通過 isPointInPath() 判斷點擊位置是否有路徑,有的話 draggingPolygon = polygon 結束函數

const pos = positionInCanvas(e, canvasLeft, canvasTop);//獲取在canvas中的像素位置//記錄鼠標起始點smouseStart.set('x', pos.x);mouseStart.set('y', pos.y);...for (let polygon of polygonArray) {                polygon.createPath();                if (ctx.isPointInPath(mouseStart.get('x'), mouseStart.get('y'))) {                    draggingPolygon = polygon;                    return;                }            }

拖拽時的計算

這部分要完全理解推薦大家根據Demo中兩個 console.log(draggingPolygon) 及代碼進行調試,因為我們是在 mousemove 階段,這個階段觸發函數非常頻繁

我盡量用語言表達清楚

首先計算 move 時與 mouseStart 的距離,記為diff,有x軸上的 offsetX ,也有y軸上的 offsetY

const    pos = positionInCanvas(e, canvasLeft, canvasTop),    diff = new Map([      ['offsetX', pos.x - mouseStart.get('x')],      ['offsetY', pos.y - mouseStart.get('y')]    ]);

接著記錄當前拖拽對象的 centerX 及 centerY ,記為temp

let    tempCenterX = draggingPolygon.centerX,    tempCenterY = draggingPolygon.centerY;

這里就是難理解的點,為什么要記錄?繼續往下看,后面會使用到。

根據 diff 中的offset,設置draggingPolygon新的中心位置

draggingPolygon.centerX += diff.get('offsetX');draggingPolygon.centerY += diff.get('offsetY');

接著清空畫布進行繪制新的路徑和描邊

ctx.clearRect(0, 0, canvas.width, canvas.height);for (let polygon of polygonArray) {    drawPolygonPath(polygon.sideNum,         polygon.radius,         polygon.centerX,         polygon.centerY, ctx);    ctx.stroke();}

最后使用到上文中的 tempCenterX 與 tempCenterY :

draggingPolygon.centerX = tempCenterX;draggingPolygon.centerY = tempCenterY;

為什么需要這么做呢?

因為我們的拖拽是 基于多邊形的原位置 ,而 mousemove 階段并 不能確定函數的最終位置 ,如果這時沒有復原的話,會出現 "漂移" ,我把這兩行代碼注釋掉,效果如下:

 

 
Canvas,高級路徑,拖拽對象 

 

如果我沒說清楚,墻裂推薦大家對代碼進行修改和調試

拖拽后的處理

拖拽完成后是處于 mouseup 階段,此時我們已經確定dragginPolygon的最終位置,進行更新即可,最后置為null,排除 在沒有拖拽多邊形情況下,鼠標在畫布上移動觸發對應代碼

const    pos = positionInCanvas(e, canvasLeft, canvasTop),    offsetMap = new Map([        ['offsetX', pos.x - mouseStart.get('x')],        ['offsetY', pos.y - mouseStart.get('y')]    ]);draggingPolygon.centerX += offsetMap.get('offsetX');draggingPolygon.centerY += offsetMap.get('offsetY');draggingPolygon = null;

結語

其實這個功能實現并不難,關鍵是了解一個概念:通過維護當前顯示對象的列表及isPointInPath進行判斷來實現追蹤
最后歡迎大家交流學學習

參考資料

《HTML5 Canvas核心技術》

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产日韩中文在线| 日韩欧美一二三区| 亚洲福利在线看| 国产手机精品视频| 二区中文字幕| 亚洲福利一区| 一区二区视频国产| 国产福利在线播放| 久久婷婷综合国产| 久久香蕉精品| 欧美日韩精品欧美日韩精品| 亚洲热线99精品视频| 欧美中文字幕在线观看视频| 国产伦精品免费视频| 日韩精品在线观| 欧美国产日韩在线播放| 色偷偷一区二区三区| 国内国产区免费视频| 欧美日韩精品免费看| 中文在线不卡视频| 精品调教chinesegay| 高清一区二区| 一级日本免费的| av中文在线播放| 国产亚洲污的网站| 国产一区日韩| 国产裸体歌舞团一区二区 | 国产91久久久久蜜臀青青天草二| 亚洲免费精品| 91精品国产调教在线观看| 91久久精品视频| 日韩在线高清视频| 二区视频在线观看| 精品久久九九| 国产一区不卡在线| 亚洲午夜久久| 国产不卡一区| 中文字幕线观看| 日韩在线一区二区视频| 在线欧美一级视频| 亚洲一区日韩在线| 日韩精品久久久| 欧美日韩中文字幕在线| 91精品国产综合久久久蜜臀粉嫩| 欧美日韩国产中文精品字幕自在自线| 久久99精品久久久久子伦| 九一精品国产| 日韩欧美国产不卡| 亚洲乱码一区av黑人高潮| 欧美日韩精品在线| 欧美日韩高清在线| 日韩免费精品视频| 中文字幕日韩第一页| 国内精品99| 一区二区不卡视频| 国产欧美日韩在线观看| 99视频一区| 欧美中日韩在线| 日韩区欧美区| 精品一二线国产| 中文字幕国产欧美| 国产成人精品av久久| 日韩欧美国产高清| 国产乱码午夜在线视频| 中文字幕欧美人妻精品一区蜜臀| 亚洲人线精品午夜| 不卡专区在线| 伊人亚洲视频| 精品色蜜蜜精品视频在线观看| 久久99精品久久久久子伦| 国产极品嫩模在线视频一区 | 日韩视频专区| 91精品国产91| 色99中文字幕| 91国内精品在线视频| 中文字幕国产视频| 国产欧美日韩在线观看| 欧美日韩国产中字| 久本草在线中文字幕亚洲欧美| 中文 欧美 日韩| 日韩欧美国产三级| 国产在线观看a| 精品网站999www| 国产乱码在线| 欧美在线日韩精品| 精品日韩99亚洲| 精品调教chinesegay| 99精品视频国产| 91精品国产网站| 亚洲免费在线视频一区 二区| 国产在线看一区| 精品一区二区三区中文字幕 | 亚洲国产一区自拍| 日韩中文字幕在线视频播放| 日韩在线一区二区视频| 狠狠色噜噜狠狠狠狠97| 国产第一页在线播放| 日韩精品高清不卡| 在线观看免费国产小视频| 一区二区不卡在线| 不卡在线视频| 国产调教精品| 91久久精品国产91久久| 91精品免费看| 成片免费观看| 91精品国产自产在线观看永久∴| av午夜在线| 婷婷综合福利| 日本黄色一区二区三区| 日韩精品在线网站| 国产福利三区| 精品久久久久久综合日本欧美| 日韩视频一区在线观看| 91精品视频播放| 国产中文伊人| 欧美亚洲视频在线看网址| 免费看ww视频网站入口| 色屁屁一区二区| 国产乱国产乱300精品| 中文字幕在线视频久| 亚洲福利精品视频| 91精品国产高清| 国产劲爆久久| 日韩欧美综合在线| 国产劲爆久久| 国产黄色在线播放| 亚洲欧洲国产视频| 国产福利一区二区| 欧美日韩999| 国产在线精品日韩| 91精品久久久久久久久久| 欧美日韩性视频| 91麻豆精品在线| 天天综合天天添夜夜添狠狠添| 一区二区不卡视频| 精品国产99久久久久久| 日韩av中文字幕一区| 欧美日韩综合视频| 中文字幕一区二区三区精品| 中文字幕在线观看网址| 不卡在线一区二区| 欧美日韩国产观看视频| 亚洲免费观看视频| 国产一级在线免费观看| 中文在线中文字幕| 国产成人精品免费网站| 欧美日韩高清一区二区| 亚洲视频色图| 国产欧美日韩亚洲| 亚洲免费中文字幕| 精品久久九九| 精品亚洲综合| 91日韩中文字幕| 国产又粗又猛又爽又黄91精品| 欧美日韩精品欧美日韩精品| 91精品国产调教在线观看| 日韩精品中文在线观看| 日韩欧美专区在线| 日韩欧美国产一二三区| 欧美片网站免费| 精品视频国产| 日韩精品不卡一区二区| 欧美高清一区| 91精品国产欧美日韩| 精品日韩欧美| 亚洲最新永久观看在线| 视频一区二区中文字幕| 国产成免费视频| 精品视频国产| 91久久精品在线| 日本亚洲欧美| 国产欧美日韩成人| 久久99蜜桃精品久久久久小说| 美女在线视频一区| 一级日韩一级欧美| 中文在线不卡| 日韩在线高清视频| 精品无人国产偷自产在线| 欧美一级免费在线观看| 国产一级免费在线观看| 一区二区中文字幕在线| 日韩一二三四区| 日韩国产在线观看一区| 国产第一页在线播放| 91精品婷婷国产综合久久竹菊| 国产卡1卡2卡三卡在线| 日韩精品一二三四区| 77777_亚洲午夜久久多人| 久久精品www| 亚洲综合欧美在线| 欧美一级久久久久久久久大| 99这里有精品视频| 最近中文字幕第一页| 黄色国产网站在线观看| 天天在线视频色| 精品国产乱码久久久久久蜜臀| 欧美日韩成人一区| 中文字幕亚洲乱码| 在线日韩中文字幕| 日韩免费视频一区二区视频在线观看| 91麻豆精品国产91久久久使用方法 | 婷婷久久综合九色国产成人| 日韩欧美一级二级三级久久久| www.xxxx精品| 日韩视频精品在线| 福利一区二区| av一区二区高清| 亚洲第一中文字幕| 中文字幕在线观看欧美| 久久riav| 日韩亚洲欧美中文高清在线| 亚洲成年网站在线观看| 中文精品在线| 国产黄色在线| 国产天堂素人系列在线视频| 欧美黄页在线免费观看| 日韩三级视频在线播放| 久久精品一二三| 精品成a人在线观看| 国产h片在线观看| av午夜在线| 日韩欧美看国产| 久久婷婷国产| 一区二区在线高清视频| 一二三区精品福利视频| 日韩视频在线免费看| 国产婷婷在线观看| 中文字幕日韩精品在线| 中文av字幕一区| 日韩av综合在线观看| 亚洲视频在线观看日本a| 日韩亚洲欧美中文高清在线| 国产高清精品二区| 久久精品日韩无码| 中文字幕亚洲字幕| 国产小视频在线| 日韩精品 欧美| 视频一区日韩| 拍真实国产伦偷精品| 中文字幕欧美日韩在线不卡| 日韩精品在线免费播放| 日韩在线 中文字幕| 欧洲精品二区| 久艹在线视频| 久久精品蜜桃| 欧美在线日韩在线| 久久精品夜夜夜夜久久| 丰满少妇一区| 欧美专区中文字幕| 午夜一区二区三区| 欧美久久久精品| 一级日韩一级欧美| 日韩精品在线私人| 欧美日韩成人一区二区| 欧美日韩91| 亚洲第一页中文字幕| 欧美日韩成人综合| 中文字幕视频在线免费欧美日韩综合在线看 | 国产精品福利视频一区二区三区| 一区二区在线观看不卡| 91精品国产综合久久香蕉的特点| 精品国产欧美日韩| 国产日韩成人精品| 日韩在线 中文字幕| 激情国产在线| 久久久久久99精品| 亚洲国产福利视频| 国产午夜精品视频免费不卡69堂| 日韩欧美在线视频日韩欧美在线视频| 国产日韩专区| 精品欧美不卡一区二区在线观看| 中文字幕日韩免费视频| 午夜成人鲁丝片午夜精品| 激情久久99| 亚洲欧美日本国产专区一区| 久久riav| 日韩中文字幕在线播放| 中文字幕在线看视频国产欧美| 在线观看精品国产| 国产性一级片| 国产成人精品三级| 一区二区精品区| 日韩欧美不卡视频| 在线视频不卡国产V| 欧美精选午夜久久久乱码6080| 国产小视频免费在线网址| 亚洲高清视频在线| 亚洲大片免费看| 亚洲男女av一区二区| 日韩视频在线一区二区| 久久久99久久精品欧美 | 在线一区二区三区精品| 精品国产欧美日韩不卡在线观看| 中文字幕在线看视频国产欧美| 国产成人精品av久久| 日本熟女一区二区| 一级片在线免费看| 日韩精品乱码av一区二区| 日韩精品免费观看视频| 日韩av一区在线| 国产福利不卡| 国产乱码在线观看| 亚洲一区二区三区精品中文字幕| 国产69精品久久久久孕妇国产69久久 | 一区在线视频观看| 日韩欧美国产网站| 91极品视频在线观看| 亚洲va久久久噜噜噜久久| 精品国产91乱高清在线观看| 日韩字幕在线观看| 日韩影院二区| 中文字幕日韩第一页| 国产欧美自拍一区| 日韩 国产 一区| 日韩精品福利视频| 91精品国产日韩91久久久久久| 最近高清中文在线字幕在线观看1| 在线观看91精品国产入口| 先锋男人资源站| 男人的天堂网av| 91欧美在线视频| 欧美日韩在线播放三区四区| 国产福利久久久| 97天天综合网| 欧美激情视频一区二区三区在线播放 | 91精品国产入口| 欧美日韩国产在线观看| 欧美三级视频在线| 欧美1234区| 亚州黄色一级| 亚洲欧洲日产国码av系列天堂 | 日韩欧美在线网址| 欧美日韩综合在线| 日韩欧美三级视频| 中文字幕国产日韩| 亚洲一区中文字幕在线| √天堂资源中文www| 91麻豆免费视频网站| 亚州黄色一级| 久久91精品久久久久久秒播| 国产一级片播放| 国产成人精品三级| 日韩午夜高潮| 一区二区视频在线观看免费的| 欧美日韩一区二区在线视频| 人人做人人澡人人爽欧美| 日韩精品视频在线看| 午夜高潮免费视频| 欧美日韩中文字幕综合视频| 欧美一级久久久久久久久大| 91精品国产网站| 91麻豆免费视频网站| 日韩av中文字幕一区| 一级网站免费观看| 国产羞羞视频在线播放| 日韩在线不卡| 精品成人久久av| 中文字幕第一页在线播放| 日韩精品视频网| 91久久久精品| 91精品国产91久久| 国产福利一区二区精品秒拍| 日韩av中文字幕一区| 国产成人va亚洲电影| 欧美一级欧美三级在线观看| 婷婷中文字幕综合| 九一精品国产| 999精品在线| 欧美.日韩.国产.一区.二区| 中文字幕2020第一页| 一本大道一区二区三区| 欧美日韩国产黄色| 日韩欧美成人一区二区三区| 日韩专区视频网站| 欧美日韩成人一区| www.狠狠干| 亚洲综合欧美在线| 韩国av一区二区| 久久视频一区| 日韩欧美久久| 日韩在线中文字幕| 国产区高清在线| 日韩视频在线一区二区三区| 精品一性一色一乱农村| 一级网站免费观看| 日韩精品在线网站| 国产欧美在线观看| 中文字幕亚洲一区在线观看| 日韩视频中文字幕| 亚洲免费精品| av影视在线看| 中文字幕 日韩 欧美| 欧美日韩中文字幕在线| 亚洲男人在线| av中文网站| 国产不卡在线观看视频| 欧美日韩色综合| 在线视频一区二区三区在线播放| 日韩高清在线不卡| 欧美日韩国产91|