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.…

html控制浏览器宽度和高度,html – 设置电子邮件和浏览器的tr和td宽度和高度

我正在制作HTML电子邮件,我想在发送之前在我的浏览器中预览它们,所以我希望它们在浏览器和电子邮件客户端中看起来类似.我已经尝试了几种方法来设置行和单元格的宽度和高度:TESTTEST通过HTML属性或样式属性设置高度没有成功.单元格覆盖了桌子的整个高度.编辑因为它似…

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

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

计算机科学与技术专业改革,浅析计算机科学与技术专业教学改革

【摘要】社会的不断进步带动着科学技术的快速发展,人们对计算机技术的关注也越来越多,对高校计算机科学与技术专业也提出了更高的要求。计算机科学与技术专业需要与时俱进,与现代技术相结合,改变传统的教学模式与计划才能培养出符…

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

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

配置 CentOS 7 的网络,及重命名网卡名

Centos 安装时应配置网络,如果当时没配置好,则装完系统后, 也可通过修改配置文件并重启网络服务进行配置。 说明:CentOS 7.0默认安装好之后是没有自动开启网络连接的!cd /etc/sysconfig/network-scripts/ #进入网络…

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

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

FPGA的历史、现状和未来

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

「mysql优化专题」详解引擎(InnoDB,MyISAM)的内存优化攻略?(9)

注意:以下都是在MySQL目录下的my.ini文件中改写(技术文)。 一、InnoDB内存优化 InnoDB用一块内存区域做I/O缓存池,该缓存池不仅用来缓存InnoDB的索引块,而且也用来缓存InnoDB的数据块。 1、innodb_log_buffer_size 决定…

学生用计算机怎么用视频,19.使用ZOOM作为上课视频、语音和屏幕分享工具,具体对学生的电脑和宽带有什么软件和硬件要求?...

设备:• 网络连接——宽带、Wifi或3G、4G网络。• 扬声器和麦克风——内置或外接的无线蓝牙设备。• (HD)摄像头——外接或内置。支持的系统:• iOS 5.0或更新的操作系统。• 能够通过前后摄像头发送和接收视频。• iPad 2、最新iPad、iPhone 3(没有前置…

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

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

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

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

html文本改,编辑html格式文本可改成txt格式(可以替换或更换某文本)新手

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼新的名字生活助手If Clock.Hour < 12 ThenTextWindow.WriteLine("早上好&#xff0c;测试者")ElseIf Clock.Hour < 14 ThenTextWindow.WriteLine("中午好&#xff0c;测试者")ElseIf Clock.Hour < 17…

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

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

SQuirreL SQL Client3.8 连接 HIVE2.2

在 使用 SQuirreL SQL Client3.8 连接 HIVE2.2 发生错误&#xff0c;后换用 SQuirreL SQL Client3.7 好用&#xff01; 只需要使用 hive-jdbc-2.2.0-standalone.jar 和 hadoop-common-2.8.2.jar &#xff08;本人环境 为 hadoop2.8 和 hive 2.2&#xff09; 转载于…

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

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

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

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

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…

计算机应用基础王秀娟,计算机应用基础课教学内容设计分析.doc

计算机应用基础课教学内容设计分析计算机应用基础课程教学内容设计分析摘要&#xff1a;随着科技的发展和时代的不断进步&#xff0c;计算机技术的应用被高度重视&#xff0c;计算机作为提高人们的生活质量和工作效率的一种必备工具已深深融入到了人们的工作、学习和生活中&…

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

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