Skip to main content

HTML5 Canvas 图像事件与 Konva

为了仅检测 Konva 中图像中非透明像素的事件,我们可以使用 drawHitFromCache() 方法来生成更精确的图像命中区域。 默认情况下,事件可以在图像内任何像素上触发,即使是透明的。drawHitFromCache() 方法还接受一个可选的回调方法,用于在图像命中区域创建时执行。

注意:drawHitFromCache() 方法要求图像托管在与执行代码相同域的 Web 服务器上。

说明:将鼠标悬停在猴子和狮子上,观察鼠标悬停事件的绑定。请注意,当你将鼠标悬停在图像的任何部分(包括透明像素)上时,事件会在猴子上触发。由于我们为狮子创建了一个图像命中区域,因此透明像素会被忽略,这使得事件检测更为精确。

import Konva from 'konva';

const stage = new Konva.Stage({
  container: 'container',
  width: window.innerWidth,
  height: window.innerHeight,
});

const layer = new Konva.Layer();
stage.add(layer);

const text = new Konva.Text({
  x: 10,
  y: 10,
  fontFamily: 'Calibri',
  fontSize: 24,
  text: '',
  fill: 'black',
});
layer.add(text);

function writeMessage(message) {
  text.text(message);
}

const imageObj1 = new Image();
imageObj1.onload = () => {
  const monkey = new Konva.Image({
    x: 120,
    y: 50,
    image: imageObj1,
    width: 200,
    height: 200,
  });

  monkey.on('mouseover', function () {
    writeMessage('mouseover monkey (regular image)');
  });
  monkey.on('mouseout', function () {
    writeMessage('');
  });

  layer.add(monkey);
};
imageObj1.crossOrigin = 'Anonymous';
imageObj1.src = 'https://konvajs.org/assets/monkey.png';

const imageObj2 = new Image();
imageObj2.onload = () => {
  const lion = new Konva.Image({
    x: 320,
    y: 50,
    image: imageObj2,
    width: 200,
    height: 200,
  });

  // 覆盖颜色检测区域
  lion.on('mouseover', function () {
    writeMessage('mouseover lion (with transparent pixels detection)');
  });
  lion.on('mouseout', function () {
    writeMessage('');
  });

  layer.add(lion);
  lion.cache();
  lion.drawHitFromCache();
};
imageObj2.crossOrigin = 'Anonymous';
imageObj2.src = 'https://konvajs.org/assets/lion.png';