Canvas 中 isPointInPath

如何在 Canvas 上实现图形拾取? 整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。 阅读详情

canvas 中的交互很多都可以用isPointInPath来完成
isPointInPath –就是一个检测你的点击或者触摸下是否在这个区域内。
有人会说 很简单啊 在一个区域内 四个点的坐标就可以判断 数学方式不难的
这时候要是来一个月牙形 而且在月弯的空白处点击,我 想你也会感叹 真是扯犊子般的难过了。
首先 大家都知道 canvas 是基于状态绘图的 就是先声明路径 样式 最后保存 绘画状态
说到 isPointInPath 它也是路径的 还是当前的 你之前绘制了 十条之后
突然的去判断是否在这个区域内那就 抓瞎了 那就先附上月牙的检测吧

        var canvas=document.getElementById('canvas_point');
        var context=canvas.getContext('2d');
        //加载完成就添加触摸事件
        window.onload=function()
        {           
            canvas.addEventListener('touchstart',cheeckIsPointInPath,false);            
        }
        // 接着就是检测是否在这个区域内的函数了
        function cheeckIsPointInPath(event)
            {
                var e_X=event.touches[0].clientX-canvas.getBoundingClientRect().left;
                var e_Y=event.touches[0].clientY-canvas.getBoundingClientRect().top;
                Draw();
                if(context.isPointInPath(e_X,e_Y))
                {
                    alert('在区域内');
                }else
                {
                    alert('不在区域');
                }
                context.fill();
            }
            //绘制方法 
                function  Draw()
            {
                  context.fillStyle = 'rgb(174,237,249)';
                  context.lineJoin='round';
                  context.lineWidth=50;
                  context.beginPath();
                  context.moveTo(170,516);                
                  context.lineTo(141,249);
                  context.lineTo(367,114);
                  context.lineTo(559,223);
                  context.lineTo(529,303);
                  context.lineTo(358,191);
                  context.lineTo(254,266);
                  context.lineTo(258,529);
                  context.lineTo(170,516);            
                  context.closePath();                              
            }

月牙

其实你会发现上面就只有单条绘制的状态 在判断内部几乎不用那么多 只要 获取 触摸时的坐标就好了
但是当你有多条的时候你就会想怎么办呢 ?
我用了很傻的办法 :

function Draw_img1()
            {
                                context.beginPath();
                                context.rect(0,410,199,100);    
                                context.fillStyle='#005580';
                                context.closePath();
            }
            function Draw_img2()
            {
                                context.beginPath();
                                context.fillStyle='#005580';
                                context.rect(200,410,199,100);  
                                context.closePath();
            }
            function Draw_img3()
            {
                                context.beginPath();
                                context.fillStyle='#1B6D85';
                                context.rect(400,410,199,100);  
                                context.closePath();
            }
            var  draw=[Draw_img1,Draw_img2,Draw_img3];
//你肯定想说 javascript 的对象 你倒是用啊  存放 x y 坐标多好 。。
//奈何我才疏学浅 暂时还没有玩转canvas 只能慢慢的先摸着石头过河。
            function bet(event)
            {
                    var e_X=event.touches[0].clientX-canvas.getBoundingClientRect().left;
                    var e_Y=event.touches[0].clientY-canvas.getBoundingClientRect().top;
                    for(var i=draw.length;i--;)
                    {   
                            draw[i]();
                            if(context.isPointInPath(e_X,e_Y))
                            {                               
                                if(bet_State==true)
                                {                                   
                                    console.log(" 点击了矩形区域"+i);
                                    bet_State=false;
                                }                                           
                            }
                            //这里可以根据你的想法来的  填充不填充随你的
                            context.fill();
                    }   
                }

isPointInPath 你可以用来做 鼠标挪上去 变颜色 移走又变颜色 点击做什么事情啊
看看最新版的H5标准的 值得一瞅

three.js开发3D地图记录(二) 添加地图点击事件,点击区域,地图区域改变颜色并浮起来。 阅读详情

相关推荐

PLCopen运动控制避坑指南:单轴功能块常见报错排查(基于SM3_Basic函数库)

本文深入解析PLCopen运动控制中单轴功能块的常见报错问题,基于SM3_Basic函数库提供实用排查指南。从功能块逻辑错误与硬件报错的甄别技巧到高频报错场景的解决方案,帮助工程师快速定位并解决运动控制系统中的稳定性问题,提升工业自动化设备的运行效率。

weixin_33686714的博客 316

canvas中isPointInPath只对最后一个路径生效的问题

只有在点击黄色时候才会返回true,而红色和蓝色为false,就是因为绘制黄色的时候,使用了close方法将之前的路径给关闭了.isPointInPath函数用来检测当前坐标位置在画布中是否处于某个元素之中,函数返回为true或者false。但是在这个过程中,有一个坑,那就是isPointInPath检测方法只对最后一条路径生效.在每一次绘制的时候都调用。成功解决问题,给个赞吧。

m0_54741495的博客 677

鸿蒙ijkplayer播放器调优实战:从卡顿掉帧到流畅播放RTSP,我都调了哪些参数?

本文深入解析鸿蒙平台上ijkplayer播放器优化RTSP流媒体播放的关键参数,解决卡顿、掉帧等问题。通过调整缓冲区管理、帧处理策略和网络超时设置,实现流畅播放体验,特别适用于监控和直播等高实时性场景。

weixin_29304021的博客 242

canvas学习(十四):canvas交互之isPositonInPath

先说说用到的两个方法: 1、isPositonInPath(x,y):判断(x,y)是否在canvas绘制的图形所在路径中。不太理解的可以参考W3School中的“HTML5 canvas isPointInPath() 方法” 2、getBoundingClientRect():这个方法用来用来获取元素位置,即获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。getBoundin...

总有一天,你的日积月累,会成为别人的望尘莫及 1204

深入解析:如何基于开源p-net快速开发Profinet从站服务

开源p-net协议栈为工业设备开发者打开了通往Profinet世界的大门。随着工业互联网的发展,软协议栈方案将在边缘计算领域展现更大潜力。该文章完整实现了PROFINET从站的核心功能,可直接作为产品开发的基础框架。实际部署时需根据具体硬件平台调整网络驱动和实时性配置。

极地星辰 3882

告别GitHub!手把手教你用Gitblit在Windows 10上搭建私人局域网Git服务器(附SourceTree配置)

本文详细介绍了如何在Windows 10环境下使用Gitblit搭建私有Git服务器,实现局域网内高效代码协作。通过轻量级的Gitblit解决方案,开发者可以享受数据完全自主、离线可用性和局域网高速访问等优势。文章包含从环境准备、安装部署到SourceTree配置的全流程指南,特别适合金融、医疗等敏感行业团队使用。

weixin_30430169的博客 283

canvas isPointInPath

在canvas 中,isPointInPath 函数是判断给定点是否在标记的闭合轮廓中。 在测试中没有问题 红色点是圈外,绿色部分是圈内。 我遇到一个坑人的地方,这个path并不是该图层上的所有path,而是最新的path。 所以如果是在该图层画了多个形状,要isPointInPath,只有最后一个有效。 ...

True Truth 493

HT7036计量芯片SPI通信与数据读取实战解析

本文详细解析HT7036计量芯片的SPI通信与数据读取实战,涵盖SPI时序配置、命令发送、数据读取及常见问题排查。重点介绍如何通过SPI接口与MCU通信,实现电能数据的稳定采集与处理,为智能电表等应用提供实用解决方案。

vscode5coder的博客 265

isPointInPath(x,y)

在HTML5的Canvas中,是CanvasRenderingContext2D对象的一个方法,用于判断指定的点(x,y)

youhebuke225的博客 459

基于深度学习的人脸识别考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

基于深度学习的口罩人脸识别的考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1827

Visual Studio 2022+Qt6.5.3安装教程+环境配置+创建Qt项目+乱码插件+运行很完美(16岁孩子也能看懂)

Visual Studio 2022+Qt6.5.3安装教程+环境配置+创建Qt项目+乱码插件+运行很完美(16岁孩子也能看懂)

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 1190

canvas isPointInPath()方法 画布交互

canvas isPointInPath()定义和用法如果指定的点位于当前路径中,isPointInPath() 方法返回 true,否则返回 false。JavaScript 语法:context.isPointInPath(x,y);参数值参数描述x要测试的 x 坐标。y要测试的 y 坐标。 function changeColor(event){ var event=ev

99的博客 3943

使用R语言中的NbClust包确定最佳聚类簇数

聚类分析是一种常用的数据分析技术,它将相似的数据点分组成不同的簇。NbClust包是R语言中一个强大的工具,它提供了多种方法来帮助我们确定最佳的聚类簇数。综上所述,使用R语言中的NbClust包可以帮助我们确定最佳的聚类簇数。通过选择适当的聚类算法和评估指标,我们可以更好地理解数据集的结构和模式,并根据需要进行进一步的分析和解释。此外,NbClust包还提供了其他函数和参数,用于执行不同的聚类算法、选择不同的评估指标等。安装完毕后,我们需要加载NbClust包,以便使用其中的函数。函数来确定最佳聚类簇数。

2301_79326559的博客 2280

canvas isPointInPath

由于isPointInPath方法仅判断当前上下文环境中的路径,所以当Canvas里已经绘制了多个图形时,仅能以最后一个图形的上下文环境来判断事件。例如,如果我们最后画的是右腿,那么我们只能判断是否点击了右腿,而不能判断身体的其他部分——右腿最后画。 这种问题的解决方法是:当点击事件发生时,重绘所有图形,每绘制一个就使用isPointInPath方法,判断事件坐标是否在该图形覆盖范围内。

farmwang的专栏 1827

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

让你马上明白isPointInPath 属性—— canvas的 isPointInPath 属性测试案例

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>canvas事件</title></head><body><canvas id="myCanvas" wi

Allan_L的博客 1621

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

canvas 使用 isPointInPath() 判断鼠标位置是否在绘制的元素上

canvas 里绘制的图形不是一个实体 DOM,所以要给每个绘制的图形添加事件操作比给 DOM 添加事件要复杂很多。 所以,我们需要使用一个 canvas 的 isPointInPath(x, y) 方法,来获取鼠标相对于浏览器的坐标,然后还需要计算出鼠标相对于 canvas 画布的坐标,最后通过 isPointInPath(x, y) 方法判断此坐标是否在绘制的元素上,进行相应的操作。 is...

weixin_30782331的博客 1586

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

canvas中的isPointInPath(x,y)

ctx.isPointInPath(x,y) 它是 Canvas 2D API 用于判断在当前路径中是否包含检测点的方法。 语法 boolean ctx.isPointInPath(x, y); boolean ctx.isPointInPath(x, y, fillRule); boolean ctx.isPointInPath(path, x, y); boolean ctx.isPointI...

weixin_43269800的博客 854

canvas画布实现拖拽碰撞 canvas之isPointInPath解析

isPointInPath():判断指定的坐标点是否在canvas绘制的路径中,如果在返回true,如果不在返回false,只能判断最后一个绘制的封闭路径 注意:strokeRect()   fillRect();这两个方法不适用于isPointInPath() 在canvas画布中所有的移动,都是通过清空画布重新绘制的,并不是向js中的dom元素一样移动,可以通过设置某一个具体对象的left...

lanseguhui的博客 3280

使用 isPointInPath 函数来设置canvas事件

最近看了一下canvas,很好奇一张图片是如何点击不同的地方触发事件的。查询了一下,canvas本身有一个函数 isPointInPath(x, y) 可以输入x,y坐标,定位一个点,这个函数返回的是一个布尔值,如果这个点出现在绘制的图像里,那么就会返回true,否则返回false,那我们就可以根据这个方法来判断“设定的点”或者“鼠标指针”是否触碰到某个图像了<!DOCTYPE h...

doct2279的博客 196

canvas imgQueue isPointInPath

1.绘制canvas的时候,某次引用了外部img对象,循环加载,然后绘制,发现老是闪烁。 后来就发明了img队列,imgQueue函数,等待所有img全部Load完毕,再去绘制. imgQueue: function(cache, callback, imgs) { var imgs = imgs || [], one = cache.shift(), __self__ ...

weixin_30904593的博客 111

canvas中isPointInPath和isPointInStroke

canvas中isPointInPath和isPointInStroke可用于canvas事件处理,找到当前拖动对象。 原文地址: canvas中isPointInPath和isPointInStroke

weixin_40863414的博客 789

canvas---isPointInPath事件 jcanvas

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equ...

weixin_41069726的博客 334

Canvas 判断点是否在路径内(isPointInPath())

demo.html:&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;Title&lt;/title&gt; &lt;style&gt; canvas {

houyanhua1的专栏 3381

利用isPointInPath()实现canvas小游戏的交互

这个游戏实现主要依靠canvas的isPointInPath()。这个API可以让canvas实现很强的交互体验。 首先通过随机数随机生成圆的颜色、大小和位置,并且用循环绘画出来。利用addEventListener给canvas绑定事件,通过getBoudingClientReact算出鼠标在canvas的坐标,根据isPointInPath判断鼠标是否在已经画好的圆的路径里面,在的话则根据该...

weixin_30670965的博客 146

html5的canvas知识总结(8)isPointInPath、isPointInStroke、解决canvas高分屏模糊、非零环绕原则

1.  ctx.isPointInPath(80,80):判断点是否在上面路径的区域内。 ctx.isPointInStroke(80,50):判断点是否在上面路径的边缘线上。 浏览器支持情况: (1)Internet Explorer 9、Firefox、Opera、Chrome 以及 Safari 支持 isPointInPath() 方法。 注释:Internet Expl...

zyz00000000的博客 3315

【绘制】HTML5 Canvas中isPointInPath介绍和使用(判断是否在路径内,并实现拖拽小方块)

我的处女作《Canvas系列教程》在我的Github上正在连载更新,希望能得到您的关注和支持,让我有更多的动力进行创作。 教程介绍、教程目录等能在README里查阅。 传送门:https://github.com/827652549/CanvasStudy 介绍 isPointInPath()判断路径中是否包含监测点(作为参数传入)。 isPointInPath()介绍 方法 ...

苏一恒 2021
上一篇: HTML5 绘制简单圆形 loading. . . .
下一篇: Canvas实现刮刮乐(附解析)
严芷云
博客等级 码龄12年 15粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值