HTML5 Canvas 图像事件与 Konva

HTML5 Canvas 图像事件与 Konva

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

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

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

Konva Image_Events Demoview raw
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/konva@9.3.18/konva.min.js"></script>
<meta charset="utf-8" />
<title>Konva Image Events Demo</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
background-color: #f0f0f0;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
function writeMessage(message) {
text.text(message);
}
function loadImages(sources, callback) {
var images = {};
var loadedImages = 0;
var numImages = 0;
for (var src in sources) {
numImages++;
}
for (var src in sources) {
images[src] = new Image();
images[src].onload = function () {
if (++loadedImages >= numImages) {
callback(images);
}
};
images[src].src = sources[src];
}
}
function buildStage(images) {
var monkey = new Konva.Image({
image: images.monkey,
x: 120,
y: 50,
});

var lion = new Konva.Image({
image: images.lion,
x: 280,
y: 30,
});

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

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

lion.on('mouseover', function () {
writeMessage('mouseover lion');
});

lion.on('mouseout', function () {
writeMessage('');
});

lion.cache();
lion.drawHitFromCache();

layer.add(monkey);
layer.add(lion);
layer.add(text);
stage.add(layer);
}
var stage = new Konva.Stage({
container: 'container',
width: 578,
height: 200,
});

var layer = new Konva.Layer();

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

var sources = {
lion: '/assets/lion.png',
monkey: '/assets/monkey.png',
};

loadImages(sources, buildStage);
</script>
</body>
</html>