2011-10-10 69 views
1

當我開始使用Adobe AIR爲iOS/Android開發移動應用程序時,我遇到了奇怪的問題(或功能)。AS3:startDrag觸發mouse_up/mouse_click事件

如果您使用MOUSE_DOWN/MOUSE_UP事件處理程序中的startDrag/stopDrag創建Sprite並使其可拖動,則一切正常。但是,如果將另一個偵聽器MOUSE_CLICK添加到同一個對象,它將開始與MOUSE_UP一起觸發。從邏輯上講,這種行爲是可以的。我需要的是防止當用戶拖動Sprite(startDrag)時觸發MOUSE_CLICK處理程序,並且當用戶沒有拖動Sprite時我需要觸發它。

我想創建的是一個可拖動的小縮略圖欄,點擊具體縮略圖後,它的大版本/圖像打開。這實際上是不可能的,因爲每次用戶拖動整個縮略圖欄時,MOUSE_CLICK都會觸發,因此每次都會打開大圖像。

回答

2

您需要添加一個標誌,指定您是否處於拖動模式。如果用戶按下一段時間(例如300毫秒),則設置標誌並且隨後忽略結束MOUSE_CLICK事件。請注意,我們在MOUSE_UP處理程序中使用1毫秒timoute來讓標誌重置之前的事件完成。還要注意,你並不需要點擊處理程序;您可以在MOUSE_UP處理程序中調用僞點擊處理程序,如果dragInProgress==false

private var dragTime:int = 300; 
private var dragInProgress:Boolean = false; 
private var dragInProgressInt:int; 

function handleMouseDown(event:MouseEvent):void 
{ 
    dragInProgressInt = setTimeout(function():void 
    { 
     dragInProgress = true; 
    }, dragTime); 

    // Start drag, etc. 
} 

function handleMouseUp(event:MouseEvent):void 
{ 
    clearTimeout(dragInProgressInt); 
    setTimeout(function():void 
    { 
     dragInProgress = false; 
    }, 1); 

    // End drag, etc. 
} 

function handleMouseClick(event:MouseEvent):void 
{ 
    if (!dragInProgress) 
    { 
     // Handle the real click 
    } 
} 

合乎邏輯的下一步是等待, 300毫秒之前,甚至開始拖動首先;當所有用戶想要點擊時,這將避免不必要的拖動操作的開始/停止。

編輯:更正超時名稱引用中的錯誤。

+0

謝謝。這可能會訣竅。首先,我想創建自己的MOUSE_UP/_MOVE/_DOWN處理程序(不使用startDrag/stopDrag)。我想聽到其他人的想法:) – MaRmAR

+0

實際上這可以工作,但有時用戶只是不停地拖動欄,所以點擊事件觸發,因爲他們在閱讀時不斷觸摸屏幕。這會導致CLICK事件的意外火災:( – MaRmAR

+0

@MaRmAR:如果您直接複製/粘貼了該代碼,則出現錯誤。對超時的引用不正確;我已修復此問題。 –