【问题标题】:How to retrieve the child added to a MovieClip?如何检索添加到 MovieClip 的孩子?
【发布时间】:2015-10-16 01:25:06
【问题描述】:

我有一个包含多个时间线的 .fla 文件,并且不断添加和删除影片剪辑。

我需要以编程方式从那些添加和删除的影片剪辑中获取一些信息,问题是,我无法捕获它,我有这个:

private function swfLoadedHandler(e:Event):void {

        var mc:MovieClip = e.currentTarget.content;
        mc.addEventListener(Event.ADDED, onAdded);

}

然后我在事件处理程序中得到了这个:

private function onAdded(e:Event):void {

   trace(e.target.name);


}

所有子级都为动作脚本影片剪辑导出并具有实例名称。如果我手动循环它们,我可以找到它们,但事件不会。

该示例中的目标不是我最近添加的影片剪辑,而是“形状”,名称类似于 istanceNN。

有什么想法可能是错的吗?

【问题讨论】:

  • 能解释更多你的问题吗?您需要获取哪些信息?而swfLoadedHandler() 究竟是哪个事件的处理程序? ...

标签: actionscript-3 flash


【解决方案1】:

尽管这不是最好的主意,但您可以使用.name 属性;

private function swfLoadedHandler(e:Event):void {
    var mc:MovieClip = e.currentTarget.content;
    mc.name = "myMc";
    mc.addEventListener(Event.ADDED, onAdded);
}

private function onAdded(e:Event):void {
   trace(e.target.name); //myMc
}

如果仍然没有,请检查您是否有嵌套的影片剪辑,您是否接收到内部对象的实例名称。

【讨论】:

  • 我怀疑你理解了这个问题。
  • 可能是。内部对象呢?
  • 这正是我没有收到的,我想知道为什么会这样。
【解决方案2】:

您应该使用 ADDED_TO_STAGE 事件, mc.addEventListener(Event.ADDED_TO_STAGE, onAdded); 因为这个事件不会冒泡。而您当前捕获的ADDED 事件将触发您对mc 中所有内部对象的侦听器。或者你应该追踪你的currentTarget 而不是target。但最好同时使用:

private function swfLoadedHandler(e:Event):void {
    var mc:MovieClip = e.currentTarget.content;
    mc.addEventListener(Event.ADDED_TO_STAGE, onAdded);
}

private function onAdded(e:Event):void {
   trace(e.currentTarget.name);
}

这应该会有所帮助

更新:好的。如果您需要获取直接添加到您的影片剪辑的对象,那么您可能应该检查它们的父级?

private function swfLoadedHandler(e:Event):void {
    var mc:MovieClip = e.currentTarget.content;
    mc.addEventListener(Event.ADDED, onAdded);
}

private function onAdded(e:Event):void {
   const myMc:DisplayObject = e.currentTarget as DisplayObject;
   const addedObject:MovieClip = e.target as MovieClip;

   if (addedObject && (addedObject.parent == myMc)) {
       trace(addedObject.name);
   } else {
       trace(addedObject.name + ", [not interested!]");
   }
}

【讨论】:

  • 该代码与 kaarto 相同。我再说一遍,我的主要影片剪辑是我在运行时加载的 swf 类,我需要获取子级的值。
  • 你为什么要声明为 const myMc 和 addedObject?。无论如何,代码是有缺陷的。 addedObject 永远存在,它是目标,它不可能不存在。同样“直接”没有任何意义,因为 ADDED 事件气泡,它可能是一个孩子的孩子。
  • 好吧,如果目标不是MovieClip,那么e.target as MovieClip == null,就是与as的类型转换规则。直接确实有意义,因为我检查 myMc 是否是 addedObject 的确切父级。所以如果添加得更深,它就不会通过检查。
  • 另外,“有缺陷”是什么意思?由于我没有您加载的影片剪辑,我什至无法预测发生了什么。我想您必须发布一些跟踪结果或其他内容。
  • 为您提供了另外一个变体:既然您知道所有您感兴趣的名称,只需保留这些名称的数组,然后添加它们即可。 if (interestingNames.indexOf(e.target.name) > -1) { trace("YAY! Found " + e.target.name); }
猜你喜欢
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多