Диспетчерское событие не срабатывает :( - PullRequest
0 голосов
/ 19 мая 2011
package com.fladev.background
{
    //import all classes
    import caurina.transitions.Tweener;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.display.DisplayObject;
    import flash.display.StageAlign;
    import flash.display.StageDisplayState;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.FullScreenEvent;
    import flash.events.MouseEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;


public class MainClass extends Sprite 
{
    //create variables
    private var loaderMenu:Loader;
    private var loaderNames:Array = new Array ();
    private var loaderContents:Array = new Array ();
    private var loaderSlide:Loader;
    private var swfDisplayObject:DisplayObject;
    private var swfComObject:Object;
    private var xmlLoader:URLLoader = new URLLoader(); 
    private var xmlSlideLoader:URLLoader = new URLLoader();

    public function MainClass() 
    {
        stage.align = StageAlign.TOP_LEFT;
        stage.scaleMode = StageScaleMode.NO_SCALE;          
        stage.addEventListener(Event.RESIZE, stageResize);

        xmlLoader.addEventListener(Event.COMPLETE, showXML);
        xmlLoader.load(new URLRequest("navigation.xml"));

        //xmlSlideLoader.addEventListener(Event.COMPLETE, showSlideXML);
        //xmlSlideLoader.load(new URLRequest("slides.xml"));
    }

    function showXML(e:Event):void 
    {
        XML.ignoreWhitespace = true;

        var menuBtns:XML = new XML(e.target.data);
        var i:Number = 0;

        for ( i = 0; i < menuBtns.navItem.length(); i++ )
        {
            loaderMenu = new Loader();
            loaderMenu.name = menuBtns.navItem[i].name ;
            loaderMenu.load(new URLRequest(menuBtns.navItem[i].swfURL));
            loaderMenu.contentLoaderInfo.addEventListener(Event.COMPLETE, createSwfObjects);
        }
    }

    private function createSwfObjects(event:Event):void
    {
        var swfContent = event.currentTarget.content as MovieClip ;
        var swfName = event.currentTarget.loader ;

        navigationContainer.addChild(event.target.loader);
        showImage(swfContent);

        if ( swfName.name == 'topNavigation' )
        {
            swfContent.addEventListener("clickHandle",topNavigationClickHandler);
        }
    }

    private function topNavigationClickHandler():void
    {
        trace('Back to root');
    }

    private function showImage(navigationItem):void 
    {
        try
            {                       
                navigationItem.alpha = 0;
                Tweener.addTween(navigationItem, { alpha:1, time:1, transition:"easeOutSine" } );               
                navigationItem.smoothing = true;                        

            } catch (e:Error) { trace('Error no tweening'); };

        stageResize();
    }

    private function stageResize(e:Event=null):void
    {
        var centerImages:Array = new Array ( contentContainer, navigationContainer, backgroundImage ) ;

        backgroundImage.x = 0;
        backgroundImage.y = 0;
        backgroundImage.scaleX = backgroundImage.scaleY = 1;            

        if ((stage.stageHeight / stage.stageWidth) < backgroundImage.height / backgroundImage.width) {
            backgroundImage.width = stage.stageWidth;
            backgroundImage.scaleY = backgroundImage.scaleX;
        } else {
            backgroundImage.height = stage.stageHeight;             
            backgroundImage.scaleX = backgroundImage.scaleY;
        }

        for each ( var centered:MovieClip in centerImages )
        {
            centered.x = stage.stageWidth / 2 - centered.width / 2;
            centered.y = stage.stageHeight / 2 - centered.height / 2;   
        }
    }
}   
}

Это мой код для main.as.

А вот мой код для моего загруженного SWF на основной линии.

addEventListener(Event.ADDED_TO_STAGE, init);

function init(event:Event):void 
{
    trace('try dispatch');
    dispatchEvent(new Event("clickHandle",true));
}

Попробуйте диспетчеризация работает, но она работаетНе возвращайся на главную, чтобы запустить «Назад к корню».Есть идеи?

thx!

1 Ответ

1 голос
/ 19 мая 2011

Пока все события отправки видеоклипов добавляются в список отображения, это должно работать. Это заставляет меня думать, что, возможно, добавляемый слушатель событий не работает. Попробуйте добавить оператор трассировки в блок кода, как показано ниже:

if ( swfName.name == 'topNavigation' )
{
     trace("adding listener");
     swfContent.addEventListener("clickHandle",topNavigationClickHandler);
}

Я ожидаю, что это если условие не выполняется, и, следовательно, ваш слушатель никогда не создается. Кроме того, вам нужно добавить параметр функции в метод обратного вызова «topNavigationClickHandler», чтобы принять событие в качестве параметра обратного вызова. Вы этого не сделали, и это ошибка, которая будет выдана во время выполнения, когда событие получено и отправлено в метод обратного вызова. Вы еще не видели этого, потому что вашему слушателю никогда не приходилось вызывать обратный вызов. Поэтому вам придется исправить этот код так:

private function topNavigationClickHandler(e:Event):void
{
    trace('Back to root');
}

Также я просто хочу добавить, что ваше условие if при настройке этого прослушивателя выглядит несколько избыточным, поскольку вы уже знаете, что ожидаете навигационный SWF, поскольку вы явно загружаете его. Также я не верю, что свойство name будет установлено так. Обычно имя задается только в среде IDE перед компиляцией, а если нет, оно генерируется динамически во время выполнения. Что может быть более полезным, так это проверить URL загруженного SWF-файла, чтобы узнать, содержит ли он «topNavigation» или как там его имя. Вы можете сделать это так:

var swfUrl:String = myLoader.contentLoaderInfo.url;
if (swfUrl.search("topNavigation") != -1){
   //Match found, add listener for navigation
}
...