为什么不绘制这个矩形?

时间:2010-08-13 17:45:02

标签: actionscript-3 flash flex flash-builder mxml

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。

3 个答案:

答案 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)

您只是在调用构造函数。

在构造函数中添加一个事件侦听器。

您在代码中的任何位置绘制矩形。