Canvas的事件处理,监听点击的位置
2019-04-23 21:04
1526 查看
DOM是Web前端领域非常重要的组成部分,不仅在处理HTML元素时会用到DOM,图形编程也同样会用到。比如SVG绘图,各种图形都是以DOM节点的形式插入到页面中,这就意味着可以使用DOM方法对图形进行操作。比如有一个元素,可以直接用jquery增加click事件$(‘#p1’).click(function(){…})”。然而这种DOM处理方法在HTML5的Canvas里不再适用,Canvas使用的是另外一套机制,无论在Canvas上绘制多少图形,Canvas都是一个整体,图形本身实际都是Canvas的一部分,不可单独获取,所以也就无法直接给某个图形增加JavaScript事件。
给Canvas元素绑定事件:
由于事件只能达到Canvas元素这一层,所以,如果想进一步深入,识别点击发生在Canvas内部的哪一个图形上,就需要增加代码来进行处理。基本思路是:给Canvas元素绑定事件,当事件发生时,检查事件对象的位置,然后检查哪些图形覆盖了该位置。比如画一个矩形,该矩形覆盖x轴10-110、y轴10-110的范围。只要鼠标点击在这个范围里,就可以视为点击了该矩形,也就可以手动触发矩形需要处理的点击事件。思路其实比较简单,但是实现起来还是稍微有点复杂。不仅要考虑这个判断过程的效率,有些地方还需要重新判断事件类型,设置要重新定义一个Canvas内部的捕获和冒泡机制。
html:
<!DOCTYPE html><html><head> <meta charset="utf-8" /></head> <body> <canvas id="myCanvas" width="320" height="620" style="position: absolute;top: 100px;left: 100px;background: burlywood;"></canvas> </body></html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
arr = [ {x:0, y:0, width:320, height:200,content:'我是第一个框',color:'green'}, {x:0, y:204, width:320, height:200,content:'我是第二个框',color:'blue'}, {x:0, y:404, width:320, height:200,content:'我是第三个框',color:'yellow'}];cvs = document.getElementById('myCanvas');ctx = cvs.getContext('2d');draw();//对事件进行监听cvs.addEventListener('click', function(e){ p = getEventPosition(e); //判断点击了那个矩形 if(p.y <= arr[0].height){ console.log('你点击了第一个矩形',p) } if(p.y>arr[0].height && p.y <= (arr[1].height+arr[1].y)){ console.log('你点击了第二个矩形',p) } if(p.y>(arr[1].height+arr[1].y) && p.y <= (arr[2].height+arr[2].y)){ console.log('你点击了第三个矩形',p) }}, false);//注:使用这个函数,需要给Canvas元素的position设为absolute。//要判断事件对象发生的位置,事件对象e的layerX和layerY属性表示Canvas内部坐标系中的坐标function getEventPosition(ev){ var x, y; if (ev.layerX || ev.layerX == 0) { x = ev.layerX; y = ev.layerY; } else if (ev.offsetX || ev.offsetX == 0) { // Opera x = ev.offsetX; y = ev.offsetY; } return {x: x, y: y};}//画图像 function draw(p){ var who = []; ctx.clearRect(0, 0, cvs.width, cvs.height); arr.forEach(function(v, i){ ctx.beginPath(); ctx.rect(v.x, v.y, v.width, v.height); ctx.font="20px Georgia"; ctx.fillStyle=v.color; ctx.fillText(v.content,0,v.y+20); ctx.stroke(); if(p && ctx.isPointInPath(p.x, p.y)){ //如果传入了事件坐标,就用isPointInPath判断一下 //如果当前环境覆盖了该坐标,就将当前环境的index值放到数组里 who.push(i); } }); //根据数组中的index值,可以到arr数组中找到相应的元素。 return who;}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
相关文章推荐
- Canvas的事件处理,监听点击的位置
- Android多次点击事件的监听和处理
- NineOldAndroids在低版本系统的使用中点击事件滞留在原来位置的处理
- 一个不错的HTML5 Canvas多层点击事件监听实例
- jquery bootstrap scrollspy 滚动监听, 及a标签点击事件处理
- Android按钮的五种点击监听事件处理
- 一个不错的HTML5 Canvas多层点击事件监听实例
- 安卓中关于事件处理方式以Button为例实现点击事件监听
- HTML5 Canvas多层点击事件监听实例
- DrawerLayout的使用 侧滑加载Listview,首页使用Fragment和处理点击触摸冲突、穿透事件和监听菜单滑动状态的改变的详细介绍
- jquery 监听鼠标点击事件,任意位置,及是否获得焦点
- Canvas---Canvas事件处理、Canvas元素的鼠标点击事件处理、实现一个元素管理器
- Canvas的使用,放大缩小的自定义布局,不同的位置不同的点击事件
- 音乐播放器ListView点击事件处理
- 监听WebView的各种点击事件
- android源码解析(1)--如何处理布局文件中添加的点击事件
- Android百度地图(三):百度地图画运动轨迹及图层点击事件处理
- Android 监听按钮的点击事件
- Qt事件处理机制整个流程--以鼠标在一个窗口中点击为例
- [Android]在ListView嵌套GridView中出现的点击事件处理以及gridview显示不全的问题