我想在我的.mxml文件中的<mx:Image>
上绘制一些内容,但我想将绘图实现保存在一个单独的AS类中。
如何在我的.mxml中访问我的绘图AS类?
答案 0 :(得分:1)
我认为你倒退了。如果您使用<mx:script>
标记将.as
文件包含到.mxml
中,则可以看到其中定义的功能。
要处理图像,请将其设置为id属性。从那时起,它变得可以像使用像
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文件。仅包含此文件中的方法,并且不要将代码包装在package
或class
定义中。该文件应如下所示:
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的用例如下:
{}
功能块中包含代码。有关“混入”的示例,请考虑可枚举对象,具有next(),previous(),reset()和iterator()方法的对象。当你想迭代对象的属性时,你调用iterator(),它返回一个调用next()和previous()的迭代器对象来从对象中获取下一个和前一个属性值。您可以将此功能混合到所有类型的对象中并有用地使用它们。此外,您包含的功能封装在包含它的类中。它的工作方式类似于AS3中的include指令。希望这有助于您了解Flex中的“逻辑”和“演示”,并帮助您解决特定问题。