关键词搜索

源码搜索 ×
×

canvas笔记-canvas中用户与图形交互

发布2020-06-03浏览1510次

详情内容

运行截图如下:

点击某个圆后:

代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <canvas id="canvas" style="border: 1px solid #aaa; display: block; margin: 50px auto;">
  9. 当前浏览器不支持canvas
  10. </canvas>
  11. <script>
  12. let balls = [];
  13. let canvas = document.getElementById("canvas");
  14. let context = canvas.getContext("https://cdn.jxasp.com:9143/image/2d");
  15. window.onload = function(){
  16. canvas.width = 800;
  17. canvas.height = 800;
  18. for(let i = 0; i < 10; i++){
  19. let ball = {
  20. x: Math.random() * canvas.width,
  21. y: Math.random() * canvas.height,
  22. r: Math.random() * 50 + 20
  23. };
  24. balls[i] = ball;
  25. }
  26. draw();
  27. canvas.addEventListener("mouseup", detect);
  28. }
  29. function draw(){
  30. for(let i = 0; i < balls.length; i++){
  31. context.beginPath();
  32. context.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2);
  33. context.fillStyle = "#058";
  34. context.fill();
  35. }
  36. }
  37. function detect(event){
  38. let x = event.clientX - canvas.getBoundingClientRect().left;
  39. let y = event.clientY - canvas.getBoundingClientRect().top;
  40. console.log("x:" + x + " y:" + y);
  41. for(let i = 0; i < balls.length; i++){
  42. context.beginPath();
  43. context.arc(balls[i].x, balls[i].y, balls[i].r, 0, Math.PI * 2);
  44. if(context.isPointInPath(x, y)){
  45. context.fillStyle = "red";
  46. context.fill();
  47. }
  48. }
  49. }
  50. </script>
  51. </body>
  52. </html>

这里简单说下逻辑,通过canvas.addEventListener监听鼠标弹起的事件,然后通过

  1. let x = event.clientX - canvas.getBoundingClientRect().left;
  2. let y = event.clientY - canvas.getBoundingClientRect().top;

获取当前再canvas中的点的坐标,每次鼠标弹起的时候就进行重绘。

  1. if(context.isPointInPath(x, y)){
  2. context.fillStyle = "red";
  3. context.fill();
  4. }

isPointInPath()方法当点位于当前路径中,则返回true,否则返回false

 

 

下面给出另外一种方法:

  1. function mouseoverFunction(event){
  2. let mouseX = event.offsetX;
  3. let mouseY = event.offsetY;
  4. for(let i = 0; i < XXXXXXXObjects.length; i++){
  5. if(
  6. (XXXXXXXObjects[i].x <= mouseX && (XXXXXXXObjects[i].x + XXXXXXXObjects[i].width) >= mouseX) &&
  7. (XXXXXXXObjects[i].y <= mouseY && (XXXXXXXObjects[i].y + XXXXXXXObjects[i].height) >= mouseY)
  8. ){
  9. XXXXXXXObjects[i].onClicked();
  10. }
  11. }
  12. }

通过这种方式也可以获取x,y在canvas中的坐标,并且判断数组里面的图形,x,y是否在点击的坐标中,如果是就调用onClicked函数。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载