Apache flex AdobeFlexSpark组图形在addEventListener上消失

Apache flex AdobeFlexSpark组图形在addEventListener上消失,apache-flex,graphics,adobe,addeventlistener,flex-spark,Apache Flex,Graphics,Adobe,Addeventlistener,Flex Spark,创建简单的Flex 4.6应用程序时,creationComplete处理程序如下所示: protected function creationCompleteHandler(event:FlexEvent):void { var groupVisible : Group = new Group(); groupVisible.graphics.beginFill(0xff0000); groupVisible.graphics.drawCircle(100, 100,

创建简单的Flex 4.6应用程序时,creationComplete处理程序如下所示:

protected function creationCompleteHandler(event:FlexEvent):void {
    var groupVisible : Group = new Group();
    groupVisible.graphics.beginFill(0xff0000);
    groupVisible.graphics.drawCircle(100, 100, 50);
    groupVisible.graphics.endFill();
    addElement(groupVisible);

    var groupInvisible : Group = new Group();
    groupInvisible.graphics.beginFill(0x0000ff);
    groupInvisible.graphics.drawCircle(200, 100, 50);
    groupInvisible.graphics.endFill();
    addElement(groupInvisible);
    groupInvisible.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {trace("click");});
}
绘制第一个groupVisible.graphics内容(100100处的红色圆圈)。 未绘制第二组不可见图形内容(200、100处的蓝色圆圈)

这完全取决于添加的EventListener


有什么想法吗?

如果切换到SpriteVisualElement而不是组,则两个项目都会显示。另一方面,鼠标单击事件实际上将从Sprite/SpriteVisualElement发送,而不会从容器发送。由于Click事件冒泡,因此可以从组内的元素中调度它,并在组级别上侦听它。但是,graphics不会分派单击事件

无论如何,这里有一些代码:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            import spark.core.SpriteVisualElement;


            protected function onMouseClick(event:MouseEvent):void{
                trace('click');
            }

            override protected function createChildren():void{
                super.createChildren();
                var groupVisible :SpriteVisualElement = new SpriteVisualElement();

//              var groupVisible : Group = new Group();
                groupVisible.graphics.beginFill(0xff0000);
                groupVisible.graphics.drawCircle(100, 100, 50);
                groupVisible.graphics.endFill();
                groupVisible.addEventListener(MouseEvent.CLICK, onMouseClick);
                addElement(groupVisible);

//              var groupInvisible : Group = new Group();
                var groupInvisible : SpriteVisualElement = new SpriteVisualElement();
                groupInvisible.graphics.beginFill(0x0000ff);
                groupInvisible.graphics.drawCircle(200, 100, 50);
                groupInvisible.graphics.endFill();
//              groupInvisible.addEventListener(MouseEvent.CLICK, onMouseClick);
                groupInvisible.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {trace("click");});
                addElement(groupInvisible);

            }

        ]]>
    </fx:Script>

</s:WindowedApplication>

如果切换到SpriteVisualElement而不是组,则两个项目都会显示。另一方面,鼠标单击事件实际上将从Sprite/SpriteVisualElement发送,而不会从容器发送。由于Click事件冒泡,因此可以从组内的元素中调度它,并在组级别上侦听它。但是,graphics不会分派单击事件

无论如何,这里有一些代码:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            import spark.core.SpriteVisualElement;


            protected function onMouseClick(event:MouseEvent):void{
                trace('click');
            }

            override protected function createChildren():void{
                super.createChildren();
                var groupVisible :SpriteVisualElement = new SpriteVisualElement();

//              var groupVisible : Group = new Group();
                groupVisible.graphics.beginFill(0xff0000);
                groupVisible.graphics.drawCircle(100, 100, 50);
                groupVisible.graphics.endFill();
                groupVisible.addEventListener(MouseEvent.CLICK, onMouseClick);
                addElement(groupVisible);

//              var groupInvisible : Group = new Group();
                var groupInvisible : SpriteVisualElement = new SpriteVisualElement();
                groupInvisible.graphics.beginFill(0x0000ff);
                groupInvisible.graphics.drawCircle(200, 100, 50);
                groupInvisible.graphics.endFill();
//              groupInvisible.addEventListener(MouseEvent.CLICK, onMouseClick);
                groupInvisible.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void {trace("click");});
                addElement(groupInvisible);

            }

        ]]>
    </fx:Script>

</s:WindowedApplication>



我忘了说任何其他添加的元素(如标签)都是在groupInvisible中呈现的。这非常奇怪,可能是一个bug。尽管如此,Group类的全部目的不是保存任何图形,而是成为一个轻量级的布局容器。这一准则显然违背了这一想法。为什么不直接使用来绘制图形呢?您是否考虑过在createChildren()中创建子对象而不是creationComplete处理程序?我绝对推荐阅读Flex组件生命周期。也就是说,您的两个组都没有大小(即未设置宽度和高度);蓝色圆圈可以画在屏幕外吗?另外,这两个组的父容器是什么?什么是布局?@RIAstar这是因为我的布局中有数百个矩形,而性能是手工制作的原因。我发现,通过图形手动绘制要比使用胖椭圆(Rect)效果好得多。@www.Flextras.com感谢您对FCL的提示,但大多数类不是MXML类,所以我只使用构造函数,它工作得很好。这是一个特殊的应用程序,有很多可见的细节(大约数百个矩形和>100个标签)。实际上,我只对性能不太相关的部分使用Flex。在flex组件中使用许多标签和大量图形,这是一个折衷方案。如果您有任何其他建议,我将不胜感激。我忘了说任何其他添加的元素(如标签)都是在groupInvisible中呈现的。这非常奇怪,可能是一个bug。尽管如此,Group类的全部目的不是保存任何图形,而是成为一个轻量级的布局容器。这一准则显然违背了这一想法。为什么不直接使用来绘制图形呢?您是否考虑过在createChildren()中创建子对象而不是creationComplete处理程序?我绝对推荐阅读Flex组件生命周期。也就是说,您的两个组都没有大小(即未设置宽度和高度);蓝色圆圈可以画在屏幕外吗?另外,这两个组的父容器是什么?什么是布局?@RIAstar这是因为我的布局中有数百个矩形,而性能是手工制作的原因。我发现,通过图形手动绘制要比使用胖椭圆(Rect)效果好得多。@www.Flextras.com感谢您对FCL的提示,但大多数类不是MXML类,所以我只使用构造函数,它工作得很好。这是一个特殊的应用程序,有很多可见的细节(大约数百个矩形和>100个标签)。实际上,我只对性能不太相关的部分使用Flex。在flex组件中使用许多标签和大量图形,这是一个折衷方案。如果你有任何其他建议,我将不胜感激。回答得好。我正要提交一份类似的报告。我只是想说这个“问题”是设计造成的。当
具有鼠标侦听器时,它会向该组添加一个“背景”,以便可以在鼠标侦听器的“透明”区域上注册鼠标事件。这是在掩盖或抹去你正在画的东西。@SunilD。您所说的有道理,但是我运行了最初提供的代码(使用组),没有调度click事件。所以,有件事我不明白。再次感谢你的回答!最后一个问题是:我需要使用spark.Label进行平滑字体渲染(textfield渲染不同,而且更糟糕)。许多组件用于几十个实例,但非常简单(例如,一个标签+2个不同颜色的矩形)。我是否应该扩展组并通过额外的SpriteVisualElement添加所有图形?@MarkusRossler您是否尝试过使用。这也应该比标签更轻。@RIAstar谢谢。是的,我知道,但它在小尺寸上的渲染效果不是很好,尤其是嵌入字体。回答得好。我正要提交一份类似的报告。我只是想说这个“问题”是设计造成的。当
具有鼠标侦听器时,它会向该组添加一个“背景”,以便可以在鼠标侦听器的“透明”区域上注册鼠标事件。这是在掩盖或抹去你正在画的东西。@SunilD。您所说的有道理,但是我运行了最初提供的代码(使用组),没有调度click事件。所以,有件事我不明白。再次感谢你的回答!最后一个问题是:我需要使用spark.Label进行平滑字体渲染(textfield渲染不同)