重载事件处理程序可能吗?

时间:2010-01-20 16:33:54

标签: flex oop actionscript

我想将我的功能扩展到更好的设计,我可以将画布对象传递到哪里,所以我不必编写N个函数..我不确定如何正确地执行此操作我已经提出带有开关的天真设计,但即便如此,如果我添加另一个画布,我仍然需要为新画布编写新代码。

function fadeCanvasOut(event:TimerEvent):void
{ 
canvas1.alpha -= 0.1;
}

private function showForm():void
{
var myTimer:Timer = new Timer(20, 10);
myTimer.addEventListener("timer", fadeFormIn);
myTimer.start();        
}

我需要的是:

function fadeCanvasOut(event:TimerEvent, aCanvas:Canvas):void
{ 
aCanvas.alpha -= 0.1;
}

private function showForm(aCanvas:Canvas):void
{
var myTimer:Timer = new Timer(20, 10);
myTimer.addEventListener("timer", fadeFormIn(timerEvent, canvas1);
myTimer.start();        
}

如果有人可以请你开导我会很感激。

2 个答案:

答案 0 :(得分:3)

如果您使用的是ActionScript 2,那么我会考虑使用the Delegate class。它将允许您更改方法调用的范围。这会将您的代码更改为:

import mx.utils.Delegate;

function fadeCanvasOut(event:TimerEvent):void
{ 
    this.alpha -= 0.1;
}

private function showForm():void
{
    var myTimer:Timer = new Timer(20, 10);
    myTimer.addEventListener("timer", Delegate.create(canvas1, fadeCanvasOut);
    myTimer.start();        
}

如果您正在使用ActionScript 3,则代理现在已构建为该语言(它们删除了Delegate类,并使触发事件的元素成为函数调用的范围)。这意味着不再可以使用您使用委托类将范围更改为您想要的范围。所以你现在需要这样写:

function fadeCanvasOut(event:TimerEvent, aCanvas:Canvas):void
{ 
    aCanvas.alpha -= 0.1;
}

private function showForm():void
{
    var myTimer:Timer = new Timer(20, 10);
    myTimer.addEventListener("timer", function(event:TimerEvent):void {
        fadeCanvasOut(event, canvas1);
    });
    myTimer.start();        
}

答案 1 :(得分:0)

为此使用内部函数,因此将保留canvas参数的范围。

function fadeCanvasOut(event:TimerEvent, aCanvas:Canvas):void { 
  aCanvas.alpha -= 0.1;
}

private function showForm(aCanvas:Canvas):void {
  var myTimer:Timer = new Timer(20, 10);
  myTimer.addEventListener("timer", function(event:TimerEvent):void {
    fadeCanvasOut(aCanvas);
  });
  myTimer.start();        
}

旁注:如果要为alpha属性设置动画,可能需要查看Fade类。

相关问题