2008-10-31 98 views
4

我是一個長期使用ActionScript 2的用戶,現在開始使用ActionScript 3.我缺少的一件事是複製AS2的MovieClip.onReleaseOutside功能的簡單方法。實現這個事件幾乎總是有必要的,否則你會得到一些有趣的錯誤,比如閃光燈認爲你的鼠標真的彈起來了。在AS3中最簡單的onReleaseOutside實現?

根據AS2 to AS3 Migration Guide,我應該使用flash.display.InteractiveObject.setCapture()這個,但它不存在,據我所知。我猜這個文件已經過時或不正確。我發現如何複製此功能在網絡上的幾個職位,但他們要麼有自己的問題:

  • This one觸發onReleaseOutside在即使沒有相應的onPress事件。
  • This one看起來效率很低,每次在應用程序內部的任何位置單擊鼠標時,都會添加和刪除事件偵聽器。

必須有一個更簡單的方法,不要告訴我Adobe重寫Actionscript時忘了這個嗎?

示例AS2代碼:

// Assume myMC is a simple square or something on the stage 

myMC.onPress = function() { 
    this._rotation = 45; 
} 

myMC.onRelease = myMC.onReleaseOutside = function() { 
    this._rotation = 0; 
} 

沒有onReleaseOutside在處理程序,如果你在squre壓下去,拖你的鼠標在它之外,並釋放鼠標,那麼方不會取消旋轉,並似乎卡住了。

+0

我從AS2移到了Flex 3,所以沒有遇到這個問題。所以雖然我不能提供答案,但請注意這個問題。乾杯。 – 2008-10-31 22:46:38

+0

如果您在舞臺的空白區域釋放,這將會很好。如果你在舞臺上釋放一個未知的精靈,該怎麼辦?或者如果有多個按鈕需要檢查releaseOutside? – 2012-01-12 21:47:57

回答

10

簡單,萬無一失:

button.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
button.addEventListener(MouseEvent.MOUSE_UP, buttonMouseUpHandler); // * 

function mouseDownHandler(event : MouseEvent) : void { 
    trace("onPress"); 
    // this will catch the event anywhere 
    event.target.stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 

function buttonMouseUpHandler(event : MouseEvent) : void { 
    trace("onRelease"); 
    // don't bubble up, which would trigger the mouse up on the stage 
    event.stopImmediatePropagation(); 
} 

function mouseUpHandler(event : MouseEvent) : void { 
    trace("onReleaseOutside"); 
    event.target.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 

如果你不關心(例如用拖動的項目函數)onRelease和onReleaseOutside在之間的區別,你的跳過按鈕本身鼠標向上監聽器(在這裏評論星號)。

3

有你看着這個事件:

flash.events.Event.MOUSE_LEAVE 



從文檔:

由Stage對象進行調度當鼠標指針移出舞臺區域。 Event.MOUSE_LEAVE常量定義mouseLeave事件對象的type屬性的值。

如果你只關心它會解決你的問題是否與用戶的鼠標,如果離開了舞臺,而不僅僅是特定的影片剪輯之外。

3

root.addEventListener(MouseEvent.UP,onMouseReleaseOutside);

你當然定義onMouseReleaseOutside。基本上任何MouseEvent.UP(一個鼠標釋放)發生在你的按鈕(或mc)之外,都會觸發舞臺而不是你的按鈕。這是我通常抓住它的方式。