2011-05-19 60 views
0
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.調度事件不會觸發:(

在這裏,我的代碼爲我的maintimeline加載的SWF代碼。

addEventListener(Event.ADDED_TO_STAGE, init); 

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

嘗試調度工作,但是它沒有得到回主火起來「回到根本」。 任何想法?

THX!

回答

1

只要所有的影片剪輯派發事件被添加到顯示列表,這應該工作。這讓我認爲,可能添加的事件監聽器不起作用。嘗試添加跟蹤語句的代碼塊,如下圖所示:

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

我預計這種情況如果出現故障,並因此永遠不會創建你的聽衆。另外,您需要爲回調方法「topNavigationClickHandler」添加一個函數參數,以接受該事件作爲回調參數。您沒有這樣做,並且這是在事件被接收並分派到回調方法時將在運行時拋出的錯誤。你還沒有看到這一點,因爲你的聽衆從來不需要調用回調函數。所以,你會必須解決,像這樣的代碼:

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

此外,我只想補充一點,如果你設置此監聽狀態似乎有點多餘,因爲你已經知道你期待的導航SWF,因爲你明確地加載它。我也不相信名稱屬性會設置爲這樣。通常,這個名稱只在編譯之前在IDE內部設置,如果不是,它會在運行時動態生成。更有用的是檢查加載的SWF的URL以查看它是否包含「topNavigation」或任何swf名稱。你可以這樣做:

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

Thx for you reply。我只是給你的第一個代碼部分添加了一個跟蹤,但它的工作正常。它被追蹤「添加監聽器」,但「clickHandle」仍然沒有啓動。我也試着添加事件的mouse.CLICK調用函數:\t \t '私有函數testClick(事件:MouseEvent)方法 \t \t { \t \t \t跟蹤( '點擊註冊'); \t \t \t event.currentTarget.init(null); \t \t \t event.currentTarget.addEventListener(「clickHandle」,topNavigationClickHandler); \t} 但是,這是工作的前2行,跟蹤和初始化函數我加載的瑞士法郎,但不是「clickHandle」再次... – 1stIssue 2011-05-19 10:56:59

+0

在你粘貼上面的代碼,你打電話給init方法將偵聽器添加到對象之前。這會在您準備好接收它之前使事件發送。另外,你是否將這個加載的swf添加到舞臺上?如果不是,並且您只是想按照以下所示進行測試,請嘗試將事件冒泡關閉,以防萬一通過嘗試將顯示列表傳遞給直接監聽器。如果未添加對象,則它沒有父對象,因此與顯示列表斷開連接並冒泡將失敗。 – 2011-05-19 11:02:57

+0

哦,男人,解決了錯誤。因爲詢問另一個人,他告訴我試試這個:stage.dispatchEvent(new Event(「clickHandle」,true));在我加載的SWF中。現在我嘗試了你的遺漏(事件:事件)並刪除了舞臺,所以它說:dispatchEvent(new Event(「clickHandle」,true));現在它似乎工作:)所以,據我可以想象,它導致了錯誤,因爲缺少的事件:事件! :) 非常感謝 ! :) – 1stIssue 2011-05-19 12:08:48