从AS类访问<mx:image> </mx:image>

时间:2011-04-14 14:53:01

标签: flex actionscript-3

我想在我的.mxml文件中的<mx:Image>上绘制一些内容,但我想将绘图实现保存在一个单独的AS类中。

如何在我的.mxml中访问我的绘图AS类?

4 个答案:

答案 0 :(得分:1)

我认为你倒退了。如果您使用<mx:script>标记将.as文件包含到.mxml中,则可以看到其中定义的功能。 要处理图像,请将其设置为id属性。从那时起,它变得可以像使用像

这样的ActiveScript定义
 var image:Image = new Image()

答案 1 :(得分:1)

您正在谈论的MXML和AS类之间的关系并不是很明显,但最简单的方法是在MXML中创建返回Image的公共方法。像这样:

…
<mx:Script>
<![CDATA[
public function getImage():Image
{
    return myImage;
}
]]>
</mx:Script>
<mx:Image id="myImage" />
…

因此,只要您可以从AS引用您的MXML,就可以调用此方法。

答案 2 :(得分:1)

如果你想使用自己的绘图类在图像中绘制内容,我建议你将它添加到绘图类的构造函数中,如下所示:

/*********************************************
* Variables
*********************************************/
private var _myImageIWantToDrawIn:Image;

/*********************************************
*   Properties
*********************************************/
public function set image(value:Image):void
{
    _myImageIWantToDrawIn = value;
}

public function get image():Image
{
    return _myImageIWantToDrawIn;
}

/*********************************************
* Constructor
*********************************************/
public function myDrawingclass(imageYouWantToDrawIn:Image)
{
    _myImageIWantToDrawIn = imageYouWantToDrawIn;   
}
像这样,您可以随时访问该类中的图像并根据需要绘制。 (如果要绘制programmaticaly,也可以访问_myImageIWantToDrawIn.graphics)。如果要在运行时更改图像,可以添加属性。你可以简单地说:myDrawingclass.image = imageYouWantToDrawIn;

编辑:这个上一个答案实际上与你要求的相反,但我认为这对你想要做的事情做得很好。如果您想访问您的课程,只需创建一个类的实例并向其添加公共方法而不是私有方法。

答案 3 :(得分:1)

我认为您的问题是如何将您的actionscript文件与包含您的设计的MXML文件分开。答案很简单:

创建您的actionscript文件。仅包含此文件中的方法,并且不要将代码包装在packageclass定义中。该文件应如下所示:

import mx.controls.Alert;

// ActionScript file
/**
 *
 * Created By jviers
 * Created on Apr 14, 2011
 * 
 *
 */

public function hello():Alert{
    Alert.show("Hello World!");
}

创建包含“Design”组件的MXML文件。在此mxml文件上创建Script元素,并将源设置为ActionScript文件的相对路径。 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 = "955"
               minHeight = "600">

    <fx:Script>
        <![CDATA[
            protected function button1_clickHandler ( event : MouseEvent ) : void {
                // TODO Auto-generated method stub
                hello ();
            }
        ]]>
    </fx:Script>

    <fx:Declarations>

        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script source = "./scratch/MyFile.as" />

    <s:Button label = "Show Alert" click = "button1_clickHandler(event)" />
</s:Application>

您会注意到scratch.MyFile.as中的ActionScript在应用程序运行时执行。

您可以使用此方法在您的应用程序中包含绘图逻辑。外部ActionScript被视为MXML生成的类的方法定义。

让我在每个人都跳过我之前提醒你。这是 NOT 最佳做法。有一些特定的用例可以使用Flex的这个功能。在我找到它们之前,让我解释一下为什么你的“逻辑”与你的“观点”分开的概念是不准确的。

Flex MXML文件不是仅限查看的代码。它们是一种声明性方言,可简化ActionScript类定义。使用mxmlc或compc(分别是flex应用程序和组件库的编译器程序)编译Flex项目时,MXML文件会预编译为ActionScript类定义。如果在Flash / Flex Builder / Ant /命令行编译命令中将-keep-generated-actionscript指令添加到编译器选项中,编译器将保留生成的类,这些类组成从项目中的声明性MXML文件派生的ActionScript类。因此,MXML文件成为一个类。

在MXML的脚本块中定义ActionScript是将“逻辑”与“演示”混合。同样,MXML NOT 定义项目的表示。它只是ActionScript语言的声明性子集,可以更轻松地定义表示类。作为证明,您可以在MXML中定义 ArrayCollections 字符串向量。这些类是数据容器,与表示完全无关。

现在,将所有ActionScript放在外部文件中的原因不是一件好事是因为它使维护项目变得头疼。不仅有人必须查找MXML中定义的组件,而且现在他们必须通过代码库来查找相对于组件定义的名为Logic.as的脚本。

通过Script.source包含外部ActionScript的用例如下:

  1. 一组预定义的方法/属性在许多组件中使用而没有变化。您可以使用Script.source属性定义方法一次,并在整个应用程序中引用它们,而不是将这些方法复制并粘贴到每个组件中。
  2. 类似,但与用例1不同:您需要混合使用。与接口一样,混合是必须为组件定义的一组方法,这些方法必须是可重用的,并定义显式输入参数和输出参数。与接口不同,这些方法可以是任何名称空间类型:protected,final,public,internal,mx_internal等,并且必须是函数体,即在{}功能块中包含代码。有关“混入”的示例,请考虑可枚举对象,具有next(),previous(),reset()和iterator()方法的对象。当你想迭代对象的属性时,你调用iterator(),它返回一个调用next()和previous()的迭代器对象来从对象中获取下一个和前一个属性值。您可以将此功能混合到所有类型的对象中并有用地使用它们。此外,您包含的功能封装在包含它的类中。它的工作方式类似于AS3中的include指令。
  3. 希望这有助于您了解Flex中的“逻辑”和“演示”,并帮助您解决特定问题。