2010-09-14 48 views
0

我正在編寫一個拖放應用程序,我可以抓住一個對象,然後將它放在不同的對象容器上。當我拖動對象(按住鼠標按鈕)並離開舞臺時,我仍然可以用鼠標控制對象......這不是我想要的。AS3 MOUSE_LEAVE問題

當鼠標離開舞臺時,我想失去對象的控制權。

我試圖在MOUSE_LEAVE事件中刪除MOUSE_DOWN的事件偵聽器,但沒有任何事件。

我也嘗試在MOUSE_LEAVE事件上調度MOUSE_UP事件,但它不起作用...只有當我手動釋放鼠標按鈕時它才起作用。

當用戶將鼠標從屏幕上移開但他仍在按下鼠標按鈕時,是否有任何方法可以覆蓋MOUSE_DOWN事件? 任何建議?

在此先感謝

回答

1

舞臺實際上是在監聽MOUSE_LEAVE事件嗎?在任何情況下,請查看這篇文章,它可以幫助: http://www.kirupa.com/developer/flashcs3/detecting_when_mouse_leaves_movie.htm

+0

是的,我添加了一個事件監聽器到舞臺上來聽一個MOUSE_LEAVE ... – Mirko 2010-09-15 09:36:24

+0

但是當我一直按下鼠標按鍵時它不會被觸發。 – Mirko 2010-09-15 09:39:29

+0

你是對的,在我給你的例子中是一樣的。你有沒有試過loxxy的解決方案?當鼠標移出界限時,它應該可以正常工作,調度MouseUp事件或獲取分派MouseLeave事件的階段 – PatrickS 2010-09-15 12:06:09

0

我相信你所談論的用戶留下閃光的內容完全用鼠標單擊,當他/她返回它繼續處理嗎?

我建議你跟蹤鼠標xy座標。當x或y分別等於舞臺寬度或高度時,設置觸發鼠標向上事件處理程序的條件。

+0

我試圖做這樣的事情,但如果我按住鼠標按鈕,則不會觸發MOUSE_UP事件。 ..我猜它是瞬間觸發的,然後是th e MOUSE_DOWN事件再次被觸發... – Mirko 2010-09-15 09:35:35

1

這裏有幾個棘手的陷阱,不要陷入:

一個奇怪的事情,在Chrome + Firefox中,不分派是MOUSE_LEAVE事件WMODEOPAQUETRANSPARENT。它只是不開火 - 鼠標向下或向上。

WINDOW它工作正常。那一個花了我很長時間才發現! GRR ... http://bugs.adobe.com/jira/browse/FP-892


第二,確保你使用Event的參數類型,請Event.MOUSE_LEAVE處理程序,而不是MouseEvent。如果您嘗試使用e:MouseEvent來處理MOUSE_LEAVE,則會出現一個您可能永遠不會看到的錯誤(除非您使用的是調試閃存播放器)。這是一個非常容易犯的錯誤,因爲你可能會指示所有其他處理程序採用相同的方法。

這裏是我做的:(剛從mouseLeave(e:Event)

stage.addEventListener(MouseEvent.MOUSE_MOVE, drag); 
stage.addEventListener(MouseEvent.MOUSE_UP, endDrag); 
stage.addEventListener(Event.DEACTIVATE, endDrag); 
stage.addEventListener(Event.MOUSE_LEAVE, mouseLeave); 

private function mouseLeave(e:Event):void 
{ 
    endDrag(new MouseEvent("MOUSE_LEAVE")); 
} 

public function endDrag(evt:MouseEvent):void 
{ 
    /// handle end drag 
} 
0

叫我主要endDrag當您將Flash影片之外的對象,該對象將觸發一個MOUSE_OUT事件時,可以監聽此事件,使用檢查變量如果對象被拖動,並且,如果是的話,派遣MOUSE_UP事件。

some_object.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
some_object.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
some_object.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler); 

private function mouseOutHandler(e:MouseEvent):void 
{ 
    if (isDragging) 
     e.target.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP)); 
} 

private function mouseDownHandler(e:MouseEvent):void 
{ 
    e.target.startDrag(); 
    isDragging = true; 
} 

private function mouseUpHandler(e:MouseEvent):void 
{ 
    e.target.stopDrag(); 
    isDragging = false; 
} 
+0

謝謝。無論如何,我放棄了一段時間以前Android的Flash開發;) – Mirko 2013-05-04 13:15:18

+0

好吧,也許這對其他人有用:) – zok 2013-05-08 19:15:18