2011-04-14 45 views
0

我想在我的.mxml文件中的<mx:Image>上画一些东西,但是我想将我的绘图实现保留在单独的AS类中。从AS类访问<mx:Image>

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

+0

我可以问你准备做什么吗? – 2011-04-14 15:10:40

+0

我想分开我的应用程序的用户界面和逻辑 – Sergey 2011-04-14 17:47:26

+0

那么,绘制一些东西不是UI? – 2011-04-14 17:49:56

回答

1

我想你的问题是如何让你的动作文件与包含你的设计的MXML文件分开。答案很简单:

创建你的动作文件。仅在此文件中包含方法,并且不要将代码包装在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被视为是由MXML生成的类的方法定义。

让我在每个人跳过我之前告诫你。这是不是的最佳做法。有一些特定的用例可以使用Flex的这个特性。在我找到他们之前,让我解释一下为什么将“逻辑”与“视图”分开的概念是不准确的。

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

在MXML的脚本块中定义ActionScript是NOT将“逻辑”与“演示文稿”混合在一起。同样,MXML 不是定义您的项目的演示文稿。它只是ActionScript语言的一个声明性子集,可以更容易地定义表示类。作为证明,您可以在MXML中定义ArrayCollectionsStringsVectors。这些类是数据容器,与演示完全无关。

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

的使用情况,其中包括通过Script.source的外部ActionScript如下:

  1. 一组预定义的方法/属性是在大量组分而不改变使用。不是将这些方法复制并粘贴到每个组件中,而是使用Script.source属性定义一次方法并在整个应用程序中引用它们。
  2. 与use-case-1相似,但不同:需要混合使用。就像一个接口一样,混合输入是一组必须为组件定义的方法,这些方法必须是可重用的,并定义显式输入参数和输出参数。与接口不同,这些方法可以是任何名称空间类型:protected,final,public,internal,mx_internal等,并且必须具有函数体,即具有{}功能块内的代码。对于“混入”的例子,想象一个可枚举的对象,一个包含next(),previous(),reset()和iterator()方法的对象。当你想迭代对象的属性时,你可以调用iterator(),它会返回一个调用next()和previous()的迭代器对象来从对象中获取下一个和前一个属性值。您可以将此功能混合到各种对象中并有用地使用它们。此外,您所包含的功能将被包含在其中的类中。它像AS3中的include指令一样工作。

希望这可以帮助您理解Flex中“逻辑”和“表达”的含义,并帮助您解决特定问题。

1

我认为你有它倒退。如果使用<mx:script>标签将.as文件包含到.mxml中,您将能够看到其中定义的功能。 要解决该图像,请将其设置为id属性。从这一点来说,它成为一个可寻址如果使用ActiveScript定义如下

var image:Image = new Image() 
1

这是没有很明显的是什么关系MXML和AS之间的你在谈论类,但最简单的方法是创建MXML公共方法它返回Image。类似这样的:

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

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

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;

编辑:这个以前的答案实际上与你所要求的是相反的,但我认为这对你想做的事情会很好。如果你想访问你的类,只需创建你的类的实例,并添加公共方法,而不是私人的。

+0

和顺便说一句:你的问题在你的标题是你的问题在你的文字的相反。 – 2011-04-14 16:10:40