HTML将canvas画布鼠标事件,HTML5 Canvas鼠标与键盘事件demo示例

演示html5 canvas鼠标事件,获取canvas对象上的鼠标坐标,演示键盘事件通过键盘控制canvas上对象移动。

canvas对象支持所有的javascript的鼠标事件,包括鼠标点击(mouseclick), 鼠标按下(mouse down), 鼠标抬起(mouse up),鼠标移动( mouse move)对canvas添加鼠标事件方式有两种,一种方式是通过api来完成:

复制代码代码如下:

// mouse event

canvas.addeventlistener("mousedown",domousedown,false);

canvas.addeventlistener('mousemove', domousemove,false);

canvas.addeventlistener('mouseup', domouseup, false);

另外一种方式在javascript中称为反模式:

复制代码代码如下:

canvas.onmousedown = function(e){

}

canvas.onmouseup = function(e){

}

canvas.onmousemove = function(e){

}

获取鼠标在canvas对象上坐标:

由于canvas上鼠标事件中不能直接获取鼠标在canvas的坐标,所获取的都是基于整个

屏幕的坐标。所以通过鼠标事件e.pagex与e.pagey来获取鼠标位置,然后通过

canvas. getboundingclientrect()来获取canvas对象相对屏幕的相对位置,通过计算

得到鼠标在canvas的坐标,代码如下:

复制代码代码如下:

function getpointoncanvas(canvas, x, y) {

var bbox =canvas.getboundingclientrect();

return { x: x- bbox.left *(canvas.width / bbox.width),

y:y - bbox.top * (canvas.height / bbox.height)

};

}

键盘事件:

html5 canvas本身不支持键盘事件监听与获取,常用的有两种方法来解决这个问题:

一:通过windows对象来实现canvas键盘事件监听与处理

// key event - use window as object

window.addeventlistener('keydown', dokeydown,true);

二:通过在canvas对象上添加其它支持键盘事件的dom元素实现键盘事件支持

复制代码代码如下:

// key event - use dom element asobject

canvas.addeventlistener('keydown', dokeydown,true);

canvas.focus();

其中tabindex为html5 dom元素,支持键盘事件。

演示,一个可以根据键盘上下左右移动的矩形块:

9729d93335181e6ea2e4c68f895849d4.gif 

一个完整的鼠标与键盘事件演示代码如下:

复制代码代码如下:

var tempcontext = null; // global variable 2d context

var started = false;

var mtext_canvas = null;

var x = 0, y =0;

window.add

window.onload = function() {

var canvas = document.getelementbyid("event_canvas");

console.log(canvas.parentnode.clientwidth);

canvas.width = canvas.parentnode.clientwidth;

canvas.height = canvas.parentnode.clientheight;

if (!canvas.getcontext) {

console.log("canvas not supported. please install a html5 compatible browser.");

return;

}

// get 2d context of canvas and draw rectangel

tempcontext = canvas.getcontext("2d");

tempcontext.fillstyle="blue";

x = canvas.width/2;

y = canvas.height/2;

tempcontext.fillrect(x, y, 80, 40);

// key event - use dom element as object

canvas.addeventlistener('keydown', dokeydown, true);

canvas.focus();

// key event - use window as object

window.addeventlistener('keydown', dokeydown, true);

// mouse event

canvas.addeventlistener("mousedown", domousedown, false);

canvas.addeventlistener('mousemove', domousemove, false);

canvas.addeventlistener('mouseup', domouseup, false);

}

function getpointoncanvas(canvas, x, y) {

var bbox = canvas.getboundingclientrect();

return { x: x - bbox.left * (canvas.width / bbox.width),

y: y - bbox.top * (canvas.height / bbox.height)

};

}

function dokeydown(e) {

var keyid = e.keycode ? e.keycode :e.which;

if(keyid === 38 || keyid === 87) { // up arrow and w

clearcanvas();

y = y - 10;

tempcontext.fillrect(x, y, 80, 40);

e.preventdefault();

}

if(keyid === 39 || keyid === 68) { // right arrow and d

clearcanvas();

x = x + 10;

tempcontext.fillrect(x, y, 80, 40);

e.preventdefault();

}

if(keyid === 40 || keyid === 83) { // down arrow and s

clearcanvas();

y = y + 10;

tempcontext.fillrect(x, y, 80, 40);

e.preventdefault();

}

if(keyid === 37 || keyid === 65) { // left arrow and a

clearcanvas();

x = x - 10;

tempcontext.fillrect(x, y, 80, 40);

e.preventdefault();

}

}

function clearcanvas() {

tempcontext.clearrect(0, 0, 500, 500)

}

function domousedown(event) {

var x = event.pagex;

var y = event.pagey;

var canvas = event.target;

var loc = getpointoncanvas(canvas, x, y);

console.log("mouse down at point( x:" + loc.x + ", y:" + loc.y + ")");

tempcontext.beginpath();

tempcontext.moveto(loc.x, loc.y);

started = true;

}

function domousemove(event) {

var x = event.pagex;

var y = event.pagey;

var canvas = event.target;

var loc = getpointoncanvas(canvas, x, y);

if (started) {

tempcontext.lineto(loc.x, loc.y);

tempcontext.stroke();

}

}

function domouseup(event) {

console.log("mouse up now");

if (started) {

domousemove(event);

started = false;

}

}

html部分:

复制代码代码如下:

html canvas event demo - by gloomy fish

press w, a, s, d keys to move

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js——正则整理

1、示例 匹配网址url function IsURL(str_url){var strRegex "^((https|http|ftp|rtsp|mms)?://)" "?(([0-9a-z_!~*().&$%-]: )?[0-9a-z_!~*().&$%-])?" //ftp的user "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.…

天价!一款芯片从设计到流片需要45亿!3纳米芯片研发成本曝光

来源:EETOP综合整理自IBS、科技新报英特尔宣布7纳米制程要延后半年问世,使晶圆代工龙头台积电有机会受惠英特尔扩大外包生产,竞争对手AMD 也因英特尔7纳米延后,产品持续维持竞争优势,两家公司股价都大涨。只是英特尔7纳…

EUV光刻机全球出货量达57台

来源:内容编译自「semiwiki」,谢谢。IMEC是推动半导体技术前进的主要组织之一,日前,他们举办了一场线上论坛,谈及了对芯片现状和未来的看法。在演讲中,ASML总裁则对光刻的发展进行了演讲。从他的PPT中可以看…

一个计算机台式机的组装方案,既能带又便宜的电脑组装方案,华擎deskmini310组装晒单...

既能带又便宜的电脑组装方案,华擎deskmini310组装晒单2019-04-17 10:39:4425点赞61收藏30评论前段时间家中的台式机陆陆续续已近阳寿,再组装一台机器的念头就油然而生。常年浏览大妈家的我发现了一样小众但蛮出名的迷你机箱——华擎deskmini310&#xff…

FPGA的历史、现状和未来

来源:AI前线作者:Oskar Mencer 等译者:盖磊策划:陈思FPGA 自上世纪 80 年代进入市场以来,就与通用 CPU、ASIC 乃至 GPU 竞争共存。FPGA 的低功耗、可编程、规格适中等特性,使其在市场中占据一席之地。本文分…

模型性能评估-混淆矩阵简介

混淆矩阵 Positive - 正例Negative (N) - 负例 结果: 预测为正类别 预测为负类别 真实为正类别 True Positive (TP) False Negative (FN) 真实为负类别 False Positive (FP) True Negative (TN)TP - 预测 P, 实际 P, 模型预测正确FP - 预测 P, 实际 N, 模…

观点|重磅出炉!29页《业内观点:机器人行业的未来》

来源:硅谷浦发银行未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业…

出道即巅峰,掀起AI领域巨浪的GPT-3,被过誉了吗?

机器之心报道编辑:蛋酱、杜伟、小舟是时候重新审视这个「无所不能的」模型了!GPT-3,「出道即巅峰」界的代表。2020 年 5 月,OpenAI 高调推出了一款具有 1750 亿参数的自回归语言模型「GPT-3」,在人工智能领域掀起了一阵…

虎贲计算机二级视频解析百度云,详解虎贲T7520:5G为什么需要全场景覆盖增强技术?...

紫光展锐近期发布了采用6nm EUV工艺的新一代5G SoC“虎贲T7520”, 先进的工艺、低功耗的系统设计,大幅提升的AI算力和多媒体影像处理能力,将为5G智能体验带来更好的选择。值得注意的是,基于第二代马卡鲁5G技术平台,虎贲…

“万物就只是5万亿个参数”,AI模型GPT-3让人怀疑人生

本文转自开源中国这几天轰动硅谷的 GPT-3 是什么来头?相信不太了解 AI 的朋友这几天也或多或少看到了一些关于 GPT-3 的重磅消息,甚至有媒体称其为 “继比特币之后又一个轰动全球的现象级新技术”。请注意,现在站在你面前的是:互联…

06_jQuery_内容过滤

HTML代码&#xff1a; <div>John Resig</div><div>gggg resig</div><div>Malcom John sinclai</div><div>J.ohn</div>jQuery代码&#xff1a; $(function(){$("div:contains(John)").css("text-decoration&quo…

从技术角度探讨:深度传感器行业有哪些发展机会

来源&#xff1a;仪商网以前&#xff0c;我们一直认为传统相机将3D世界转换为2D图像&#xff0c;已可以满足我们对于图像的应用&#xff0c;而2D图像中丢失的三维似乎并不重要。但随着计算机视觉&#xff08;CV&#xff09;的飞速发展以及与深度学习的结合&#xff0c;许多雄心…

计算机二级vf上机试题,计算机二级VF上机模拟题

计算机二级VF上机模拟题一、基本操作题(共4小题&#xff0c;第1和2题是7分、第3和4题是8分)在考生文件夹下完成下列操作(在"成绩管理"数据库中完成)&#xff1a;1、为"学生"表在"学号"字段上建立升序主索引&#xff0c;索引名和索引表达式均为学…

城市大脑全球标准,构建人类协同发展类脑智能支撑平台

21世纪以来&#xff0c;种种迹象表明诞生于1969年的互联网正在从网状结构向类脑模型演化。这种演化不但导致物联网、云计算、大数据、工业互联网、边缘计算、云机器人的产生&#xff0c;同时也使得谷歌大脑、百度大脑、阿里大脑、360安全大脑、腾讯超级大脑&#xff0c;城市大脑…

一场物理界和数学界永远不能停下的争论

来源&#xff1a;算法数学俱乐部数学和物理的搞笑差别一场物理界和数学界永远不能停下的争论&#xff1a; 数学系和物理系的学生有什么差别&#xff1f;数学系的学生学数学分析、复分析、实分析、泛函分析、数值分析、线性代数、抽象代数、概率论、集合论、数论、微分几何、微分…

Nature:麻省理工人造「巨型原子」问世,量子处理和量子通信合二为一

文章来源&#xff1a;nature在量子计算中&#xff0c;交互就是一切。量子计算机的主要挑战之一&#xff0c;就是如何让稍远距离的量子比特也能交互。一项发表于《自然》上的论文有了新的进展。一直以来&#xff0c;量子计算机都是一个神秘且「高大上」的存在。中国科学院院士潘…

神经网络与推荐系统初步简介

作者&#xff1a;一人 1.深度神经网络对于任何领域都是适用的 深度神经网络&#xff08;Deep Neural Networks, DNN&#xff09;在过去的数年已经在图像分类、语音识别、自然语言处理中取得了突破性的进展。在实践中的应用已经证明了它可以作为对于一种十分有效的技术手段应用…

18个顶级人工智能平台

来源&#xff1a;机器人小妹很多时候企业拥有重复&#xff0c;乏味且困难的工作流程&#xff0c;这些流程往往会减慢生产速度并增加运营成本。为了降低生产成本&#xff0c;企业别无选择&#xff0c;只能自动化某些功能以降低生产成本。通过数字化重复性任务&#xff0c;企业可…

计算机内部程序代码,计算机为什么能够读懂程序代码?

01 引子上一回&#xff0c;我们的主人公小A初次亮相&#xff0c;凭借基础的前后端理解&#xff0c;从技术实现的层面为我们剖析了微信扫码登录的原理和机制。可能很多人因此会好奇&#xff0c;小A到底是做什么的呢&#xff1f;为什么能够弄懂这些原理呢&#xff1f;其实&#x…

符号主义对深度学习的意义浅谈

来源&#xff1a;混沌巡洋舰符号主义人工智能经历过古典时期的专家系统阶段&#xff0c; 中期的知识图谱阶段&#xff0c; 和近期深度学习和符号主义的再次联姻。那么一个很重要的问题是符号主义为什么会复兴&#xff0c;它对当下的机器学习又有何意义&#xff1f;参考阅读&…