点击canvas中指定图形触发事件

问题:

给canvas绘制的某个图片区域绑定点击事件

分析:

canvas绘制时可取得图形位置,绘制完成时无法获取每一个图形的位置

解决:

重绘一遍图形,一边绘制一边比较点击事件发生的位置,看点击事件发生在了哪一个图形上面

在canvas标签中添加属性

bindtap='CanvasTap'

下面两个属性可用来自定义长按还是单击,官方给出的bindlongtap 作为长按是500毫秒,个人感觉这个长按事件和单击不太区分得开

bindtouchstart='touchStart' 
bindtouchend='touchEnd'

在当前页面变量里面添加point记录点击发生的位置和类别

  data: {
    point: {
      x: 0,
      y: 0,
      isLongTap:false
    },
    // 触摸开始时间
    touchStartTime: 0,
    // 触摸结束时间
    touchEndTime: 0,
 }

在绘制canvas中每个图形结束之后,判断点击是否发生在了改图形区域内,此处以画圆举例

//如果点击
    if (this.data.point) {
      var x = this.data.point.x
      var y = this.data.point.y
      // var d = (x - pro.X) ^ 2 + (y - pro.Y) ^ 2
      var d = (x - pro.X) * (x - pro.X) + (y - pro.Y) * (y - pro.Y)
      var d_width = x - this.data.albumtext.x // 点击的宽度
      var d_heigh = y - this.data.albumtext.y //点击的长度
      console.log("d < pro.r * pro.r:" + (d < pro.r * pro.r))
      if (d < pro.r * pro.r) {//判断点击事件是否发生在圆圈内
        if (!this.data.point.isLongTap){//单击
          this.DoTap(pro)
        }else{//双击
          this.DoLongTap(pro)
        }
        
      }

缺点:

二次绘图耗时,可以考虑记录每一个图形的覆盖区域,如果图形较多,就比较浪费内存了。

Canvas是HTML5提供的一种绘图API,结合JavaScript可以动态地在网页上绘制图形和图像。要通过canvas和JavaScript实现点击图片并改变指定部位的颜色,你需要遵循以下步骤: 1. **设置基础结构**: 创建一个HTML元素包含`<canvas>`标签,并添加一个图片作为背景。同时,添加一个事件监听器,如`onclick`,来响应用户的点击事件。 ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Canvas Color Changer</title> </head> <body> <canvas id="myCanvas" width="400" height="400"></canvas> <img src="your_image.jpg" id="backgroundImage" style="position:absolute; display:none;"> <script src="script.js"></script> </body> </html> ``` 2. **JavaScript部分** (创建`script.js`文件): - 获取`canvas`和`image`元素 - 加载图片到`canvas` - 添加事件处理函数 - 当点击事件触发时,获取点击坐标并对应到图片像素上 ```javascript const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); const backgroundImage = document.getElementById('backgroundImage'); // 加载图片到canvas let img = new Image(); img.src = 'your_image.jpg'; img.onload = function() { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); }; // 点击事件处理器 canvas.addEventListener('click', function(event) { const rect = canvas.getBoundingClientRect(); // 获取canvas的位置信息 const x = event.clientX - rect.left; // 点击坐标减去canvas左边界 const y = event.clientY - rect.top; // 计算点击点对应的图片像素索引 const pixelIndexX = Math.floor(x / canvas.width * img.width); const pixelIndexY = Math.floor(y / canvas.height * img.height); // 获取该像素的颜色值 const pixelColor = ctx.getImageData(pixelIndexX, pixelIndexY, 1, 1).data; // 改变颜色 ctx.fillStyle = `rgb(${pixelColor[0]}, ${pixelColor[1]}, ${pixelColor[2]})`; ctx.fillRect(pixelIndexX, pixelIndexY, 1, 1); // 将像素画回原位 }); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值