public class Greeter extends MovieClip
{
public function Greeter()
{
addEventListener(Event.ADDED_TO_STAGE, go);
}
private function go(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, go);
var _root:MovieClip = parent.parent as MovieClip;
var sp:Sprite = new Sprite();
// Desenhando com um objeto graphics
var g:Graphics = sp.graphics;
g.beginFill(0xFF0000, 1);
g.drawRect(10, 10, 300, 200);
g.endFill();
_root.addChild(sp);
}
}
mxml文件:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1024" minHeight="768"
creationComplete="initApp()">
<fx:Script>
<![CDATA[
public function initApp():void
{
var greeter:Greeter = new Greeter();
}
]]>
</fx:Script>
</s:Application>
- 解答:
使用addElement添加到舞台并扩展spark.core.SpriteVisualElement。
答案 0 :(得分:2)
您需要在舞台上添加欢迎
public function initApp():void
{
var greeter = new Greeter();
addChild( greeter );
}
调用addChild(greeter)时,它将触发您在Greeter构造函数中添加的事件侦听器,并调用绘制矩形的go方法。 请注意,您不需要这样做:_root.addChild(sp); 由于greeter被添加到initApp方法的阶段,你可以通过go方法中的addChild(sp)将sp添加到greeter。
答案 1 :(得分:1)
你为什么这样做?
var _root:MovieClip = parent.parent as MovieClip;
...
_root.addChild(sp);
这种显示列表管理方式让人联想到ActionScript 2对封装和多态性的宽容。
您的Greeter对象不应该以这种方式尝试访问显示列表上的项目。 Greeter应该将此矩形添加为其自身的子项,并且没有理由在此上下文中使用MovieClip对象,Sprites更合适。
要回答您的问题并修复有关addChild的结果答案,使用Spark应用程序代替mx:Application是addChild不是有效函数的原因。 Spark应用程序实例必须包含一种新的显示对象,如上所述,可以是SpriteVisualElement的扩展,也可以是实现IVisualElement中定义的函数的对象。
如果您没有利用Spark的布局和外观功能,只需更改为使用Flex 3 / Halo / mx应用程序标记,您就可以使用扩展Sprite而不是SpriteVisualElement的标准对象按预期添加theChild()。
答案 2 :(得分:-1)
您只是在调用构造函数。
在构造函数中添加一个事件侦听器。
您在代码中的任何位置绘制矩形。