是的,我在这里看到了一些关于类似问题的话题,但我的问题不同了。我在FlashDevelop中设置了一个AIR项目并写了这个:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Main extends Sprite {
public function Main():void {
graphics.beginFill(0)
graphics.drawRect(0, 0, 100, 100)
graphics.endFill()
addEventListener(MouseEvent.CLICK, onEvt)
}
private function onEvt(e:MouseEvent):void {
trace("yahoo")
}
}
}
我编译了项目,点击黑色方块,什么也没发生。没有。然后我将所有这些代码移动到另一个类RealMain并将其作为子项添加:
public function Main():void {
addChild(new RealMain())
}
它有效。那么,为什么我的eventlistener不工作如果类是文档类?是的,我可以使用stage.addEventListener(),但为什么?
答案 0 :(得分:1)
尝试不使用Sprite的图形属性,但创建一个Shape,在其上绘制并将addChild()添加到Sprite中。我希望一个零孩子的Sprite表现为一个Shape,而形状本身就不能听事件。
public class Main extends Sprite {
public function Main():void {
var sh:Shape=new Shape();
sh.graphics.beginFill(0);
sh.graphics.drawRect(0, 0, 100, 100);
sh.graphics.endFill();
addChild(sh);
addEventListener(MouseEvent.CLICK, onEvt);
}
private function onEvt(e:MouseEvent):void {
trace("yahoo");
}
}
应该这样工作。
答案 1 :(得分:1)
addEventListener是EventDispatcher类的函数,需要调用EventDispatcher的实例。
Main的行为有点不同,因为它以静态方式调用。对于拥有Main的实例,我们必须做下面的工作(不是很优雅)
package {
import flash.display.Stage;
import flash.display.MovieClip;
public class Main extends MovieClip {
private static var _instance:Main = null;
public function Main() {
_instance = this;
}
public static function getInstance():Main { return _instance; }
public static function getStage():Stage { return getInstance().stage; }
}
}
addchild有助于创建一个通常的类。
答案 2 :(得分:-1)
文档类必须扩展MovieClip
而不是Sprite