AS3,挂钩你的活动

时间:2009-03-17 09:58:01

标签: flash actionscript-3 events hook

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

因此,我们想要修改某些菜单按钮的每次点击的行为,如果单击这些按钮,则会在调用原始回调之前等待30秒。

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

我的猜测是使用挂钩捕获你的事件,所以我们不必编辑我们的应用程序,只需扩展它。 (纠正我,如果我错了:-))我

3 个答案:

答案 0 :(得分:3)

是的,通过一些修改,这应该是可行的。

除了对事件进行分析之外,您可以在它到达原始目标之前将其停止,克隆它,然后在延迟后重新启动克隆。

如果您不知道事件在flash中的工作方式(您可以看到的任何内容)如何工作,请让我先解释一下。

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

应该注意的是,在闪光灯中,目标相位作为起泡阶段的一部分进行处理。

我们如何使用它?

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

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)。 无论你在这里选择什么,接下来你都要用一个简单的计时器来延迟。然后在延迟之后再次发射事件。

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

这引发了不延迟被激活事件的问题。我的建议是反而触发一个继承自MouseEvent而不是简单克隆的事件对象。 MouseEvent非常易于复制,它只有一些属性。因此,当您第二次捕获它时,您可以检查它是正常的鼠标点击还是重复的。

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

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
}

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

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

答案 1 :(得分:2)

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

最简单的解决方案可能是在要阻止的按钮上添加另一个Sprite / Button - 这样您就不必更改应用程序,阻塞很简单。唯一的缺点是:原始按钮上的鼠标悬停行为无法正常工作,因为它不会发生任何鼠标事件。

答案 2 :(得分:0)

在我的脑海中,我认为你可以这样做:为click事件使用事件处理程序,并使用Timer等待你想要的OR调用做一些处理然后在完成后者时,调用与click对应的操作。

或者,有什么我想念的吗?