searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Canvas中的事件系统

2023-07-17 07:08:10
57
0

前言

作为前端开发人员,我们都知道Canvas是前端在可视化领域的一个利器,借助 Canvas我们可以实现许多绚丽的视觉效果,并且在一些渲染数量极多、内容复杂的场景下,其性能表现都有着非常大的优势。

然而Canvas有这一个缺陷,由于Canvas是作为一个画布来整体存在的,我们不能像dom元素一样对画布中存在的各种图形进行事件绑定,因此我们就需要只针对Canvas开发出一套事件系统,本文就对此进行简单的讲解。

获取坐标

虽然Canvas不支持为画布内的图形直接添加事件,但是我们还是可以对整个Canvas元素进行点击事件的监听,来计算出点击事件在画布中的位置

canvas.addEventListener('click', (event) => {
  const rect = canvas.getBoundingClientRect();
  const x = event.clientX - rect.left;
  const y = event.clientY - rect.top;
  
  const point = { x, y }
})

在获取到了点击点的坐标以后,我们的问题就进行了转化,变成了如何判断一个点是否在图形的内部,这里我们常用的方法有两种,一种是基于几何图形位置判断的数学方法,一种是基于像素颜色的判断方法;其中数学方法即判断一个点是否在某个多边形中,有交叉数法和环绕数法,有兴趣可自行了解,本文着重讲解像素色值判断法。

像素色值判断法

在这种方案中,我们除了需要渲染一个用于展示的Canvas画布外,还需要离屏渲染一个专门用于检测点击所使用的hitCanvas。当我们绘制一个需要绑定点击事件的元素时,我们还需要生成一个唯一的颜色值,并使用该颜色将一个大小位置一样的图形绘制到hitCanvas当中。做好这一步后,当用户点击之后,我们就可以通过在hitCanavas上获取我们点击位置的色值,来直接找到是哪个图形被点击了。

 

0条评论
0 / 1000
s****n
2文章数
0粉丝数
s****n
2 文章 | 0 粉丝
s****n
2文章数
0粉丝数
s****n
2 文章 | 0 粉丝
原创

Canvas中的事件系统

2023-07-17 07:08:10
57
0

前言

作为前端开发人员,我们都知道Canvas是前端在可视化领域的一个利器,借助 Canvas我们可以实现许多绚丽的视觉效果,并且在一些渲染数量极多、内容复杂的场景下,其性能表现都有着非常大的优势。

然而Canvas有这一个缺陷,由于Canvas是作为一个画布来整体存在的,我们不能像dom元素一样对画布中存在的各种图形进行事件绑定,因此我们就需要只针对Canvas开发出一套事件系统,本文就对此进行简单的讲解。

获取坐标

虽然Canvas不支持为画布内的图形直接添加事件,但是我们还是可以对整个Canvas元素进行点击事件的监听,来计算出点击事件在画布中的位置

canvas.addEventListener('click', (event) => {
  const rect = canvas.getBoundingClientRect();
  const x = event.clientX - rect.left;
  const y = event.clientY - rect.top;
  
  const point = { x, y }
})

在获取到了点击点的坐标以后,我们的问题就进行了转化,变成了如何判断一个点是否在图形的内部,这里我们常用的方法有两种,一种是基于几何图形位置判断的数学方法,一种是基于像素颜色的判断方法;其中数学方法即判断一个点是否在某个多边形中,有交叉数法和环绕数法,有兴趣可自行了解,本文着重讲解像素色值判断法。

像素色值判断法

在这种方案中,我们除了需要渲染一个用于展示的Canvas画布外,还需要离屏渲染一个专门用于检测点击所使用的hitCanvas。当我们绘制一个需要绑定点击事件的元素时,我们还需要生成一个唯一的颜色值,并使用该颜色将一个大小位置一样的图形绘制到hitCanvas当中。做好这一步后,当用户点击之后,我们就可以通过在hitCanavas上获取我们点击位置的色值,来直接找到是哪个图形被点击了。

 

文章来自个人专栏
Canvas
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
1
0