Graphics 如何在Flex MXML文件中绘制圆?

Graphics 如何在Flex MXML文件中绘制圆?,graphics,flex3,geometry,Graphics,Flex3,Geometry,在我的文件中,我有一个带有三个VBox的选项卡导航器 <mx:TabNavigator width="624" height="100%"> <mx:VBox label="Currents Quote" width="100%"> </mx:VBox> <mx:VBox label="Quote Comparison" width

在我的文件中,我有一个带有三个VBox的选项卡导航器

<mx:TabNavigator width="624" height="100%">
        <mx:VBox label="Currents Quote" 
            width="100%">            
        </mx:VBox>
        <mx:VBox label="Quote Comparison" 
            width="100%">              
        </mx:VBox>
        <mx:VBox label="Reports" 
            width="100%">            
        </mx:VBox>      
</mx:TabNavigator>


在VBox“Current Quote”中,我希望绘制一个圆。我怎样才能实现它呢?

看一看

在Flex中,这是一种可能性:

var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0xFFCC00);
mySprite.graphics.drawCircle(30, 30, 30);
this.addChild(mySprite);

这应该是可行的:)

没有定义MXML循环,因此您必须自己创建一个循环控件,然后才能将其包含在MXML中

package mypackage
{
    class MyCircle extends UIComponent
    {
        public var x:int;
        public var y:int;
        public var radius:int;

        override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
        {
            graphics.drawCircle(x, y, radius);
        }
    }
}
然后,在MXML中,如果在包含控件的顶部声明一个名称空间来引用它,则可以使用自定义控件

<mx:VBox label="Currents Quote" width="100%">
    <mycontrols:MyCircle x="30" y="30" radius="30"/>
</mx:VBox>

上面的代码是在StackOverflow编辑器中输入的,所以请检查它是否有效

在web上有很多关于扩展UIComponent和Sprite的帮助。Adobe文档非常全面

编辑: 将控件作为命名空间包含在封闭控件或应用程序中

<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:mycontrols="mypackage.*" >
<mx:Script>


HTH

用于拖放等的装饰

是的,几乎任何事情都有可能。如果您不想使用饼图(我建议您查看饼图,因为它可能会使许多绘图代码变得非常简单),那么您需要对上面的MyCircle类进行修饰,以捕获mouseDown事件,并使用DragSource对象从中启用拖动

package mypackage
{
    class MyCircle extends UIComponent
    {
        ...snip...

        // to initiate a drag from this object
        private function MouseDown(e:MouseEvent):void
        {
            var ds:DragSource = new DragSource();
            if (data)
            {
                 // I'm adding the object's data to it, but you need to decide what you want in here
                ds.addData(data, "MyDragAction");
                mx.managers.DragManager.doDrag(this, ds, e);
            }
        }

        // to handle a drop
        private function HandleDrop(e:DragEvent):void
        {
            mx.managers.DragManager.acceptDragDrop(e.currentTarget);
            // you can get at whatever you put in the drag event here
        }
    }
}
您需要将这些函数(以及最终支持拖放的其他函数)设置为此对象上的事件侦听器。您可以在对象的构造函数中执行此操作,只需确保您正在侦听正确的事件


你有一些挖掘工作要做,还有,但这一切都是完全可能的。当您向MyCircle添加更多内容时,您将从将其分解为单独的控件中获得更大的好处。

还有一个选项可以创建一个圆圈,即eclipse

创建具有背景色(如果您想用任何颜色填充)和特定宽度和高度的长方体,并提供正好一半宽度的角半径

例如:

<mx:Box cornerRadius="3"  borderStyle="solid" borderColor="0x5F4C0B" backgroundColor="0x5F4C0B" width="6" height="6" />

请尝试以下代码:

        <s:Ellipse x="60" y="60" width="80" height="80">
            <s:stroke>                  
                <s:LinearGradientStroke rotation="90">
                    <s:entries>
                        <s:GradientEntry color="white" ratio="0.5"/>
                        <s:GradientEntry color="black" ratio="0.5" />
                    </s:entries>
                </s:LinearGradientStroke>
            </s:stroke>
        </s:Ellipse>


圆圈控件是否要创建为.as文件?如果我创建为.as文件,则它不会包含为带有名称空间的组件??如果使用FlexBuilder,则在项目的源文件夹中创建ActionScript类。然后它将在代码完成或设计编辑器中对IDE可见。如果在MXML文件中包含自定义控件,IDE将自动为您添加默认名称空间。如果您全部手动执行此操作,则需要为类指定一个包名,并在MXML文件顶部的命名空间声明中引用该包。我将在我的答案中添加一个声明语法。它显示一个错误
1071:语法错误:在属性public之后应该有一个定义关键字(例如function),而不是x。
public x:int