当我开始使用Adobe AIR为iOS / Android开发移动应用程序时遇到了奇怪的问题(或功能)。
如果您使用MOUSE_DOWN / MOUSE_UP事件处理程序中的startDrag / stopDrag创建Sprite并使其可拖动,则一切正常。但是如果你将另一个监听器MOUSE_CLICK添加到同一个对象,它将与MOUSE_UP一起启动。从逻辑上讲,这种行为是可以的。我需要的是当用户拖动Sprite(startDrag)时阻止触发MOUSE_CLICK处理程序,当用户没有拖动Sprite时我需要触发它。
我正在尝试创建的是一个可拖动的小缩略图栏,点击具体缩略图后,其大版本/图像会打开。这实际上是不可能的,因为MOUSE_CLICK每次用户拖动整个缩略图栏时都会触发,因此每次都会打开大图像。
答案 0 :(得分: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毫秒;当所有用户想要点击时,这将避免不必要的启动/停止拖动操作。
编辑:修正了对超时名称的引用中的错误。