2010-01-05 56 views
2

我正在開發一個網站,其中包含從上到下覆蓋整個舞臺的導航項目(請參閱下面的更改圖像),用戶使用鼠標輕鬆退出舞臺,不會觸發「關閉」所述導航項目所需的MouseEvent.MOUSE_OUT事件。當鼠標離開舞臺時,AS3:MOUSE_OUT不會觸發

我是否應該使用Event.MOUSE_LEAVE來檢測鼠標何時離開舞臺,並關閉所有啓用的導航項?這就是我一直在努力做的事情,但是從我的聽衆那裏得到任何輸出都有困難。有任何想法嗎?

alt text http://marcysutton.com/blog/wp-content/uploads/2010/01/redpropeller.png

對於在Flash IDE中的MovieClip關聯的類,這是正確的語法註冊一個Event.MOUSE_LEAVE監聽器?無論我做什麼,它都不會做任何事情。是否需要在瀏覽器中嵌入電影才能觸發該事件?

this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener); 

這裏是我MainNav.as類:

package com.redpropeller { 

import com.greensock.*; 
import com.greensock.plugins.*; 
import flash.display.*; 
import flash.text.*; 
import flash.events.*; 

public class MainNav extends MovieClip { // MainNav is a movieclip in the IDE 

    public var colors:Array; 

    public function MainNav():void { 
     colors = new Array(0xee3124, 0xc72a1f, 0xa62c24, 0x912923, 0x7e221c); 
     TweenPlugin.activate([TintPlugin]); 

     // trying to target stage through this object 
     this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener); 

     for(var i:Number=0; i<this.numChildren; i++){ 
      var n = this.getChildAt(i); 
      n.useHandCursor = true; 
      n.buttonMode = true; 

      n.addEventListener(MouseEvent.MOUSE_OVER, navBtnOn); 
      n.addEventListener(MouseEvent.MOUSE_OUT, navBtnOff); 
     } 
    } 
    public function mouseLeaveListener(e:Event):void { 
     trace('mouseleave'); // nothing ever happens 

    } 
    private function navBtnOn(e:MouseEvent):void { 
     TweenLite.to(e.currentTarget.bar_mc, 0.01, {tint:0x333333}); 
    } 
    private function navBtnOff(e:MouseEvent):void { 
     TweenLite.to(e.currentTarget.bar_mc, 0.01, 
      {tint:uint(colors[this.getChildIndex(MovieClip(e.currentTarget))])}); 
      // changes color back to specific tint 
    } 
} 

} 
+0

那是什麼圖形?您的託管服務是否恢復了一些隨機照片? – jedierikb 2010-01-12 17:10:31

+0

在網站發佈之前發佈實際設計讓我覺得很奇怪....用更好的圖形取代。 – 2010-05-21 17:45:17

回答

0

您正試圖在構造函數中爲MOUSE_LEAVE創建事件偵聽器。如果MainNav沒有通過addChild()方法添加到舞臺上,那麼stage對象可能還不存在。如果MainNav已經在設計階段進入舞臺,那麼舞臺仍然有可能不會立即可用。對於繼承DisplayObject(MovieClip,Sprite等)的類,我只在構造函數中做了一件事:設置一個Event.ADDED_TO_STAGE偵聽器。當通過父容器的addChild()將對象添加到舞臺的顯示堆棧時,或者在設計時對象已經在舞臺上時,該監聽器將觸發init()方法。當我調用init()方法時,我知道stage屬性將可用。

在你的構造函數中,stage可能不存在於實例中,但是你應該得到一個運行時錯誤。不過,您在舞臺之前使用了「this」關鍵字。當你在繼承自Object的類中使用'this'(你的類通過MovieClip-> DisplayObject-> EventDispatcher-> Object)時,如果該屬性不存在,編譯器不會拋出錯誤,因爲它試圖創建財產作爲'this'的成員。發生這種情況是因爲Object類是動態的,這意味着可以隨時創建新屬性,而無需在頭中聲明它們爲類變量 - 只需在使用該動態屬性時使用「this」關鍵字即可。當你使用this.stage時,如果stage不存在,該類爲你創建屬性階段。然而,這不是你想要的階段,所以這個監聽器只是附着在一個空的對象上,它什麼都不做。在引用階段時嘗試刪除「this」,我相信你會在某個時候看到錯誤。一般來說,對屬性使用'this'是不好的做法,因爲編譯器會忽略該屬性的類型錯誤。

您在上面的一條評論中提到MOUSE_LEAVE在IDE中不起作用,但我從CS4測試了它,它確實有效。與瀏覽器的Flash Player插件相比,您可能正在目睹IDE的Flash Player的性能差異。在某些情況下,如果SWF快速加載並且舞臺立即可用,則舞臺事件偵聽器將從構造函數中工作,但它不可靠。將該偵聽器移動到在ADDED_TO_STAGE事件之後調用的init()方法,並且不要使用「this」關鍵字。

1

答:Event.MOUSE_LEAVE不會在IDE火。當電影嵌入HTML頁面時,它工作正常。謝謝你的幫助!

+0

您使用的是什麼版本的Flash。我在CS3和CS4中測試過,它在IDE中對我來說工作的很好。 – sberry 2010-01-07 16:49:02

+0

Flash CS3 ...但即使在一個純粹的瑞士法郎和一個簡單的文檔類,我沒有輸出。但是,一旦我將我的文件上傳到網絡,我的MouseEvent.MOUSE_OUT事件觸發得很好,無需使用Event.MOUSE_LEAVE。 – 2010-01-07 17:45:48

+0

我可以驗證這在IDE中也不適用於我。我在OS X 10.6.3上使用CS4 10.0.2 – 2010-05-26 18:53:10

相關問題