返回顶部
首页 > 资讯 > 精选 >如何在html5中监听canvas内部元素点击事件
  • 555
分享到

如何在html5中监听canvas内部元素点击事件

2023-06-09 21:06:36 555人浏览 泡泡鱼
摘要

如何在HTML5中监听canvas内部元素点击事件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。像素法 像素检测法的思路是,将canvas中的多个图形(如果有多个的话)分别离屏

如何在HTML5中监听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内部元素点击事件

计算过程可以转变为以下三个步骤:

已知多边形顶点和已知坐标,将坐标与顶点两两组合成三点队列
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}

看完上述内容,你们掌握如何在html5中监听canvas内部元素点击事件的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何在html5中监听canvas内部元素点击事件

本文链接: https://lsjlt.com/news/257846.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在html5中监听canvas内部元素点击事件
    如何在html5中监听canvas内部元素点击事件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。像素法 像素检测法的思路是,将canvas中的多个图形(如果有多个的话)分别离屏...
    99+
    2023-06-09
  • JavaScript关于某元素点击事件的监听和触发
    目录一. 触发元素同步效果方法一: 原生JavaScript的click()点击事件方法二:JQuery事件 — trigger()方法二. 触发元素...
    99+
    2024-04-02
  • 如何在Html5中监听返回事件
    本篇文章为大家展示了如何在Html5中监听返回事件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在使用MUI框架的时候,我们经常会用到一个头部带有.mui-action-back的class<...
    99+
    2023-06-09
  • jQuery如何监听元素拖拽事件?
    这篇文章将为大家详细讲解有关jQuery如何监听元素拖拽事件?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery 监听元素拖拽事件 简介 jQuery 提供了多种方法来监听元素的拖拽事件,包括 m...
    99+
    2024-04-02
  • jQuery如何监听元素释放事件?
    这篇文章将为大家详细讲解有关jQuery如何监听元素释放事件?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery 监听元素释放事件 简介 在 jQuery 中,监听元素释放事件至关重要,因为它允许...
    99+
    2024-04-02
  • jQuery如何监听鼠标点击事件?
    这篇文章将为大家详细讲解有关jQuery如何监听鼠标点击事件?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。jQuery监听鼠标点击事件 jQuery提供了多种方式来监听鼠标点击事件,最常用的方法如下: ...
    99+
    2024-04-02
  • jQuery如何在点击事件中获取元素值?
    ...
    99+
    2024-04-02
  • 一个不错的HTML5 Canvas多层点击事件监听的编写方法
    这篇文章主要介绍“一个不错的HTML5 Canvas多层点击事件监听的编写方法”,在日常操作中,相信很多人在一个不错的HTML5 Canvas多层点击事件监听的编写方法问题上存在疑惑,小编查阅了各式资料,整...
    99+
    2024-04-02
  • javascript如何移除元素点击事件
    这篇文章主要介绍了javascript如何移除元素点击事件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript如何移除元素点击事件文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • javascript如何设置元素点击事件
    这篇文章主要介绍“javascript如何设置元素点击事件”,在日常操作中,相信很多人在javascript如何设置元素点击事件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • vue如何检测元素外部或内部的点击
    小编给大家分享一下vue如何检测元素外部或内部的点击,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!检测元素外部(或内部)的点击有时我们需要检测点击是发生在特定元素...
    99+
    2023-06-27
  • jquery如何设置点击事件去除div元素
    这篇“jquery如何设置点击事件去除div元素”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2024-04-02
  • jQuery如何移除或禁用html元素点击事件
    小编给大家分享一下jQuery如何移除或禁用html元素点击事件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!移除或禁用html...
    99+
    2024-04-02
  • jquery如何给某个类元素增加点击事件
    本篇内容介绍了“jquery如何给某个类元素增加点击事件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • jQuery如何实现自定义元素右键点击事件
    这篇文章给大家分享的是有关jQuery如何实现自定义元素右键点击事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先要将阻止弹出函数绑定到目标元素上://阻止浏览器默认右键点击...
    99+
    2024-04-02
  • layui数据表格中如何实现点击分页按钮和监听事件
    这篇文章给大家分享的是有关layui数据表格中如何实现点击分页按钮和监听事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先上图代码.html<div>  ...
    99+
    2024-04-02
  • html5中如何实现pushstate以及监听浏览器返回事件
    这篇文章主要介绍了html5中如何实现pushstate以及监听浏览器返回事件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。pushstate与监听浏览器返回解决的问题实际开...
    99+
    2023-06-09
  • vue如何实现点击input弹出带搜索键盘并监听该元素的方法
    这篇文章主要介绍了vue如何实现点击input弹出带搜索键盘并监听该元素的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.遇到问题:需...
    99+
    2024-04-02
  • android中在Activity中响应ListView内部按钮的点击事件的两种方法
    最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在Adapter中响应? 对于这个问题,我最初给他的解答是,在Adapter...
    99+
    2022-06-06
    方法 事件 activity listview 按钮 Android
  • 如何使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
    本篇内容介绍了“如何使用jTopo给Html5 Canva中绘制的元素添加鼠标事件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作