怎么用html5的canvas实现箭头随着鼠标移动和旋转
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用html5的canvas实现箭头随着鼠标移动和旋转相关的知识,希望对你有一定的参考价值。
下面是源码
主文件
test.htm
<!doctype html>
<html>
<head>
<mata charset="utf-8">
<title></title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<canvas id="canvas" >
<p> :( 抱歉~ <br> 您的浏览器貌似不支持HTML5的标签"canvas"的说,试试更换成
Chrome,FireFox,IE9...</p>
</canvas>
<script src="arrow.js"></script>
<script src="utils.js"></script>
<script>
window.onload=function()
var canvas=document.getElementById("canvas"),
context=canvas.getContext(\'2d\'),
mouse=utils.captureMouse(canvas),
arrow=new Arrow();
arrow.x=canvas.width/2;
arrow.y=canvas.height/2;
if (!window.requestAnimationFrame)
window.requestAnimationFrame = (window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (callback)
return window.setTimeout(callback, 1000/60);
);
(function drawFrame()
window.requestAnimationFrame(drawFrame,canvas);
context.clearRect(0,0,canvas.width,canvas.height);
var dx=mouse.x-arrow.x;
var dy=mouse.y-arrow.y;
arrow.rotation=Math.atan2(dy,dx);
arrow.draw(context);
());
;
</script>
</body>
</html>
var canvas=document.getElementById(“canvas”)
//即将变量 canvas 作为对 html5 canvas标签id为’canvas’ 的引用
context=canvas.getContext(‘2d’)
//获取canvas该对象后,可在其上进行图形绘制
window.requestAnimationFrame
为了便于javascript进行图形的重绘,各大浏览器厂商都提供了各自的API给开发者进行调用,由于各大厂商的对HTML5的支持不同,所以API没有统一,但使用厂商各自的API则在该API在对应浏览器上为最有效率的方式运行。代码中对
用户浏览器做判断,实例化能被成功引用的API接口。如果用户的浏览器没有提供该API,则使用JS的setTimeout。其特性类似于AS的 ENTER_FRAME 事件。
需要用到的2个JS文件
utils.js 可根据传入的对象判断,鼠标所在对象的相对于左上角的坐标值
utils.captureMouse=function(element)
var mouse=x:0,y:0;
element.addEventListener(\'mousemove\',function(event)
var x,y;
if(event.pageX || event.pageY)
x=event.pageX;
y=event.pageY;
else
x=event.clientX+document.body.scrollLeft+
document.documentElement.scrollLeft;
y=event.clientY+document.body.scrollTop+
document.documentElement.scrollTop;
x -= element.offsetLeft;
y -= element.offsetTop;
mouse.x=x;
mouse.y=y;
,false);
return mouse;
;
计算mouse相对于容器的x,y坐标偏移,本质是判断鼠标在浏览器中的鼠标偏移,之后对浏览器中容器宽度和高度进行再次偏移。
arrow.js
绘制一个箭头的js
function Arrow() this.x=0; this.y=0; this.color="#ffff00"; this.rotation=0;Arrow.prototype.draw=function(context) context.save(); context.translate(this.x,this.y); context.rotate(this.rotation); context.lineWidth=2; context.fillStyle=this.color; context.beginPath(); context.moveTo(-50,-25); context.lineTo(0,-25); context.lineTo(0,-50); context.lineTo(50,0); context.lineTo(0,50); context.lineTo(0,25); context.lineTo(-50,25); context.lineTo(-50,-25); context.closePath(); context.stroke(); context.restore(); ;
熟悉AS的Graphics 的coder一定很快能熟悉使用JS的绘图API
style.css
用到的样式表
body
background-color:#bbb;
#canvas
background-color:#fff;
区分canvas 内外的颜色。
追问
可否给个不用用到外部样式表的,谢谢
追答不会意思。无能为力
参考技术A 你好代码如下:<!doctype html>
<html>
<head>
<mata charset="utf-8">
<title></title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<canvas id="canvas" width="400" height="400">
<p> :( 抱歉~ 您的浏览器貌似不支持HTML5的标签"canvas"的说,试试更换成
Chrome,FireFox,IE9...</p>
</canvas>
<script src="arrow.js"></script>
<script src="utils.js"></script>
<script>
window.onload=function()
var canvas=document.getElementById("canvas"),
context=canvas.getContext('2d'),
mouse=utils.captureMouse(canvas),
arrow=new Arrow();
arrow.x=canvas.width/2;
arrow.y=canvas.height/2;
if (!window.requestAnimationFrame)
window.requestAnimationFrame = (window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (callback)
return window.setTimeout(callback, 1000/60);
);
(function drawFrame()
window.requestAnimationFrame(drawFrame,canvas);
context.clearRect(0,0,canvas.width,canvas.height);
var dx=mouse.x-arrow.x;
var dy=mouse.y-arrow.y;
arrow.rotation=Math.atan2(dy,dx);
arrow.draw(context);
());
;
</script>
</body>
</html> 参考技术B 现在你搜到没有啊,,兄弟!
HTML5 Canvas元素绘制地图,如何实现显示鼠标所移动地方名称?
参考技术A本文实例分享了html5 canvas可拖动省份的中国地图实现方法,供大家参考,具体内容如下
鼠标移动事件:根据点击的省份名,获得数据,并实时重绘移动层的省份
var mouseX, mouseY;
if(ev.layerX || ev.layerX==0)
mouseX = ev.layerX;
mouseY = ev.layerY;
else if(ev.offsetX || ev.offsetX==0)
mouseX = ev.offsetX;
mouseY = ev.offsetY;
if(draging)
if(opts.dragAll) <span style="font-family: Arial, Helvetica, sans-serif;">//拖动整个地图,存在问题,地图画的太慢</span>
mapContext.clearRect(0, 0, 1100, 630);
for(var i = 0;i < allZoneData.length;i++)
for(var j = 0;j < allData[allZoneData[i].name].length;j++) //allData是第一次读取数据时放到内存里的变量,它包含了所有数据
pubFuns.drawMap(mapContext,allData[allZoneData[i].name][j],mouseX - tempX, mouseY - tempY);
else
moveMapContext.clearRect(0, 0, 1100, 630);
pubFuns.drawMoveLayerLine(mouseX - tempX, mouseY - tempY);
);
鼠标抬起事件:设置dragging为false,clear移动层。
if(opts.dragAll)
else
moveMapContext.clearRect(0, 0, 1100, 630);
draging = false;
);
小结:功能、原理都很简单,但能熟悉canvas的一些属性和方法。canvas层是可以重叠到一起的,这样就可以在不同的层画不同的内容,方便维护和管理。
以上就是本文的全部内容,希望对大家的学习有所帮助。
以上是关于怎么用html5的canvas实现箭头随着鼠标移动和旋转的主要内容,如果未能解决你的问题,请参考以下文章
HTML5 Canvas元素绘制地图,如何实现显示鼠标所移动地方名称?
你好 你的这个问题 “ html5 canvas 中用鼠标画(拉出)直线的问题! ”
HTML5 Canvas元素绘制地图,已绘制出地图,并且地图可放大缩小,怎样实现鼠标移动到一幢楼时显示楼的名称