Flash AS3,挂起你的事件
有没有人有参与事件的经验。 所以我们可以修改它们的行为而不改变它的初始值 假设我们想修改一组菜单按钮的每次点击行为,如果你点击它们,你会等待30秒,然后调用最初的回调 我正在进行一个项目,该项目将在现有的Air应用程序之上创建一个层,该层将允许以允许小额支付的方式管理构建,以实现对某些功能的完全访问Flash AS3,挂起你的事件,flash,actionscript-3,events,hook,Flash,Actionscript 3,Events,Hook,有没有人有参与事件的经验。 所以我们可以修改它们的行为而不改变它的初始值 假设我们想修改一组菜单按钮的每次点击行为,如果你点击它们,你会等待30秒,然后调用最初的回调 我正在进行一个项目,该项目将在现有的Air应用程序之上创建一个层,该层将允许以允许小额支付的方式管理构建,以实现对某些功能的完全访问 我的猜测是使用钩子来捕获事件,所以我们不必编辑应用程序,只需扩展它。(如果我错了,请纠正我:-)我想你可以这样做:为单击事件使用事件处理程序,并使用计时器等待你想要的时间或调用doe-some-pr
我的猜测是使用钩子来捕获事件,所以我们不必编辑应用程序,只需扩展它。(如果我错了,请纠正我:-)我想你可以这样做:为
单击事件使用事件处理程序,并使用计时器等待你想要的时间或调用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
}
您可能需要侦听更多类型的事件(键盘事件),但大多数代码都可以变得足够通用以包含它们
希望这会对你的长篇大论有所帮助,并表示歉意。是的,应该可以修改一下
您可以在事件到达其原始目标之前停止它,克隆它,然后