SpriteJS支持给精灵派发事件(dispatchEvent),支持DOM事件、内建事件和自定义事件。

DOM Events

SpriteJS默认代理了container上的鼠标和Touch事件,所以我们可以直接给精灵元素注册这些事件。

SpriteJS默认支持下列事件:

事件类型是否原生事件说明
clickYes鼠标或触控设备点击精灵
mousedownYes鼠标在精灵上被按下
mousemoveYes鼠标在精灵上移动
mouseupYes鼠标在精灵上被松开
mouseenterNo鼠标移入精灵范围
mouseleaveNo鼠标移出精灵范围
touchstartYes触控设备触碰精灵
touchmoveYes触碰设备触碰精灵并移动
touchendYes触控设备结束触碰精灵

我们可以直接对精灵注册事件,方法是直接使用sprite.on(type, handler)

on方法的第一个参数还可以是数组,可以同时给精灵注册多个事件类型。

具体可以参考例子一例子二

stopDispatch

就像DOM有冒泡机制和阻止冒泡的方法一样,SpriteJS的事件根据精灵的层叠位置关系依次派发,我们可以通过调用event.stopDispatch()来阻止事件派发给同级的后续元素,这样可以实现事件的遮罩。

Event - 图1

上面的例子中,我们通过stopDispatch()屏蔽掉下层元素对mouse事件的响应。要注意,stopDispatch()并不会阻止不同级的元素的事件,因此阻止掉sprite元素的mousemove事件,并不会同时阻止掉它的父容器layer的mousemove事件。

Build-in Events

SpriteJS元素有一些内置的事件,主要有以下几种:

事件类型事件参数事件说明
append{parent, zOrder}当元素被append到layer上时触发
remove{parent, zOrder}当元素被从layer上remove时触发
update{context, target, renderTime, fromCache}当元素被重新绘制时触发,发生重绘操作有可能是元素本身属性发生改变,也有可能是其他元素属性改变需要重绘,影响到当前元素。target是要绘制的元素,renderTime是当前layer的timeline的时间,fromCache为true,则说明元素缓存未失效
beforedraw{context, target, renderTime, fromCache}当元素被重新绘制时触发,发生重绘操作有可能是元素本身属性发生改变,也有可能是其他元素属性改变需要重绘,影响到当前元素。target是要绘制的元素,renderTime是当前layer的timeline的时间,fromCache为true,则说明元素缓存未失效
afterdraw{context, target, renderTime, fromCache}当元素被重新绘制时触发,发生重绘操作有可能是元素本身属性发生改变,也有可能是其他元素属性改变需要重绘,影响到当前元素。target是要绘制的元素,renderTime是当前layer的timeline的时间,fromCache为true,则说明元素缓存未失效
preload{target, loaded, resources}这个事件只在scene预加载资源时触发,target是当前scene,loaded是已经加载的资源,resources是需要加载的所有资源

我们可以利用这些事件来做一些事情,比如通过afterdraw实现自定义滤镜,参考这个例子

user delegate

SpriteJS可以通过scene.delegateEvent(type, subject)将其他外部事件代理过来,所有在subject上可以被响应的事件都可以代理进来。比如我们可以代理document上的键盘输入事件:

  1. scene.delegateEvent('keydown', document)
  2. scene.delegateEvent('keyup', document)

这里有详细的例子

Custom Events

我们可以给精灵元素派发事件,做法是调用精灵元素的dispatchEvent(type, eventArgs, collisionState = false, swallow = false)方法,该方法有四个参数。

  • type 要派发的事件类型
  • eventArgs 派发的事件参数
  • collisionState 默认为false,这样spritejs会检查eventArgs.layerX和eventArgs.layerY来判断事件是否在元素范围内,如果设为true,则跳过这项检查,始终认为事件在范围内。
  • swallow 如果派发事件的元素是Layer或Group,那么将这个参数设置为true,可以阻止这个元素将事件下发到它的子元素。

Remove Events

我们可以调用sprite.off(type, handler)方法将事件监听移除。type可以是数组,这样批量移除多个事件。handler参数如果缺省,那么将这个类型下的所有事件监听句柄全部移除。