怎么用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 可根据传入的对象判断,鼠标所在对象的相对于左上角的坐标值

unction utils();
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可拖动省份的中国地图实现方法,供大家参考,具体内容如下

鼠标移动事件:根据点击的省份名,获得数据,并实时重绘移动层的省份

$('#eventCanvas').mousemove(function(ev) 
 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移动层。

$('#eventCanvas').mouseup(function(e) 
 if(opts.dragAll)  
 else 
  moveMapContext.clearRect(0, 0, 1100, 630); 
  
 draging = false; 
);

小结:功能、原理都很简单,但能熟悉canvas的一些属性和方法。canvas层是可以重叠到一起的,这样就可以在不同的层画不同的内容,方便维护和管理。

以上就是本文的全部内容,希望对大家的学习有所帮助。

以上是关于怎么用html5的canvas实现箭头随着鼠标移动和旋转的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 Canvas元素绘制地图,如何实现显示鼠标所移动地方名称?

你好 你的这个问题 “ html5 canvas 中用鼠标画(拉出)直线的问题! ”

HTML5 Canvas元素绘制地图,已绘制出地图,并且地图可放大缩小,怎样实现鼠标移动到一幢楼时显示楼的名称

canvas是怎么响应鼠标事件的

html5 怎么实现单击鼠标,记录单击的点,点点之间用直线连接?

unity怎么把canvas做成小地图