0

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

因此,假设我们想要修改每次单击某组菜单按钮的行为,如果单击它们,您将在调用原始回调之前等待 30 秒。

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

我的猜测是使用挂钩来捕获您的事件,因此我们不必编辑我们的应用程序,只需扩展它即可。(如果我错了,请纠正我:-))我

4

3 回答 3

3

是的,这应该可以通过一些修改来实现。

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

如果您不知道 Flash 中显示列表(您可以看到的任何内容)中的事件如何工作,让我先解释一下。

当您单击一个按钮时,将触发 MouseEvent,它从捕获阶段开始,在舞台上开始按照注册侦听器时设置的优先级顺序调用为“CLICK”事件注册的所有事件侦听器。如果侦听器具有相同的优先级(默认值为 0),则以随机顺序调用(正确地按照它们注册的顺序)。一旦调用了舞台的所有侦听器,就会调用按钮祖先列表中的下一个 displayObject,并且同样的事情再次发生。这一直持续到允许鼠标事件的最里面的显示对象(可能是按钮内的文本字段标签)。捕获阶段到此结束,目标阶段开始。在目标阶段调用最内层对象上的所有侦听器。然后开始冒泡阶段,

应该注意的是,在闪存中,目标阶段是作为冒泡阶段的一部分处理的。

我们如何使用它?

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

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

function stageClick(e:MouseEvent):void
{
    e.stopImmediatePropagation();
}

这引发了其他一些问题,首先你不想为所有事情都这样做。

  • 一种解决方案是列出所有应该修改其事件的按钮,并使用 e.target 对其进行检查。
  • 另一种解决方案是让所有需要延迟的按钮实现一个接口(我们称之为 IButtonDelay)。然后简单检查 e.target 是否为 IButtondelay。
  • 第三种解决方案是仅侦听包含父项(如菜单栏)上的事件,因为无论如何您都不太可能在事件到达该父项之前使用该事件。

对于前两个解决方案,您应该阻止按钮子级的鼠标交互以简化检测(DisplayObjectContainer.mouseChildren = false)。无论您在这里选择什么,接下来您都必须使用简单的 Timer 进行延迟。然后在延迟后再次触发事件。

e.target.dispatchEvent(e.clone());

这引发了不延迟重新触发事件的问题。我的建议是触发从 MouseEvent 继承的事件对象,而不是简单的克隆。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
}

您可能需要侦听更多类型的事件(键盘事件),但大多数代码可以变得足够通用以包含它们。

希望对长期阅读有所帮助和抱歉。

于 2009-03-23T17:37:33.420 回答
2

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

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

于 2009-03-17T11:10:43.447 回答
0

在我的脑海中,我认为你可以这样做:对事件使用事件处理程序click并使用 aTimer等待只要你愿意或调用做一些处理,然后在后者完成时,调用对应于的操作click. _

或者,我有什么遗漏吗?

于 2009-03-17T11:04:20.357 回答