事件

Scene 自动代理了 mouse 和 touch 相关事件,因此要监听这些事件非常简单,直接使用 spirte.addEventListener 方法即可。

  1. const {Scene, Sprite, Label, Path} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const s1 = new Sprite();
  10. s1.attr({
  11. anchor: [0.5, 0.5],
  12. pos: [770, 300],
  13. size: [300, 300],
  14. rotate: 45,
  15. bgcolor: '#3c7',
  16. });
  17. layer.append(s1);
  18. s1.addEventListener('mouseenter', (evt) => {
  19. s1.attr('border', [4, 'blue']);
  20. });
  21. s1.addEventListener('mouseleave', (evt) => {
  22. s1.attr('border', [0, '']);
  23. });
  24. const anchorCross = new Path('M-10,0H10M0,-10V10');
  25. anchorCross.attr({
  26. pos: [770, 300],
  27. strokeColor: 'red',
  28. rotate: 45,
  29. lineWidth: 4,
  30. pointerEvents: 'none',
  31. });
  32. layer.append(anchorCross);
  33. const label = new Label('鼠标位置:');
  34. label.attr({
  35. pos: [20, 50],
  36. font: '24px Arial',
  37. lineHeight: 56,
  38. });
  39. layer.append(label);
  40. s1.addEventListener('mousemove', (evt) => {
  41. const {x, y} = evt;
  42. label.text = `鼠标位置:\n相对于锚点: ${s1.getOffsetPosition(x, y).map(Math.round)}`;
  43. });

SpriteJS Next 采用标准的DOM事件模型,支持事件冒泡、捕获机制。

在同一个Layer的元素,上层可见元素会遮挡下层元素的事件,但是可以设置属性pointerEvents: none来阻止上层的遮盖。

与DOM事件一样,我们可以事件冒泡和阻止事件冒泡。

我们稍稍改一下上面的例子:

  1. const {Scene, Sprite, Label, Path} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 1200,
  6. height: 600,
  7. });
  8. const layer = scene.layer();
  9. const s1 = new Sprite();
  10. s1.attr({
  11. anchor: [0.5, 0.5],
  12. pos: [770, 300],
  13. size: [300, 300],
  14. rotate: 45,
  15. bgcolor: '#3c7',
  16. });
  17. layer.append(s1);
  18. s1.addEventListener('mouseenter', (evt) => {
  19. s1.attr('border', [4, 'blue']);
  20. });
  21. s1.addEventListener('mouseleave', (evt) => {
  22. s1.attr('border', [0, '']);
  23. });
  24. const anchorCross = new Path('M-10,0H10M0,-10V10');
  25. anchorCross.attr({
  26. pos: [770, 300],
  27. strokeColor: 'red',
  28. rotate: 45,
  29. lineWidth: 4,
  30. pointerEvents: 'none',
  31. });
  32. layer.append(anchorCross);
  33. const label = new Label('鼠标位置:');
  34. label.attr({
  35. pos: [20, 50],
  36. font: '24px Arial',
  37. lineHeight: 56,
  38. });
  39. layer.append(label);
  40. s1.addEventListener('mousemove', (evt) => {
  41. const {x, y} = evt;
  42. label.text = `鼠标位置:\n相对于锚点: ${s1.getOffsetPosition(x, y).map(Math.round)}`;
  43. evt.stopPropagation();
  44. });
  45. layer.addEventListener('mousemove', (evt) => {
  46. const {x, y} = evt;
  47. label.text = `鼠标位置:\n相对于 Layer: ${[Math.round(x), Math.round(y)]}`;
  48. });