Canvas事件处理

鼠标事件

canvas.onmousedown = function(e ) {//React to the mouse down event };

canvas.addEventListener(‘mousedown‘, function(e ) { //React to the mouse down event});

上面一种方法看起来更简单一些,但是,如果需要向某个鼠标事件注册多个监听器的话,那么用addEventListener()方法会更合适。

浏览器通过事件对象传递给监听器的鼠标坐标,是窗口坐标(window coordinate),而不是相对与canvas自身的坐标。而大部分情况下,开发者需要知道的是发生鼠标事件的点相对于canvas的位置,而不是在整个窗口中的位置,所以有必要进行坐标变换。

function windowToCanvas(canvas, x, y) { var bbox = canvas.getBoundingClientRect();

return { x: x – bbox.left * (canvas.width / bbox.width), y: y – bbox.top * (canvas.height / bbox.height) }; }

上述方法,在canvas对象上调用getBoundingClientRect()方法,来获取canvas元素的边界框,该边界框的坐标是相对于整个窗口的。然后返回一个对象,该对象的x、y属性分别对应于鼠标在canvas之中的坐标。该方法不止是对两个坐标进行平移缩放,在canvas元素大小与绘图表面大小不相符时,它还对这两个坐标进行了缩放。

canvas元素实际上有两套尺寸,一个是元素本身的大小,还有一个是元素绘图表面(drawing surface)的大小。以内联方式设置width和height属性,实际上是同时设置了元素本身的大小与元素绘图表面的大小。然而,如果通过CSS来设定canvas元素的大小,那么只会改变元素本身的大小,而不会影响到绘图表面。

如果css设定的canvas元素大小域其绘图表面大小不同,浏览器就会对绘图表面进行缩放,使其符合元素的大小,类似于设定了图片的宽与高,但是与图片本身尺寸不同,那么,图片会被拉伸一样。

键盘事件

canvas是一个不可获取焦点的元素,所以,在canvas上新增键盘事件监听器是徒劳的。如果想要检测键盘事件的话,你应该在document或window对象上新增键盘事件监听器才对。

keydown

keypress

keyup

keydown与keyup是底层事件,几乎每次按键时都会触发这些事件。

触摸事件

移动端触摸事件与桌面平台的鼠标事件有两个主要的不同点

  1. 鼠标光标只有一个i额,而触摸点可能有很多
  2. 鼠标光标可以悬停(hover),而触摸点则不行

处理触摸事件的方式,在许多方面与处理鼠标事件相似,例如

canvas.ontouchstart = function(e ) { alert("touch start"); };

canvas.addEventListener("touchstart", function(e ) { alert("touch start"); });

触摸事件


事件类型


是否可以取消


是否走完整个冒泡式触发过程


描述


浏览器对该事件的默认处理方式


touchstart




用户将某个触摸点置于触摸界面上


未定义


touchmouve




在触摸界面上移动触摸点


未定义


touchend




触摸点离开了触摸区域


根据具体情况而定,可能将其视为:mousemove,mousedown、mouseup、click


touchcancel




触摸点的触摸动作被打断,或是触摸点个数超出了设备所能处理的范围


未定义

touchevent对象的属性


属性名


属性值的数据类型


描述


touches


TouchList


由正在界面上触摸的各个触摸点所组成的列表


changedTouches


TouchList


与上次触摸事件相比,发生改变的各个触摸点,对于touchstart事件来说,它表示那些刚刚被激活的触摸点。对于touchmove事件来说,表示那些位置发生了移动的触摸点。对于touchend与touchcancel来说,表示那些不再停留于触摸界面之上的触摸点


targetTouches


TouchList


正在界面上触摸而且位于当前元素范围之内的那些触摸点。除非某个触摸点被拖到了元素范围之外,否则该列表就等同于touches列表


altKey ctrlKey metaKey shiftKey


boolen


如果在触摸事件发生时,与之对应的按键Alt Ctrl Meta或Shift处于被按下的状态,那么其值就是true,由于某些移动设备并没有物理键盘,所以这些属性的值可能是不确定的。

TouchList对象

TouchList对象有两个属性

length

Touch identifiedTouch(identifier)

给定某个TouchList对象,可以可以通过length属性获取列表中所含Touch对象的个数

canvas.ontouchstart = function(e) {alert("e.touches.length + ‘ touches on the device‘); };

可以像操作数组那样,访问TouchList之中的每一个Touch元素

canvas.ontouchstart = function(e) { for var i=0;i<e.touches.length; ++i} { alert("Touch at: " + e.touches[i].pageX + "," + e.touches[i].pageY); } };

Touch对象

触摸事件监听器最终还是需要检查Touch对象本身的属性。


属性名


属性值的数据类型


描述


clientX


long


触摸点相对于视窗的X坐标,该值不包含滚动条宽度


clientY


long


Y坐标,不包含滚动条高度


identifier


long


代表触摸点身份的独特标识符,同一个触摸点的身份标识符在不同的事件中保持不变


pageX


long


触摸点相对于视窗的X坐标,包含滚动条的宽度


pageY


long


相对于视窗的Y坐标,包含滚动条高度


screenX


long


触摸点相对于屏幕的X坐标


screenY


long


触摸点相对于屏幕的Y坐标


target


EventTarget


触摸动作开始时,触摸点所在的元素。就算该点其后被拖出了初始元素,target依然会指向一开始的那个元素。

?

tips:在事件对象上调用preventDefault()方法,可阻止浏览器对该事件采取诸如滚动网页等默认的处理动作。此方法可以避免各种开发者不想看到的浏览器互动操作,如缩放页面、偶然选取了网页内容,以及div闪烁等。

手指缩放

对于类型为touchstart及touchmove的触摸事件,如果发现有两个点同时在触摸设备,而且它们中至少有一个位置发生了变化,那么就判定用户在pinch屏幕。如果程序发现用户正在pinch屏幕,用于处理touchstart事件的方法会计算两个触摸点之间的距离,以及当前放大倍数与该距离的比值。在touchmove事件的方法也会计算当前两个触摸点之间的距离,并且将该值乘以刚才计算好的比值,就可以得到新的放大倍数。

时间: 2025-02-01 14:43:16

Canvas事件处理的相关文章

HTML5 Canvas 的事件处理---转

DOM是Web前端领域非常重要的组成部分,不仅在处理HTML元素时会用到DOM,图形编程也同样会用到.比如SVG绘图,各种图形都是以DOM节点的形式插入到页面中,这就意味着可以使用DOM方法对图形进行操作.比如有一个<path id="p1">元素,可以直接用jquery增加click事件$('#p1').click(function(){…})".然而这种DOM处理方法在HTML5的Canvas里不再适用,Canvas使用的是另外一套机制,无论在Canvas上绘

HTML5小游戏-简单抽奖小游戏

换了新工作以后,专注前端开发,平常空闲时间也比较多,可以多钻研一下技术,写一下博客.最近在学习canvas,参考网上的slotmachine插件,用canvas实现了一个简单抽奖小游戏.        知识点 canvas绘制背景 canvas绘制图片 canvas绘制边框 canvas事件处理 canvas简单动画制作      步骤 1.准备好图片,首先是机器的外观.以及滚动的奖项图片,我一共准备了6种,奖项图片按照一定的规律命名,这样方便处理   2.准备好canvas画布,设置好基本的C

Canvas---Canvas事件处理、Canvas元素的鼠标点击事件处理、实现一个元素管理器

由于Canvas的 "忘记式" 绘图机制(就是它没有维护一份绘制元素的列表). 如果仅仅检测用户是否点击整个canvas元素,只需在canvas上注册事件就好. 如果是要分别检测canvas里绘制的不同元素的鼠标点击事件,则要用下面的做法,实现一个元素管理器. 一.原理分析 1.canvas元素能提供的一个api是,context.isPointInPath(x,y),它可以判断参数的点是否在当前路径内. 2.当前路径指的是最近一次调用context.beginPath();当前路径c

canvas模糊事件处理

不知道大家项目中有没有用到canvas时还有时候会出现模糊的情况: 具体推测可能是屏幕改变了,然而canvas的渲染对象并没有跟着一起变: 这里简单介绍个对象,window.devicePixelRatio→详细介绍http://www.zhangxinxu.com/wordpress/2012/08/window-devicepixelratio/ window.devicePixelRatio是设备上物理像素和设备独立像素(device-independent pixels (dips))的

Qt 学习之路:Canvas

在 QML 刚刚被引入到 Qt 4 的那段时间,人们往往在讨论 Qt Quick 是不是需要一个椭圆组件.由此,人们又联想到,是不是还需要其它的形状?这种没玩没了的联想导致了一个最直接的结果:除了圆角矩形,Qt Quick 什么都没有提供,包括椭圆.如果你需要一个椭圆,那就找个图片,或者干脆自己用 C++ 写一个吧(反正 Qt Quick 是可以扩展的,不是么)! 为了使用脚本化的绘图机制,Qt 5 引入的Canvas元素.Canvas元素提供了一种与分辨率无关的位图绘制机制.通过Canvas,

用canvas实现一个colorpicker

http://www.cnblogs.com/ufex/p/6382982.html 每个浏览器都有自己的特点,比如今天要做的colorpicker就是,一千个浏览器,一千个哈姆雷特,一千个colorpicker.今天canvas系列就用canvas做一个colorpicker. ********************************************************************** 效果图和demo 突然翻到了之前用js和dom写的一个colorpicker

赠书:HTML5 Canvas 2d 编程必读的两本经典

赠书:HTML5 Canvas 2d 编程必读的两本经典 这两年多一直在和HTML5 Canvas 打交道,也带领团队开发了世界首款基于HTML5 Canvas 的演示文档工具---AxeSlide(斧子演示,www.axeslide.com).在这个领域也积累了一些 经验,希望有机会和大家分享.今天是要给大家推荐两本这方面的书,同时会送一本书给大家. 要介绍的第一本书是我学习Canvas开发的入门书——<HTML5 Canvas核心技术:图形.动画与游戏开发>. 此书作者David Gear

三天学会HTML5——SVG和Canvas的使用

在第一天学习了HTML5的一些非常重要的基本知识,今天将进行更深层学习 首先来回顾第一天学习的内容,第一天学习了新标签,新控件,验证功能,应用缓存等内容. 第2天将学习如何使用Canvas 和使用SVG 实现功能 Lab1—— 使用Canvas Canvas 是指定了长度和宽度的矩形画布,我们将使用新的HTML5 JavaScript,可使用HTML5 JS API 来画出各种图形. 初始化 1. 创建HTML页面 <html> <head></head> <bo

HTML5系列-携手Canvas

html5里面canvas绝对是大哥级别的,canvas的绘图是基于js的处理,我们既然知道canvas,免不了就听说过svg,svg是基于xml扩展而来的,现在图表插件中国内百度的echarts是基于canvas的,国外一款非常强大的highcharts是基于svg的,svg是可伸缩标记绘图不支持低级ie,我们在下一篇html介绍博客也会简单介绍svg的处理.  一.页面显示出我们的canvas 我们在html下面写入canvas标签,和加入背景色: <!DOCTYPE html>  <