ActionScript-如何防止触发多余的REMOVED_FROM_STAGE和ADDED_TO_STAGE

ActionScript-如何防止触发多余的REMOVED_FROM_STAGE和ADDED_TO_STAGE

虐人心 发布于 2017-05-04 字数 259 浏览 1218 回复 1

一个显示对象A处于显示列表中,将它addChild进另一个在显示列表中的容器时A会触发REMOVED_FROM_STAGE和ADDED_TO_STAGE事件,对于我们来说它没有离开过显示列表,不应该触发这两个的事件,在做类似激活、休眠机制的时候会造成麻烦,产生额外的调用。有没有好的解决办法呢?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

想挽留 2017-10-24 1 楼

暂时先用变量记录的方式避免该问题

package org.superkaka.kakalib.behavior

{
import flash.display.DisplayObject;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
import org.superkaka.kakalib.interfaces.IActiveSleep;
/**
* 为目标添加被加入显示列表时激活和移出显示列表时休眠的行为
* 解决了使用传统的 REMOVED_FROM_STAGE 事件时如果目标从一个容器添加进另一个容器但实际并没有离开舞台的情况下会意外触发事件的问题
* @author kaka
*/
public class ActiveSleepBehavior extends DisplayObjectBehavior
{

protected var isSleep:Boolean;

protected var asTarget:IActiveSleep;

public function ActiveSleepBehavior(target:IActiveSleep):void
{

super(target as DisplayObject);

}

override protected function init():void
{

asTarget = target as IActiveSleep;

}

override public function start():void
{

isSleep = displayObject.stage == null;

if (isSleep)
asTarget.sleep();
else
asTarget.active();

displayObject.addEventListener(Event.ADDED_TO_STAGE, showHandler);

displayObject.addEventListener(Event.REMOVED_FROM_STAGE, hideHandler);

}

override public function stop():void
{
displayObject.removeEventListener(Event.ADDED_TO_STAGE, showHandler);

displayObject.removeEventListener(Event.REMOVED_FROM_STAGE, hideHandler);
}

/**
* 添加到显示列表
* @param evt
*/
private function showHandler(evt:Event):void
{

displayObject.removeEventListener(Event.EXIT_FRAME, doSleep);

if (!isSleep) return;

isSleep = false;

asTarget.active();

}

/**
* 从显示列表移除
* @param evt
*/
private function hideHandler(evt:Event):void
{

displayObject.addEventListener(Event.EXIT_FRAME, doSleep);

}

private function doSleep(evt:Event):void
{

if (isSleep) return;

displayObject.removeEventListener(Event.EXIT_FRAME, doSleep);

isSleep = true;

if (displayObject.stage != null) throw new Error();//本行在测试一段时间没问题之后删除

asTarget.sleep();

}

}

}