2011-04-14 109 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