canvas点击事件,以及点击之后获取数据的方法

canvas点击事件 可以看这里。

canvas 点击事件中主要有2个问题:

  1. 如何点击到自己想要的元素(圆或者矩形)等,的时候 响应点击事件

  2. 点击到的时候 如何获取数据。

1.  第一个 canvas 提供了一个 方法  isPointInPath():如果指定的点位于当前路径,返回true,否则返回 false。

  就是在一个路径 你鼠标点击的时候 有一个 x,y 坐标,如果 这个点 在当前路径中,就会返回true, 可以看上面文章的例子。

  canvas 中 beginPath 就是重置路径,就是你要点击响应的 图形,要在最后一个路径中,使用 isPointInPath();方法才会返回true

2. 就是点击之后,要取到自己想要的数据。

这个问题可以看这个视频 慕课网 使用canvas 交互 和 isPointInPath 可以看这个视频。

案例 

下面是点击方法画布的方法监听,拿到点击事件在画布中的 位置 x, y 之后,重新调一下 生产 球形的方法

 // 画布点击事件-- 来判断是否点击到技能点
  click: function(e){
    let { detail:{x,y} } = e;
    this.ctxArc(x,y);
  },

下面代码是画球形的 代码,因为有很多 ,这里是二维数组来存储业务数据,坐标也是二维数组

// 画球形
  ctxArc: function(x,y){
    const { list, zpoints } = this.data;
   // list: 业务数据, zpoints: 所有球形的坐标
    ctx.save();
    ctx.translate(0, 0);
    list.map((arr, index)=> {
      arr.map((item,indexx)=>{
        let str = item.name.slice(0,2);
        let pointItem = zpoints[index][indexx];
          let color = this.getArcColor(item.status);
          // 画球形
          ctx.fillStyle = color;
          ctx.beginPath();
          ctx.moveTo(pointItem.x, pointItem.y);
          ctx.arc(pointItem.x, pointItem.y, 20, 0, 2 * Math.PI, false);
          ctx.fill();
          // 这里是判断,如果 该方法传入了坐标,表示是点击事件响应的,
          if (x && y) {
            // 判断当前画的路径中是否存在该坐标,如果存在 那么 ,刚刚点击的就是 这个球形,则可以拿到对应的数据
            if (ctx.isPointInPath(x, y)) {
              console.log(item);
            }
          }
          // 文字
          ctx.font="12px Georgia";
          ctx.fillStyle = '#FFF';
          ctx.moveTo(pointItem.x, pointItem.y);
          ctx.fillText(str,pointItem.x, pointItem.y - 10);
      });
    });
    ctx.closePath();
  },

还有一点需要注意,我这里是画布是全屏的,所以事件响应坐标,就是画布所在的坐标,实际用的时候,画布对应的坐标是需要计算的

function detect(event){
    var x = event.clientX - canvas.getBoundingClientRect.left;
    var y = event.clientY - canvas.getBoundingClientRect.top;
}

用文档坐标,减去画布 距离顶部 和左边的距离,得到的 值,才是在画布中的 坐标