2012-08-16 107 views
2

我希望能夠區分影片剪輯是被拖動還是被點擊,並相應地執行不同的功能。問題在於startDrag由MOUSE_DOWN啓動,而由MOUSE_UP啓動stopDrag,並且CLICK事件每次都會觸發。我想要做的是,在點擊事件有條件的情況下,說一些類似「如果拖動== true {做點事情}」flash as3 - startDrag,stopDrag的事件監聽器?

我想我可以在mouse_up或mouse_down函數中設置一個標誌,但問題是鼠標點擊發生的同時,mouse_down發生。我需要能夠在實際的stopDrag()函數中設置標誌。我見過一個解決方案,包括設置超時 - 我想避免這種情況。有任何想法嗎?

回答

5

東西,我不得不處理許多倍。

我所做的是在捕獲階段創建一個額外的CLICK偵聽器(具有比您使用的任何其他更高的優先級),然後在該處理器上,如果您知道這是一個阻止事件傳播的拖動 - 那麼它不會觸及你的其他點擊處理程序。

你的情況

所以,如果你使用的startDrag(我用我自己的自定義拖動程序),你可以做這樣的事情:

function myFuntionThatStartsTheDrag() { 
    myDragObject.startDrag(); 
    myDragObject.addEventListener(MouseEvent.CLICK,suppressClick,true,9999,true); 
} 

function suppressClick(e:MouseEvent):void { 
    e.stopPropagation(); 
} 

function myFunctionThatStopsTheDrag() { 
    myDragObject.stopDrag(); 
    myDragObject.removeEventListener(MouseEvent.CLICK,suppressClick,true); 
} 
+0

真棒 - 不知道你可以設置優先級。不知道我是否理解捕獲階段(事件偵聽器的第三個參數)。 – mheavers 2012-08-16 20:19:45

+0

http://help.adobe.com/en_US/as3/mobile/WS948100b6829bd5a67edfb831266c0b5fc6-8000.html – BadFeelingAboutThis 2012-08-16 20:23:28

0

您可以使用dispatchEvent來創建您自己的自定義偵聽器。

使用方法如下:

dispatchEvent(new Event("customEvent")); 

而且你可以把它像一個正常的事件:

addEventListener("customEvent", eventFunction); 
1

在的起點比較x和y的位置拖動與拖動結束時的x和y位置的拖動。如果mouseUp上的x和y位置等於mouseDown上的x和y位置,那麼您知道這是一次點擊 - 否則就是一次拖拽。一個非常簡單的例子:

var mouseDownX:int; 
var mouseDownY:int; 

var dragging:boolean; 

//... 

private function onMouseDown(event:MouseEvent):void { 
    mouseDownX = stage.mouseX; 
    mouseDownY = stage.mouseY; 
    //... 
} 

private function onMouseUp(event:MouseEvent):void { 
    if(mouseDownX == stage.mouseX && mouseDownY == stage.mouseY) { 
     dragging = false; 
    } else { 
     dragging = true; 
    } 

    if(dragging) { 
     //... 
    } 
} 

如果你這樣做,你可以刪除click監聽器,只需要處理mouseUp中的所有內容。

即使x和y不完全相等,但是偏離了幾個像素(因爲點擊並不總是完美的上下),您可能需要添加一些容差來將mouseUp視爲點擊,但上面的代碼應該做的大部分。