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

首頁 > 編程 > HTML > 正文

html5中監聽canvas內部元素點擊事件的三種方法

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

canvas內部元素不能像DOM元素一樣方便的添加交互事件監聽,因為canvas內不存在“元素”這個概念,他們僅僅是canvas繪制出來的圖形。這對于交互開發來說是一個必經障礙,想要監聽圖形的點擊事件思路很簡單,只要監聽canvas元素本身的點擊事件,再判斷點擊坐標位于哪一個圖形內部,就變相實現了圖形點擊事件。本文將介紹三種方法,判斷坐標點是否位于某個canvas圖形內部。

約定

本文介紹的三種方法適用于識別canvas內形狀不規則而且位置無規律的圖形點擊事件,對于形狀規則或者位置有規律的場景,肯定有更簡便的實現,這里不做討論。

像素法

像素檢測法的思路是,將canvas中的多個圖形(如果有多個的話)分別離屏繪制,并用 getImageData() 方法分別獲取到像素數據保存起來。當canvas元素監聽到點擊事件時,通過點擊坐標可以直接推算出點擊發生在canvas上的第幾個像素,然后遍歷前面保存的圖形數據,看看這個像素的alpha值是不是0,如果是0說明落點不在當前圖形內,否則就說明點到了這個圖形。

根據點擊坐標得到所點擊的像素序號的方法:

像素序號 = (縱坐標-1) * canvas寬度 + 橫坐標

比如在寬度為 5 的畫布上點擊坐標 (3,3) ,根據上述公式得到像素序號是 (3-1) * 5 + 3 = 18 ,如圖所示:

html5,監聽,canvas,內部元素,點擊事件

因為canvas導出的圖形數據是將每個像素以 rgba 的順序存成4個數字組成的數組,所以想訪問指定像素的alpha值,只要讀取這個數組的第 pIndex * 4 + 3 個值就可以了,如果這個值不為0,說明該像素可見,也就是點擊到了該圖形。

這個方法是我認為思路最直接、結果最準確、而且對圖形形狀沒有任何要求的方法,但這個方法有一個致命的局限,當圖形需要在畫布上移動時,要頻繁的創建數據緩存才能保證檢測結果準確,受到畫布尺寸和圖形數量的影響, getImageData() 方法的性能會成為嚴重的瓶頸。所以如果canvas圖形是靜態的,這個方法非常適合,否則就不適合用這個方法了。

角度法

角度判斷法的原理很容易理解,如果一個點在多邊形內部,則該點與多邊形所有頂點兩兩構成的夾角,相加應該剛好等于360°。

html5,監聽,canvas,內部元素,點擊事件

計算過程可以轉變為以下三個步驟:

1.已知多邊形頂點和已知坐標,將坐標與頂點兩兩組合成三點隊列
2. 已知三點求夾角,可以使用 余玄定理 
3.判斷夾角之和是否360°

每一步都很簡單,實現如下:

//計算兩點距離const getDistence = function (p1, p2) {  return Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y))};//角度法判斷點在多邊形內部const checkPointInPolyline = (point, polylinePoints) => {    let totalA = 0;    const A = point;    for (let i = 0; i < polylinePoints.length; i++) {        let B, C;        if (i === polylinePoints.length - 1) {            B = {                x: polylinePoints[i][0],                y: polylinePoints[i][1]            };            C = {                x: polylinePoints[0][0],                y: polylinePoints[0][1]            };        } else {            B = {                x: polylinePoints[i][0],                y: polylinePoints[i][1]            };            C = {                x: polylinePoints[i + 1][0],                y: polylinePoints[i + 1][1]            };        }        //計算角度        const angleA = Math.acos((Math.pow(getDistence(A, C), 2) + Math.pow(getDistence(A, B), 2) - Math.pow(getDistence(B, C), 2)) / (2 * getDistence(A, C) * getDistence(A, B)))        totalA += angleA    }    //判斷角度之和    return totalA === 2 * Math.PI}

這個方法有一個局限性,就是圖形必須是 凸多邊形 。如果不是凸多邊形需要先切割成凸多邊形再計算,這就比較復雜了。

類似的思路還有面積法,如果一個點在多邊形內部,那么該點與多邊形所有頂點兩兩構成的三角形,面積相加應該等于多邊形的面積,首先計算多邊形的面積就很麻煩,所以這種方法可以直接pass掉。

射線法

射線法是一個我講不清道理但非常好用的方法,只要判斷點與多邊形一側的交點個數為奇數,則點在多邊形內部。需要注意的是,只要數任何一側的焦點個數就可以,比如左側。這個方法不限制多邊形的類型,凸多邊形、凹多邊形甚至環形都可以。

html5,監聽,canvas,內部元素,點擊事件

實現起來也非常簡單:


 

const checkPointInPolyline = (point, polylinePoints) => {    //射線法  let leftSide = 0;  const A = point;  for (let i = 0; i < polylinePoints.length; i++) {    let B, C;    if (i === polylinePoints.length - 1) {      B = {        x: polylinePoints[i][0],        y: polylinePoints[i][1]      };      C = {        x: polylinePoints[0][0],        y: polylinePoints[0][1]      };    } else {      B = {        x: polylinePoints[i][0],        y: polylinePoints[i][1]      };      C = {        x: polylinePoints[i + 1][0],        y: polylinePoints[i + 1][1]      };    }    //判斷左側相交    let sortByY = [B.y, C.y].sort((a,b) => a-b)    if (sortByY[0] < A.y && sortByY[1] > A.y){      if(B.x<A.x || C.x < A.x){        leftSide++      }    }  }  return leftSide % 2 === 1}

射線法有一種特殊情況,當點在多變形的一條邊上時需要特殊處理。但在工程中我認為也可以不處理,因為如果用戶剛好點在圖形的邊界上,那么程序認為他沒有點到也講的過去。

總結

以上三種方法都可以實現canvas中不規則圖形的點擊檢測。其中,像素法的優勢在于不挑形狀,而且在靜態場景中有一定的性能優勢;角度法應該說只有理論價值,實用性不佳;工程中最實用的當屬射線法,局限性小,實現簡單,多數時候只需要知道射線法就可以了。
 


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产在线播放一区二区| 中文亚洲欧美| 欧美片网站免费| 日韩精品视频免费播放| 亚洲国产91精品在线观看| 91精品高清| 欧美日韩国产一区中文午夜| 一区二区不卡在线| 国产成人精品三级| 国产成人精品综合久久久| 日韩中文在线中文网三级| 中文字幕欧美亚洲| 日韩中文首页| 亚洲第一香蕉网| 日本黄色一区二区三区| 久本草在线中文字幕亚洲欧美| 亚洲深夜福利| 91精品在线观| www中文字幕在线观看| www中文字幕| 精品国产乱码久久久久久蜜臀| 国产视频97| 精品人妻一区二区三区视频| 日韩一级免费视频| 在线视频不卡国产V| 国产精品一区二区三区免费观看| 色综合久久六月婷婷中文字幕| 国产网站欧美日韩免费精品在线观看| 日韩 欧美 综合| 欧美三级中文字幕在线观看| 黄色一级大片在线免费看国产一| 91麻豆视频网站| 中文在线а√在线8| 日韩不卡一二三区| 久久久另类综合| 欧美日韩在线精品成人综合网| 国产日韩综合| 一区二区在线观| 欧美日韩综合高清一区二区 | 在线日韩精品视频| 欧美国产中文| 中文字幕欧美日韩| 欧美一级一级性生活免费录像| 国产999在线观看| 在线观看国产一区| www..com日韩| 欧美日韩精品三区| 亚洲综合在线不卡| 久久久91精品| 国产日韩1区| 中文欧美日韩| 欧美久久久精品| 久久精品久久久久| 91精品久久久久| 日韩免费久久| 伊人国产视频| 亚洲理论中文字幕| 国产在线视频一区二区| 黄色国产网站在线观看| 日韩欧美中文字幕视频| 色综合天天性综合| 91久久久精品国产| 欧美成人二区| 国产高清一区| 亚洲人线精品午夜| 最新中文在线视频| 最近高清中文在线字幕在线观看1| 国产视频1区| 日韩精品视频中文字幕| 国产资源中文字幕| 日韩精品视频在线观看网址 | 中文字幕精品一区二| 亚洲 欧美综合在线网络| 91久久精品国产91性色69| 亚洲第一视频网站| 亚洲一区在线观看网站| 国产无遮挡在线视频免费观看| 精品久久久网| 亚洲欧洲日韩在线| 欧美精品一区二区三区在线播放| 日韩久久精品网| 欧美日韩视频免费播放| 国产在线观看精品| 国产真实乱子伦精品视频| 亚洲最新免费视频| 精品视频123区在线观看| 日韩亚洲不卡在线| 日韩欧美在线中文字幕| 欧美高清一级片在线| 日韩视频 中文字幕| 一区二区在线观看不卡| 亚洲视频中文字幕| 国产欧美日韩亚洲| 亚洲二区自拍| 成年人看的羞羞网站| 久久久综合av| 久久久久蜜桃| 精品国产免费视频| 日韩 欧美 中文| 欧美日韩国产不卡| 欧美日韩亚洲系列| 最近中文av字幕在线中文| 欧洲精品二区| 亚洲欧洲日产国码av系列天堂 | 国产在线看一区| 日韩精品三级| 日韩精品视频在线播放| 久久99蜜桃精品久久久久小说| 中文字幕日韩欧美在线视频| 日韩欧美一级视频| 欧美日韩三级在线观看| 欧美中文字幕在线观看视频| 成年人黄国产| 黄色国产网站在线观看| 精品日韩欧美在线| 久久香蕉精品| 激情国产在线| 欧美日韩亚洲一| 日韩精品三级| 欧美精品一区二区三区在线播放| 91精品在线看V| 国产亚洲污的网站| 一本一道综合狠狠老| 欧美日韩在线精品一区二区三区激情综| 日韩在线中文| 欧美日韩国产综合视频在线观看 | 亚洲午夜91| 精品日韩在线| 日韩中文字幕在线一区| 午夜影院在线观看欧美| 国产一卡2卡3卡免费网站| 国产黄在线播放| 日韩手机在线观看视频| 国产欧美日韩成人| 1024国产在线| 在线观看国产一区| 中文字幕在线视频久| 欧美日韩午夜在线视频| 亚洲永久免费视频| 日韩在线观看视频一区| 欧美日韩一级黄| 欧美日韩中文字幕在线观看| 久久精品久久精品国产大片| 日韩三级精品电影久久久| 白嫩少妇丰满一区二区| 久久99久久久久久久噜噜| 激情综合色综合久久| 国产在线第一页| 又黄又www的网站| 日韩在线观看视频一区| 久久久91精品国产| 免费在线播放av| 韩国一区二区av| 国产成人精品日本亚洲专区61| 一级片在线免费看| 粉嫩喷白浆久久| 欧美国产小视频| 午夜福利一区二区三区| 国产视频不卡| 久久综合九色欧美综合狠狠| 中文字幕在线观看国产| 欧美日韩精品欧美日韩精品| 中文不卡在线| 国产欧美日韩亚州综合| 国产中文在线视频| 亚洲一区二区三区精品中文字幕| 国产拍揄自揄精品视频麻豆| 粉嫩喷白浆久久| 亚洲一区日韩在线| 在线国产99| 一级国产黄色片| 国产成人精品日本亚洲专区61| 国产欧美日韩最新| 国产欧美综合在线观看第十页| 亚洲高清视频一区| 欧美不卡一二三| 麻豆精品99| 国产裸体歌舞团一区二区| 一本大道一区二区三区| 青青国产91久久久久久| 欧美一级久久| 国产福利第一页| 中文字幕在线视频网| 福利一区二区| 国产高清在线视频| 一级片免费在线| 91精品国产综合久久香蕉最新版| 亚洲一区视频在线观看视频| 久久久综合精品| 91精品国产高清久久久久久| 国产在线欧美| 欧美日韩精品欧美日韩精品一| 亚洲第一页中文字幕| 中文字幕在线日韩| 欧美高清一级片在线| 亚洲二区自拍| 国产欧美日韩最新| 国产三级中文字幕| 亚洲一区中文| 国产1卡2卡三卡四卡网站| 精品网站999www| 国产v日产∨综合v精品视频| 国产福利在线导航| 日韩.欧美.亚洲| 日韩中文字幕第一页| 日韩av一区二区在线| 国产免费久久| 久久综合久久综合九色| 日韩精品三级| 色综合影院在线| 久久精品www| 欧美亚洲另类制服自拍| 色综合天天综合网天天狠天天| 日韩欧美在线字幕| 在线中文字幕网站| 日韩.欧美.亚洲| 日韩精品在线免费播放| 一二三区精品福利视频| 国产一级一片免费播放| 精品国产综合久久| 欧美亚洲免费高清在线观看| 91精品国产自产在线| 亚洲国产无线乱码在线观看| 美国av一区二区| av首页在线| 中文字幕最新精品| 二区视频在线观看| 国产色综合网| 日韩精品丝袜在线| 日本亚洲欧美| 精人妻一区二区三区| 亚洲最新永久观看在线| 久久91精品久久久久久秒播| 欧美日韩在线不卡| 黄色片免费在线| 欧美中文字幕视频在线观看| 最近中文字幕在线中文视频| 中文字幕五月欧美| 久久久久黄色| 不卡av免费在线| 国产黄色小视频| 日韩在线中文字幕| 免费在线播放av| 一区二区三区视频网站 | 精品久久电影| 欧美日本精品在线| av免费在线播放| 在线视频不卡国产V| 国产乱国产乱老熟300| 中文字幕 欧美 日韩| h片精品在线观看| 欧美日韩午夜在线| 亚洲免费精品视频| 日韩欧美亚洲区| 亚洲一级影院| 黄色一区二区视频| 亚洲欧美久久久| 国产字幕在线看| 粉嫩喷白浆久久| 99精品人妻国产毛片| 国产日韩成人精品| 久久久99久久| 国产高清精品在线观看| 日韩中文首页| 国产传媒久久久| 日本精品免费观看高清观看| 欧美一级免费在线观看| 日韩 国产 一区| 激情久久99| 91麻豆免费视频网站| 欧美日韩高清| 国产嫩草影院久久久久| 99在线国产| 国产欧美日韩第一页| 不卡专区在线| 国产亚洲二区| 国产成人日日夜夜| 国产欧美日韩第一页| 亚洲欧美中文在线视频| 欧美婷婷久久| 狠狠色综合色区| 国产乱国产乱老熟300部视频| 日韩精品手机在线观看| 91精品久久久久久久久| 欧美日韩国产高清视频| 男人的天堂网av| 欧美午夜精品在线| 日韩欧美国产三级| 国产日韩精品久久久| 黄色国产在线| 日韩欧美国产1| 中文字幕在线日韩| 日韩精品在线中文字幕| 欧美久久在线观看| 91久久中文| 亚洲制服一区| 亚洲国产福利视频| 中文字幕 欧美 日韩| 欧美日韩高清在线播放| 精品一性一色一乱农村| 中文字幕在线观看视频www| 91精品国产亚洲| 久99久视频| 亚洲影视资源网| 精品一性一色一乱农村| 精品国产乱码久久久久久牛牛| 精品日韩欧美在线| 国产一级一片免费播放| 日韩一级二级三级| av一区在线观看| 欧美日韩国产亚洲一区| 精品国产1区二区| 伊人国产视频| 精品成人久久久| 国产嫩草影院久久久久| 日韩中文在线字幕| 欧美不卡视频一区| 精品人妻一区二区三区视频| 亚洲乱码在线观看| 免费看黄资源大全高清| 亚洲综合日韩| 国产资源中文字幕| 91欧美日韩在线| 欧美日韩精品在线视频| 欧美日韩国产第一页| 亚洲一区在线观看网站| 日韩精品视频网站| 久久精品99久久久久久久久| 免费在线亚洲| 日韩在线 中文字幕| 欧美日韩一级片在线观看| 欧美日韩99| 国产日韩精品在线观看| 91 中文字幕| 中文字幕欧美日韩va免费视频 | 日韩美女视频一区二区在线观看| 国产乱码在线观看| 91av久久久| 亚洲社区在线| 欧美中文字幕| 久久精品久久精品亚洲人| 日本精品福利视频| 欧美亚洲免费高清在线观看| 欧美亚洲国产日韩| 免费在线国产| 美女黄a一级视频| 欧美日韩精品免费| 91久久久久| 日韩免费精品| 91www成人久久| 亚洲福利在线看| 午夜亚洲一区| 中文字幕亚洲二区| 亚洲黄在线观看| 欧美国产三级| 91精品国产入口| 欧美三级日本三级少妇99| 色妇色综合久久夜夜| 在线看的av| 日韩精品视频免费看| 亚洲欧洲日韩精品在线| 欧美日韩国产一中文字不卡| 久久精品免费在线观看| 999精品视频在线观看播放| 中文字幕一区二区三区精品| 欧美日韩第一区日日骚| 欧美激情一区二区在线| eeuss一区| 国产欧美日韩三级| 亚洲福利视频在线| 日韩中文字幕二区| 欧美日韩精品区| 在线精品视频免费播放| 精品久久在线观看| 中文字幕精品一区二| 91精品综合久久| 日韩在线一区二区视频| 国产一区不卡精品| 欧美国产亚洲一区| 欧美日韩激情在线一区二区三区| 中文字幕 欧美日韩| 日本精品国语自产拍在线观看| 美女尤物久久精品| 99视频一区| 国产福利在线看| 欧美日韩一二三四| 99精品视频99| 日韩欧美综合视频| 在线免费91| 国产高清在线一区| 中文字幕精品国产| 97久久精品| 精品日本视频| 欧美中日韩在线| 亚洲欧洲日产国码av系列天堂| 精品日韩在线| 亚洲第一网中文字幕| 亚洲 欧美 精品| 视频一区不卡| 在线视频一区二区三区在线播放|