Flash AS3,挂起你的事件

Flash AS3,挂起你的事件,flash,actionscript-3,events,hook,Flash,Actionscript 3,Events,Hook,有没有人有参与事件的经验。 所以我们可以修改它们的行为而不改变它的初始值 假设我们想修改一组菜单按钮的每次点击行为,如果你点击它们,你会等待30秒,然后调用最初的回调 我正在进行一个项目,该项目将在现有的Air应用程序之上创建一个层,该层将允许以允许小额支付的方式管理构建,以实现对某些功能的完全访问 我的猜测是使用钩子来捕获事件,所以我们不必编辑应用程序,只需扩展它。(如果我错了,请纠正我:-)我想你可以这样做:为单击事件使用事件处理程序,并使用计时器等待你想要的时间或调用doe-some-pr

有没有人有参与事件的经验。 所以我们可以修改它们的行为而不改变它的初始值

假设我们想修改一组菜单按钮的每次点击行为,如果你点击它们,你会等待30秒,然后调用最初的回调

我正在进行一个项目,该项目将在现有的Air应用程序之上创建一个层,该层将允许以允许小额支付的方式管理构建,以实现对某些功能的完全访问


我的猜测是使用钩子来捕获事件,所以我们不必编辑应用程序,只需扩展它。(如果我错了,请纠正我:-)我想你可以这样做:为
单击
事件使用事件处理程序,并使用
计时器
等待你想要的时间或调用doe-some-processing,然后在后者完成后,调用与
单击
对应的操作


或者,我有什么遗漏吗

在我的脑子里,我想你可以这样做:使用
点击
事件的事件处理程序,使用
计时器
等待你想要的时间,或者调用dosoprocessing,然后在后者完成后,调用与
点击
对应的操作


或者,我有什么遗漏吗

我认为,在不实际更改应用程序的情况下,您无法以这种方式更改事件系统(如果您可以更改应用程序,那么定制一个启用此行为的按钮并不难)


最简单的解决方案可能是在您要阻止的按钮的顶部添加另一个Sprite/按钮——这样您就不必对应用程序进行太多更改,而且阻止也很简单。唯一的缺点:原始按钮上的鼠标悬停行为将不起作用,因为它不会获得任何鼠标事件。

我认为,在不实际更改应用程序的情况下,您无法以这种方式更改事件系统(如果您可以更改应用程序,则制作一个启用此行为的自定义按钮并不难)


最简单的解决方案可能是在您要阻止的按钮的顶部添加另一个Sprite/按钮——这样您就不必对应用程序进行太多更改,而且阻止也很简单。唯一的缺点:原始按钮上的鼠标悬停行为将不起作用,因为它不会获取任何鼠标事件。

是的,经过一些修改后应该可以

您可以在事件到达原始目标之前停止它,克隆它,然后在延迟后重新填充克隆,而不是处理该事件

e.target.dispatchEvent(e.clone());
如果您不知道flash中的displaylist(您可以看到的任何内容)中的事件是如何工作的,请让我先解释一下

当您单击一个按钮时,MouseEvent将被触发,它将以捕获方式开始,从该阶段开始,按照注册侦听器时设置的优先级顺序调用为“click”事件注册的所有eventlisteners。如果侦听器具有相同的优先级(默认值为0),则以随机顺序调用(正确地说是它们注册的顺序)。 一旦调用了stage的所有侦听器,就会调用按钮列表中的下一个displayObject,同样的事情再次发生。 这将一直延续到最内部的displayobject,它允许鼠标事件(可以是按钮内的textfield标签)。 在这里,捕获阶段结束,目标阶段开始。 在目标阶段调用最内层对象上的所有侦听器。 然后进入“泡泡”阶段,所有的听众都会以与之前相同的方式(但是由内而外)拜访父母和祖父母

应注意的是,在闪蒸过程中,目标相作为鼓泡相的一部分进行处理

我们如何使用这个呢

当您注册和事件侦听器时,您指定了阶段和优先级。默认值为冒泡阶段和优先级0。因此,如果我们使用priority int.MAX_值在捕获阶段的stage上注册一个click事件监听器,我们将在任何其他监听器之前获得该事件,可能除了另一个相同的监听器。 以下代码将阻止其他侦听器注册单击事件

stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE);

function stageClick(e:MouseEvent):void
{
    e.stopImmediatePropagation();
}
这会引发一些其他问题,首先,你不想为所有事情都这么做

  • 一个解决办法是有一个 应具有的所有按钮的列表 他们的事件被修改,并且正在检查 用e.target来对付它
  • 另一个解决办法是拥有所有的人 需要延迟的按钮 实现一个接口(让我们调用它 伊布通德雷)。然后简单检查一下 如果e.target是IButtondelay
  • 第三个解决办法是只使用 在容器上侦听事件 父项(如菜单栏),因为它是 您不太可能使用该事件 在它到达父级之前
对于前两种解决方案,应防止按钮子项的鼠标交互,以简化检测(DisplayObjectContainer.mouseChildren=false)。 不管你在这里选择什么,接下来你必须用一个简单的计时器来延迟。然后在延迟后再次触发事件

e.target.dispatchEvent(e.clone());
这就产生了不延迟refired事件的问题。我的建议是触发从MouseeEvent继承的事件对象,而不是简单的克隆。MouseEvent很容易复制,它只有几个属性。因此,当您第二次捕获它时,您可以检查它是正常的鼠标单击还是重复的鼠标单击

使用带有按钮的解决方案,它将类似于:

stage.addEventListener(MouseEvent.CLICK, stageClick, true, int.MAX_VALUE);

function stageClick(e:MouseEvent):void
{
    if(e.target is IDelayButton && !e is DelayedMouseEvent)
    {
        e.stopImmediatePropagation();
        DelayEvent(e);
    }
}

function DelayEvent(e:MouseEvent):void
{
    //You code for the delaying, cloning and refiring the event here
}
您可能需要侦听更多类型的事件(键盘事件),但大多数代码都可以变得足够通用以包含它们


希望这会对你的长篇大论有所帮助,并表示歉意。

是的,应该可以修改一下

您可以在事件到达其原始目标之前停止它,克隆它,然后