Egret社区
1银子
armature.addEventListener(dragonBones.AnimationEvent.COMPLETE, this.dragonbonesAnimePlayCompleted, this);

private dragonbonesAnimePlayCompleted(e: dragonBones.AnimationEvent): void {
        let display: dragonBones.EgretArmatureDisplay = <dragonBones.EgretArmatureDisplay>e.target;
        display.armature.removeEventListener(dragonBones.AnimationEvent.COMPLETE, this.dragonbonesAnimePlayCompleted, this);
        if (this._animeLayer.contains(display)) {
            this._animeLayer.removeChild(display);
        }
        this._animeLayer.visible = false;
    }

发现了个问题,就是在监听事件里得到的e.target, 不是我绑定监听的对象armature, 而是armature.display, 我要想移除此监听,需要获取display.armature。这个好像违背了egret的一贯设计初衷啊,本应该是绑定监听者,派发监听事件,可是实际上在这里却不是这样了, 派发监听者变成了绑定者的成员。

最佳答案

查看完整内容

你的理解很对,很正确,但是目前这样也是因为历史遗留的问题 db 的运行时重新设计了,将显示层和事件层都委托给了渲染引擎,这样 db 只关注内部逻辑,跟引擎毫无关系,这样的好处是很容易就可以连接其他渲染引擎,但是为了兼容旧的代码,db 的 armature 里保留了添加移除事件的 api,不过如果看源码就会发现,这些 api 调用的全是 display 的接口,因为需要保证平台无关, armature 不能实现 IEventDispatcher 接口,所以也就不 ...
分享到 :
1 人收藏

6 个回复

倒序浏览
duanchunlei  官方团队 | 2017-4-7 10:25:00
jj229937432 发表于 2017-4-8 00:27
我也这么理解的,但实际上我在调试的时候,我是armature添加的监听,但是currentTarget却是armature.disp ...

你的理解很对,很正确,但是目前这样也是因为历史遗留的问题
db 的运行时重新设计了,将显示层和事件层都委托给了渲染引擎,这样 db 只关注内部逻辑,跟引擎毫无关系,这样的好处是很容易就可以连接其他渲染引擎,但是为了兼容旧的代码,db 的 armature 里保留了添加移除事件的 api,不过如果看源码就会发现,这些 api 调用的全是  display 的接口,因为需要保证平台无关, armature 不能实现 IEventDispatcher 接口,所以也就不能将 armature 做为 target。
所以这里的推荐方式是这样的
let armatureDisplay = factory.buildArmatureDisplay("armatureName");
// 用 armatureDisplay 来做跟平台相关的操作,比如事件渲染相关等。
armatureDisplay.addEventListener();
armatureDisplay.removeEventListener();
// 用 armatureDisplay.armature,  armatureDisplay.animation 来做跟 db 相关的操作,比如播放动画获取骨骼或插槽或换装等。
armatureDisplay.armature.getSlot("slotName");
armatureDisplay.animation.play("animationName");
armature.arm
yjtx  官方团队 | 2017-4-7 11:57:52
貌似你没能理解 target 和 currentTarget 的区别。
jj229937432  圆转纯熟 | 2017-4-7 15:04:54
yjtx 发表于 2017-4-7 11:57
貌似你没能理解 target 和 currentTarget 的区别。

是有区别,但是没太明白,能举例说明吗,为什么我给armature绑定的监听,回调的时候target或者currentTarget都不是armature,而都是armature.display, 没想明白,api中的说明看似与实际也不相符。
yjtx  官方团队 | 2017-4-7 16:25:55
jj229937432 发表于 2017-4-7 15:04
是有区别,但是没太明白,能举例说明吗,为什么我给armature绑定的监听,回调的时候target或者currentTar ...

谁监听的,currentTarget 就是谁。

target 是最终作用的对象
jj229937432  圆转纯熟 | 2017-4-8 00:27:55
yjtx 发表于 2017-4-7 16:25
谁监听的,currentTarget 就是谁。

target 是最终作用的对象

我也这么理解的,但实际上我在调试的时候,我是armature添加的监听,但是currentTarget却是armature.display
jj229937432  圆转纯熟 | 2017-4-11 09:22:21
duanchunlei 发表于 2017-4-7 10:25
你的理解很对,很正确,但是目前这样也是因为历史遗留的问题
db 的运行时重新设计了,将显示层和事件层都 ...

十分感谢,我了解了,还有一个问题就是,我之前的source都是armature添加的监听,那我在回收资源的时候需要解除监听,请问是用armature.removeEventListener 还是用display.removeEventListener。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部