У меня возникли проблемы с добавлением прослушивателя событий в концентрическую группу кругов. Моя предполагаемая функциональность заключается в следующем: когда курсор мыши находится над группой, в центре группы должна появиться новая черная точка («яблочко» - кружок 3 в приведенном ниже коде). Когда указатель мыши не находится над группой, черная точка не должна появляться.
Следующий код приближается к этому:
<!DOCTYPE HTML>
<html>
<head>
<style>
body {
margin: 0px;
padding: 0px;
}
</style>
</head>
<body>
<div id="container"></div>
<script src="http://d3lp1msu2r81bx.cloudfront.net/kjs/js/lib/kinetic-v4.7.4.min.js"></script>
<script defer="defer">
var stage = new Kinetic.Stage({
container: 'container',
width: 578,
height: 200
});
var layer = new Kinetic.Layer({});
var group = new Kinetic.Group({
x: 0, //
y: 0 //
});
var circle = new Kinetic.Circle({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
radius: 70,
fill: 'red',
stroke: 'black',
strokeWidth: 4
});
var circle2 = new Kinetic.Circle({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
radius: 50,
fill: 'white',
stroke: 'black',
strokeWidth: 4
});
var circle3 = new Kinetic.Circle({
x: stage.getWidth() / 2,
y: stage.getHeight() / 2,
radius: 20,
fill: 'black',
stroke: 'black',
strokeWidth: 4,
visible: false
});
group.add(circle);
group.add(circle2);
group.add(circle3);
group.on("mouseenter", function(event){
circle3.setVisible(true);
stage.draw();
});
group.on("mouseleave", function(event){
circle3.setVisible(false);
stage.draw();
});
// add the shape to the layer
layer.add(group);
// add the layer to the stage
stage.add(layer);
</script>
</body>
</html>
Однако проблема в том, что «пуля» мерцает, когда выходит из внешнего круга (круг) и входит во внутренний круг (круг2).
(*) Я пробовал разные решения, но, похоже, ничего не работает. Во-первых, я попытался захватить положение мыши (слой X и слой Y) и обнаружить столкновение с областью группы на холсте. То есть, если x и y находятся в его границах, я рисую яблочко. В противном случае я избавлюсь от этого. Однако проблема с этим решением состоит в том, что «яблочко» иногда становится сиротой в группе, даже если мышь покинула группу. Это связано с тем, что событие mouseout / mouseleave иногда имеет позицию layerX или layerY, которая все еще находится внутри круга.
(*) Использование mouseover и mouseout вместо mouseenter / mouseleave, похоже, ни на что не влияет.
(*) Я не могу добавить прослушиватель событий только к внешнему кругу, так как это заставляет «яблочко» исчезать, когда указатель мыши находится над внутренним кругом.