ï»??xml version="1.0" encoding="utf-8" standalone="yes"?> 上述3¿U方法是Adobe官方文档æä¾›çš„。但是这3¿U方法ä¸èƒ½è§£å†³ViewStackå组件大ž®ä¸ä¸€è‡ß_¼ŒViewStackä¸èƒ½è‡ªåŠ¨è°ƒæ•´çš„é—®é¢˜ã€?br>æˆ‘æœ€åŽæ˜¯ä½¿ç”¨ActionScript动æ€è§£å†³çš„ã€?br>在更æ¢ViewStackçš„active child之间åQŒé¦–先设¾|®viewStack的大ž®ã€?/p>
<mx:ViewStack id="appStack"> public function changeChild() : void {
<mx:VBox id="v1"/>
<mx:VBox id="v2"/>
</mx:ViewStack>
appStack.width = 200;
appStack.height = 200;
appStack.selectChild = v1;
}
我错了,使用ViewStack的resizeToContent是最好的解决办法�/p>
<?xml version="1.0"?>
<!-- modules/URLModuleLoaderApp.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="srcview/index.html">
<mx:Panel
title="Module Example"
height="90%"
width="90%"
paddingTop="10"
paddingLeft="10"
paddingRight="10"
paddingBottom="10"
>
<mx:Label width="100%" color="blue"
text="Select the tabs to change the panel."/>
<mx:TabNavigator id="tn"
width="100%"
height="100%"
creationPolicy="auto"
>
<mx:VBox id="vb1" label="Column Chart Module">
<mx:Label id="l1" text="ColumnChartModule.swf"/>
<mx:ModuleLoader url="ColumnChartModule.swf"/>
</mx:VBox>
<mx:VBox id="vb2" label="Pie Chart Module">
<mx:Label id="l2" text="piehchartmodule.swf"/>
<mx:ModuleLoader url="piechartmodule.swf"/>
</mx:VBox>
<mx:VBox id="vb3" label="Line Chart Module">
<mx:Label id="l3" text="linehchartmodule.swf"/>
<mx:ModuleLoader url="linechartmodule.swf"/>
</mx:VBox>
</mx:TabNavigator>
</mx:Panel>
</mx:Application>
在这个应用ä¸ä¸»è¦æ˜¯ä¸€ä¸ªTagNavigator, é‡Œé¢æœ‰ä¸‰ä¸ªæ ‡½{ùN¡µ. æ¯ä¸ªæ ‡ç¾™åµåŠ è½½ä¸€ä¸ªæ¨¡å?
䏋颿˜¯å…¶ä¸ä¸€ä¸ªæ¨¡å—的代ç :
<?xml version="1.0"?>
<!--ColumnChartModule.mxml -->
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" >
<mx:Script><![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
public var expenses:ArrayCollection = new ArrayCollection([
{Month:"Jan", Profit:2000, Expenses:1500},
{Month:"Feb", Profit:1000, Expenses:200},
{Month:"Mar", Profit:1500, Expenses:500}
]);
]]></mx:Script>
<mx:ColumnChart id="myChart" dataProvider="{expenses}">
<mx:horizontalAxis>
<mx:CategoryAxis
dataProvider="{expenses}"
categoryField="Month"
/>
</mx:horizontalAxis>
<mx:series>
<mx:ColumnSeries
xField="Month"
yField="Profit"
displayName="Profit"
/>
<mx:ColumnSeries
xField="Month"
yField="Expenses"
displayName="Expenses"
/>
</mx:series>
</mx:ColumnChart>
<mx:Legend dataProvider="{myChart}"/>
</mx:Module>
最å? 应用和三个模å—一å…׃¼šç”Ÿæˆ4个SWF. 一般æ¥è¯? åº”ç”¨ä½¿ç”¨å»¶è¿ŸåŠ è²½{–ç•¥. 也就是说, å¦‚æžœä½ æ‰“å¼€åº”ç”¨å? 从æ¥éƒ½ä¸ä½¿ç”¨å…¶ä¸çš„æŸä¸ªæ¨¡å? 那个˜q™ä¸ªæ¨¡å—永远ä¸ä¼šè¢«åŠ è½? ˜q™æ¬¡åšçš„好处æ˜? åŠ å¿«äº†ç¬¬ä¸€‹Æ¡æ‰“开应用的速度, 但éšä¹‹è€Œæ¥çš„缺点就æ˜? ½W¬ä¸€‹Æ¡æ‰“开使用æŸä¸ªåŠŸèƒ½, 需è¦åŠ è½½æ¨¡å—æ—¶, 会需è¦ä¸€ç‚¹ç‰å¾…的旉™—´.
]]>
新特æ€?br>1. 支æŒAMF3, ˜q™ä¸€ç‚ÒŽ(gu¨©)— 疑是‹È€åЍäh心的.
2. 支æŒJSON, 除了gateway.phpå¤? å¢žåŠ äº†json.php, è®©ä½ çš„æœåŠ¡èƒ½å¤Ÿä‹É用JSON.
有两个例å?
http://5etdemi.com/amfphp2/samples/ajaxtables/
http://5etdemi.com/amfphp2/samples/spry/
3. 一个新的service browser
4. 在phpç«? ä¸å†éœ€è¦å†™ $this->methodTable ˜q™ä¸ªä¸œä¸œäº? 在amfphp 1.9 ä¸?所有的æ–ÒŽ(gu¨©)³•默认为å¯ä»¥è¿œ½E‹è®¿é—®ï¼Œé™¤éžæ–ÒŽ(gu¨©)³•åæ˜¯ä»¥ä¸‹åˆ’线开å§?或è€?æ–ÒŽ(gu¨©)³•æ˜?private çš„ï¼ˆåªæœ‰ php5 支æŒåQ?ã€?/p>
通常, Applicationå¯¹è±¡åˆ›å¾æ—? å‘生如下事äšg:
1. 实例化Application对象
2. åˆå§‹åŒ–Application.systemManager
3. Application在åˆå§‹åŒ–˜q‡ç¨‹ä¹‹å‰, ‹z‘֑预åˆå§‹åŒ–事äšg.
4. 调用createChild(). æ¤æ—¶, 所有应用组件被创å¾, 所有组件的createChild()被调ç”?
5. Application‹z‘Ö‘åˆå§‹åŒ–事ä»? 表明所有的¾l„äšgåˆå§‹åŒ–完æ¯?
6. ‹z‘Ö‘creationComplete事äšg
7. Application对象æ·ÕdŠ åˆ°æ˜¾½Cºåˆ—表ä¸
8. ‹z‘Ö‘applicationComplete事äšg
大多数情况下, 我们使用<mx:Application>æ¥åˆ›å»ºapplication对象, 但如果ä‹É用ActionScriptæ¥åˆ›å»ºçš„è¯? é‚£ä¹ˆå»ø™®®ä¸è¦åœ¨applicationçš„æž„é€ å‡½æ•îC¸åˆ›å¾¾l„äšg, 推è在crateChildren函数ä¸? ä¸»è¦æ˜¯ä»Žæ€§èƒ½æ–šw¢è€ƒè™‘.
Flash包å«çš„æ˜¯ä¸€ä¸ªæ—¶é—´çº¿ä¸Šçš„多个å¸? 而Flexçš„SWFåªåŒ…å?个å“á. SystemManager, Preloader, DownloadProgressBar和少é‡å·¥å…ïL(f¨¥ng)±»éƒ½åœ¨½W¬ä¸€å¸? 剩下的包括应用代ç ? 内嵌资æºå…¨éƒ½åœ¨ç¬¬äºŒå“áä¸? 当Flash Player下è²ä¸‹è²SWFæ—? åªè¦æŽ¥æ”¶åˆ°ç¬¬ä¸€å¸§å†…‘›_¤Ÿçš„æ•°æ? ž®×ƒ¼šå®žä¾‹åŒ–SystemManager, 由它æ¥åˆ›å»ºPreloader, ç„¶åŽåˆ›å¾DownloadProgressBar, ˜q™ä¸¤ä¸ªå¯¹è±¡ä¼šå¯Ÿçœ‹å‰©ä½™å—èŠ‚çš„ä¼ è¾“è¿‡½E? 当第一帧的所有å—èŠ‚ä¼ è¾“å®Œæ¯•åŽ, SystemManagerå‘é€enterFrame到第二å“á, ç„¶åŽæ˜¯å…¶ä»–事ä»? 最åŽApplication对象‹z‘Ö‘applicationComplete事äšg.
应用ä¸ä¸»è¦åŒ…å?个组ä»? 一个TextInput, 一个Tree, 一个DataGrid, 一个Label
1. 先看Tree, Tree使用_xmlDataä½œäØ“æ•°æ®æº? 定义一个change事äšg处ç†å‡½æ•°, ž®†å½“å‰èŠ‚ç‚¹å˜å‚¨åˆ°_xmlCurå˜é‡ä¸?
2. TextInputçš„æ•°æ®æºž®±æ˜¯_xmlCurçš„label属æ€? 也就是Tree当å‰èŠ‚ç‚¹çš„æ ‡½{? 他也定义了一个change事äšg处ç†å‡½æ•°, 在TextInputä¸çš„æ–‡æœ¬æ”¹å˜æ—? ž®†æ–°çš„æ–‡æœ¬èµ‹å€¼ç»™Tree当å‰èŠ‚ç‚¹çš„æ ‡½{? 也就是改å˜å½“å‰TreeèŠ‚ç‚¹çš„æ ‡½{‘Ö€? 值得注æ„çš„æ˜¯èµ‹å€¼åÆˆä¸æ˜¯ç›´æŽ¥¾l™Tree䏿ˆ–者节点ä¸çš„æŸä¸ªå±žæ€? è€Œæ˜¯é€šè¿‡ä¿®æ”¹æ•°æ®æºXmlçš„å€¼æ¥æ”¹å˜çš?
3. DataGridçš„ä‹É用显½CÞZº†å¦‚何在DataGridä¸å±•½CºXml的技å·?
4. 最åŽä¸€ä¸ªLabelåªæ˜¯½Ž€å•的昄¡¤ºå½“å‰èŠ‚ç‚¹çš„æ ‡½{‘Ö€? 与TextInputçš„æ–‡æœ¬ä¿æŒåŒæ?/p>
2. å¢žåŠ LocaleåQŒé”™è¯¯ä¿¡æ¯çš„国际化的处ç†ã€?br>æ·ÕdŠ äº†ä¸€ä¸ªPropertiesæ–‡äšgåQ?br>æ·ÕdŠ äº†com.adobe.cairngorm.CairngormMessageCodeså’Œcom.adobe.cairngorm.CairngormError两个¾c»ï¼Œå…¶ä¸CairngormMessageCodes用于定义Propertiesæ–‡äšgä¸çš„é”®å€û|¼Œè€ŒCairngormErrorž®è£…了ErroråQŒåœ¨åº”用执行的过½E‹ä¸å†ç›´æŽ¥æŠ›å‡ºErroråQŒè€ŒæŠ›å‡ÞZ¸€ä¸ªCairngormErroråQŒå…¶ä¸å¸¦ä¸€ä¸ªå‚数就是MessageCodeåQŒæ ¹æ®MessageCode到Propertiesæ–‡äšgä¸å–出相应的消æ¯ã€?/p>
3. 在businessä¸ï¼Œæ·ÕdŠ äº†ä¸€ä¸ªIServiceLocator的接å?br>ServiceLocator实现IServiceLocator接å£åQŒç›¸æ¯”以å‰å¢žåŠ äº†ä»¥ä¸‹å‡ ä¸ªæ–ÒŽ(gu¨©)³•åQ?br>aã€public function getRemoteObject( serviceId : String ) : RemoteObject // Return the RemoteObject for the given service id.
bã€public function getHTTPService( serviceId : String ) : HTTPService // Return the HTTPService for the given service id.
cã€public function getWebService( serviceId : String ) : WebService // Return the WebService for the given service id.
dã€public function getConsumer( serviceId : String ) : Consumer // Return the message Consumer for the given service id.
eã€public function getProducer( serviceId : String ) : Producer // Return the message Produce for the given service id.
fã€public function getDataService( serviceId : String ) : DataService // Return the DataService for the given service id.
gã€public function setCredentials( username : String, password : String ) : void // Set the credentials for all registered services. Note that services that use a proxy or a third-party adapter to a remote endpoint will
原æ¥çš„getServiceå’ŒgetInvokerServiceæ–ÒŽ(gu¨©)³•å·²ç»åºŸå¼ƒåQŒæ”¹ä¸ÞZº†getRemoteObject
4. 在Commandä¸ï¼Œå¢žåŠ äº†ICommand接å£åQŒåŽŸæ¥çš„Command接壾l§æ‰¿ICommand
5. 在VOä¸ï¼Œå¢žåŠ äº†IValueObject接å£åQŒåŽŸæ¥çš„ValueObject¾l§æ‰¿IValueObject接å£
ä¸Šé¢æ·ÕdŠ çš„å‡ ä¸ªæŽ¥å£ï¼Œé™¤äº†IServiceLocator相较2.0版本有了较大的å˜åŒ–ï¼Œå¢žåŠ äº†ä¸€äº›æ–¹æ³•ï¼Œå…¶ä»–çš„å‡ ä¸ªæŽ¥å£ï¼Œä¾æˆ‘所è§ï¼Œ¾U¯çÑa是æ¢äº†åå—而已ã€?/p>
Cairngen是一个Caringorm的代ç 生æˆå™¨, 它ä‹Éå¾—å¼€å‘者å¯ä»¥å¾ˆæ–¹ä¾¿åœ°ç”ŸæˆCairngorm™å¹ç›®çš„结构框æž? 包括: Cairngorm™å¹ç›®çš„目录结æž? 一个缺çœçš„ModelLocator, Controller, ServiceLocator. Cairngen也å¯ä»¥ç”ŸæˆEvent, Command, Delegate¾c?
Cairngen使用Flex2å’ŒPHP5.2.0å¼€å? 利用了AMFPHP. 安装˜q‡ç¨‹å分方便. ä½ å¯ä»¥åœ¨Flex Builderçš„æµè§ˆå™¨ä¸ç›´æŽ¥è¿è¡ŒCairngenæ¥å¿«é€Ÿæ–¹ä¾¿åœ°ç”ŸæˆCairngorm的类.
Cairngen使用'æ¥éª¤(Sequence)'æ¥æ˜q°Event, Command, Delegate¾cÖM¹‹é—´çš„关系.
在Cairngenä¸åªè¦å‘½å一ä¸?æ¥éª¤',ç‚¹å‡»ä¸€ä¸‹ç”ŸæˆæŒ‰é’®å°±å¯ä»¥ç”Ÿæˆä¸€ä¸?æ¥éª¤'. ç„¶åŽåˆäh–°ä¸€ä¸‹Flex™å¹ç›®, 生æˆçš„ç±»ž®±O(ji¨¡n)Käº? 在一些特ŒDŠçš„æƒ…况ä¸? ä½ ä¸å¸Œæœ›æ·ÕdŠ Delegate¾c? é‚£ä¹ˆä½ å¯ä»¥é€‰æ‹©æŽ’除Delegate¾cÈš„生æˆ, ˜q™æ ·çš„è¯, Cairngenåªç”ŸæˆEventå’ŒCommand.
生æˆçš„Command¾cÕd®žçްCairngormçš„Command接å£, 但ä¸å®žçްIResponder接å£. Cairngen˜q˜èƒ½å¤Ÿæ£¼‹®åœ°ž®†äº‹ä»¶å¼ºåˆ¶æ€§è{åŒ?casting)为Coandä¸çš„¾cÕdž‹, òq¶import所有相关的¾c?
¾pÈ»Ÿéœ€æ±?
1. 了解AMFPHP, Apache2.0.59å’ŒPHP5.2.0, 在ä‹É用Cairngen之å‰è¦æ±‚先安装AMFPHP, 而且gateway.php的访问虚拟目录应该如下设¾|? http://localhost/amfphp/gateway.php. åœ?.0版æ£å¼å‘布åŽ, ˜q™ä¸ªURLå¯ä»¥è‡ªç”±é…ç½®.
2. ˜q˜éœ€è¦å®‰è£…Flex2, PHP, ä½ å¯ä»¥ç”¨WAMP5æ¥é›†æˆå®‰è£…Apache5.5å’ŒPHP. 安装好PHPå’ŒAMFPHPå? ž®±å¯ä»¥è§£åŽ‹ç¾ƒCairngen Alpha 1. 把services目录å¤åˆ¶åˆ°amfphpçš„æ ¹ç›®å½•ä¸? ç„¶åŽå¤åˆ¶cairgen-ui目录到apacheçš„wwwæ ¹ç›®å½•ä¸‹.
使用:
安装好PHPå’ŒAMFPHPå? ž®±å¯ä»¥å¼€å§‹ä‹É用Cairngenäº? 打开‹¹è§ˆå™¨è¾“å…?a href="http://localhost/cairngen-ui/Cairngen.html">http://localhost/cairngen-ui/Cairngen.html打开生æˆå™¨çš„囑ÖŞ界é¢. 创å¾Cairgen™å¹ç›®:
点击 begin
¾l™ä½ çš„Cairngen™å¹ç›®å‘½å. ˜q™ä¸ªå称与Flex™å¹ç›®çš„å¿U°ç›¸å? é€‰æ‹©ä½ çš„Cairngorm的版æœ? 选择Flex™å¹ç›®çš„èµ\å¾? 讄¡½®™å¹ç›®ä¸åŒ…路径(比如: com.domain.projectname). 最å? ‹‚€éªŒä¸€ä¸‹è¾“入内å®? 点击"Create Project". åˆäh–°Flex™å¹ç›®æŸ¥çœ‹¾~ºçœçš„Cairngorm™å¹ç›®¾l“æž„, ModelLocator, Serviceå’ŒController¾c?
创å¾"æ¥éª¤":
首先是给æ¥éª¤å‘½å, ç„¶åŽé€‰æ‹©æ˜¯å¦è¦ç”ŸæˆDelegate¾c? 点击生æˆ, òq¶åˆ·æ–°Flex™å¹ç›®. å¯ä»¥å‘现需è¦çš„¾cÕd·²¾l生æˆå®Œæ¯•了. çŽ°åœ¨éœ€è¦æŠŠå®ƒä»¬æ·ÕdŠ åˆ°Controllerä¸?
接下æ¥ç¼–è¾‘æ¨¡æ¿æ–‡ä»? ä½ å¯ä»¥ä¿®æ”ÒŽ(gu¨©)¨¡æ¿æ–‡ä»?.tpl)æ¥å®žçŽîC½ 的特定的Cairngorm需æ±? æ¨¡æ¿æ–‡äšgåœ?amfphp\services\com\ericfeminella\cairngen\templates目录ä¸?
生æˆå™¨ä¸‹è½½åœ°å€: http://code.ericfeminella.com/cairngen/Cairngen%20Alpha%201%20PreRelease.zip
çŽ°åœ¨æœ‰ä¸€ä¸ªæ–¹ä¾¿çš„åšæ³•æ¥æ ¹æ®é€‰æ‹©Enable/Disable控äšg。比如:有一个DataGrid和数个æ“作数æ®çš„æŒ‰é’®åQŒå½“选䏿Ÿè¡Œæ˜¯æ¿€‹zÕd…¶ä¸ä¸€ä¸ªæŒ‰é’®ï¼Œé€‰ä¸å¦ä¸€è¡Œæ—¶åQŒæ¿€‹zÕd…¶ä¸å¦ä¸€ä¸ªæŒ‰é’®ï¼Œ½{‰ç‰ã€?/p>
é€šå¸¸çš„åšæ³•æ˜¯å†™ä¸€å¤§å †çš„if elseè¯å¥åQŒæˆ–者是讄¡½®ä¸€å †å˜é‡ç»‘定到按钮上,然åŽåœ¨ä»£ç ä¸è®„¡½®˜q™äº›å˜é‡çš„å€û|¼Œæ¯”如åQ?/p>
[Bindable] private var somethingSelected:Boolean = false;
<mx:Button label="Publish" click="publishItem()" enabled="{somethingSelected}" />
˜q™æ˜¯ä¸€ä¸ªæœ‰ç›Šçš„ž®è¯•ã€‚æ‰€æœ‰çš„ä¾èµ–于DataGrid状æ€çš„æŽ§äšg都绑定一个å˜é‡ã€‚改å˜å˜é‡çš„å€¼å°±æ”¹å˜æŽ§äšgçš„enabled状æ€ã€‚ä½†æ˜¯ä½ ˜q˜éœ€è¦ç¡®å®šæ”¹å˜å˜é‡å€¼çš„æ—¶æœºã€‚比如:
private function publishItem() : void {
    // get the selected item
    // publish it
    grid.selectedItem = -1; // clear the selection
    somethingSelected = false;
}
åœ¨å¤æ‚的情况下,å‡è®¾æœ‰å¦ä¸€ä¸ªæŒ‰é’®éœ€è¦åœ¨é€‰ä¸æŸä¸ªç‰¹å®šå€¼æ—¶è¢«æ¿€‹z…R€‚é‚£ä¹ˆä½ ä¸ä»…需è¦è€ƒè™‘选ä¸å¯¹åº”的那个å˜é‡ï¼Œ˜q˜éœ€è¦è€ƒè™‘其他按钮的情å†üc€‚也ž®±æ˜¯è¯ß_¼Œåœ¨publishItem函数ä¸ä½ ˜q˜éœ€è¦è®¾¾|®å…¶ä»–å˜é‡çš„倹{€?/p>
ä¸€ä¸ªæ›´æ–¹ä¾¿çš„åšæ³•是˜q™æ ·çš„。现在我们Publish按钮和somethingSelectedå˜é‡˜q›è¡Œ¾l‘定。我们还需è¦åšçš„æ˜¯æŠŠsomethingSelectedå˜é‡ä¸ŽDataGrid的选ä¸çжæ€è¿›è¡Œå…³è”。对æ¤ï¼Œæˆ‘们å¯ä»¥ä½¿ç”¨<mx:Binding>æ ‡ç¾ã€?/p>
<mx:Binding source="grid.selectedIndex >= 0" destination="somethingSelected" />
˜q™æ ·somethingSelectedçš„å€ég¸ŽDataGrid的选ä¸çжæ€å°±ç´§å¯†åœ°è”¾p»è“væ¥äº†ã€‚当选ä¸äº†DataGridä¸çš„æŸæ¡æ•°æ®æ—Óž¼Œæ‰€æœ‰è¿›è¡Œenabled="{somethingSelected}"¾l‘定的按钮就被激‹z…R€?lt;mx:Binding>æ ‡ç¾çš„source属性ä¸éœ€è¦ä¸€å®šæ˜¯ä¸€ä¸ªå˜é‡ï¼Œå®Œå…¨å¯ä»¥æ˜¯ä¸€ä¸ªè¡¨è¾‘Ö¼ã€?/p>
比如½E微夿‚一点的一个例å:
<mx:Binding source="grid.selectedItem.code == 1" destination="codeOnePicked" />
˜q™æ ·åQŒå½“DataGrid选ä¸è¡Œçš„codeå—æ®µçš„å€égØ“1æ—Óž¼Œå˜é‡codeOnePickedçš„å€ÆD¢«è®„¡½®ä¸ºtrueã€?br />mxmlä¸å¯ä»¥å¦‚下定义:
<mx:CheckBox label="Code One?" selected="{codeOnePicked}" />
<mx:Button label="Publish" enabled="{somethingSelected && !codeOnePicked}" />
˜q™æ ·åQŒå½“选ä¸è¡Œçš„codeå—æ®µå€égØ“1æ—Óž¼Œä¸Šé¢çš„å¤é€‰æ¡†è¢«æ¿€‹z»ï¼Œè€Œä¸‹é¢çš„æŒ‰é’®æ— 效ã€?/p>
http://www.adobe.com/livedocs/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=ent_services_config_097_11.html
在Flexçš„åºåˆ—化和ååºåˆ—化过½E‹ä¸åQŒåªèƒ½ä¼ 递public的,éžé™æ€çš„属性,如果è¦åºåˆ—化æ¤éƒ¨åˆ†å†…容在Flex与Javaé—´ä¼ é€’ï¼Œå¿…é¡»ä½¿ç”¨externalization机制
从我们开始å¦ä¹?f¨¤n)Flexæ—? 我们ž®±éœ€è¦äº†è§£äº‹ä»¶æµå’ŒMXML的实例化. 我éžå¸¸å›°æƒ‘å› ä¸ºæˆ‘å®žåœ¨éš¾ä»¥ç†è§£ä»€ä¹ˆæ ·çš„äº‹ä»¶ä¼šè¢«è§¦å‘æˆ–者事件什么时候会被触å? 关键是è¦ç†è§£äº‹äšg的基¼‹€òq¶äº²è‡ªè§‚察事件æµçš„åˆå§‹åŒ–.
我们æ¥çœ‹ä¸€ä¸ªç®€å•çš„MXML的应ç”?
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
   xmlns:mx="   layout="absolute"
   backgroundGradientColors="[#67cbff, #fcffff]"
   color="#000000"
   fontSize="12"  Â
   preinitialize="report( event , 'preinitialize' )"
   initialize="report( event , 'initialize' )"
   creationComplete="report( event , 'creationComplete' )"
   applicationComplete="report( event , 'applicationComplete' )"
   >
  Â
   <mx:Script>
       <![CDATA[  Â
                  Â
           [Bindable]
          Â
           public var outTextData:String="";
          Â
           public function report( event:Event , value:String ):void
           {
               outTextData += String( flash.utils.getTimer() ) + 'ms >> '
               + event.currentTarget + '.' + value + '\n';  Â
           }
          Â
       ]]>
   </mx:Script>
  Â
   <mx:TextArea
       id="outTextArea"
       text="{ outTextData }"
       right="10" left="10" top="50" bottom="10" alpha="0.5"
       wordWrap="false"
       initialize="report( event , 'initialize' )"
       creationComplete="report( event , 'creationComplete' )"
       />
  Â
   <mx:Button
       y="10" height="30" left="168" width="150"
       id="HelloButton"
       label="Say Hello"
       initialize="report( event , 'initialize' )"
       creationComplete="report( event , 'creationComplete' )"
       rollOver="report( event , 'rollOver' )"
       rollOut="report( event , 'rollOut' )"
       click="report( event , 'click > Hello!' )"
       />
      Â
   <mx:Button
       id="GoodByeButton"
       label="Say Goodbye"
       y="10" left="10" height="30" width="150" color="#000000"
       initialize="report( event , 'initialize' )"
       creationComplete="report( event , 'creationComplete' )"
       click="report( event , 'click > Goodbye!' )"
       />
      Â
   <mx:Button
       id="ClearButton"
       label="Clear"
       y="10" left="326" height="30" color="#000000" right="10"      Â
       initialize="report( event , 'initialize' )"
       creationComplete="report( event , 'creationComplete' )"
       click="outTextData='';report( event , 'click' )"
        />
  Â
</mx:Application>
˜q™ä¸ªåº”用˜q行æ—? 输出了实例浽E‹å’Œäº‹äšg‹¹? ˜q™æ ¡æˆ‘们ž®Þpƒ½å¤Ÿçœ‹åˆ°æ‰€æœ‰äº‹ä»¶çš„触呙åºåº. å¯ä»¥å‘现应用å¯åЍå? 事äšgçš„é¡ºåºæ˜¯ä¸€å®šçš„. 䏋颿˜¯è¾“出的内容:
167ms >> EventFlow0.preinitialize
183ms >> EventFlow0.outTextArea.initialize
187ms >> EventFlow0.HelloButton.initialize
188ms >> EventFlow0.GoodByeButton.initialize
189ms >> EventFlow0.ClearButton.initialize
189ms >> EventFlow0.initialize
243ms >> EventFlow0.outTextArea.creationComplete
243ms >> EventFlow0.HelloButton.creationComplete
243ms >> EventFlow0.GoodByeButton.creationComplete
244ms >> EventFlow0.ClearButton.creationComplete
244ms >> EventFlow0.creationComplete
246ms >> EventFlow0.applicationComplete
一旦applicationComplete事äšg触å‘å? ¾l„äšgž®×ƒ¼šåœ¨é¼ æ ‡äº‹ä»¶æ´¾å‘åŽè§¦å‘自己的事ä»?
1807ms >> EventFlow0.HelloButton.rollOver
2596ms >> EventFlow0.HelloButton.rollOut
2954ms >> EventFlow0.HelloButton.rollOver
3170ms >> EventFlow0.HelloButton.rollOut
3543ms >> EventFlow0.HelloButton.rollOver
4052ms >> EventFlow0.HelloButton.click > Hello!
4267ms >> EventFlow0.HelloButton.click > Hello!
4474ms >> EventFlow0.HelloButton.click > Hello!
4569ms >> EventFlow0.HelloButton.rollOut
4907ms >> EventFlow0.GoodByeButton.click > Goodbye!
5130ms >> EventFlow0.GoodByeButton.click > Goodbye!
Â
在ActionScript 3ä¸ï¼Œä½ 会å‘现在flash.utilsåŒ…ä¸æœ‰ä¸€¾pÕdˆ—函数æä¾›äº†åž®„的功能。主è¦åŒ…å«ä»¥ä¸‹åŠŸèƒ½ï¼š
   * ¼‹®å®šå¯¹è±¡çš„ç±»
   * 获喾cÈš„æˆå‘˜ã€æ–¹æ³•ã€æž„é€ å‡½æ•°ã€çˆ¶¾cÈš„ä¿¡æ¯
   * ¼‹®å®šæŽ¥å£å£°æ˜Žçš„常数和æ–ÒŽ(gu¨©)³•
   * 在è¿è¡Œæ—¶æ ÒŽ(gu¨©)®¾cÕd创徾cÈš„实例
   * 在è¿è¡Œæ—¶æ ÒŽ(gu¨©)®æˆå‘˜åç§°èŽ·å–æˆ–者设¾|®å¯¹è±¡æˆå‘˜çš„å€?br />   * 在è¿è¡Œæ—¶æ ÒŽ(gu¨©)®æ–ÒŽ(gu¨©)³•åç§°åQŒè°ƒç”¨å¯¹è±¡çš„æ–ÒŽ(gu¨©)³•
ä½ å¯ä»¥ä‹É用类ä¼égºŽ"describeType"之类的功能,它返回一个Xml对象。ä‹D一个例å:
package {
   import flash.display.Sprite;
   import flash.utils.describeType;
 Â
   public class DescribeTypeExample extends Sprite {
       public function DescribeTypeExample() {
           var child:Sprite = new Sprite();
           var description:XML = describeType(child);
           trace(description..accessor.@name.toXMLString());
       }
   }
}
å¦‚æžœä½ æƒ³˜q›ä¸€æ¥ï¼Œæ ÒŽ(gu¨©)®¾cÕd创å¾å¯¹è±¡çš„实例,我们å¯ä»¥ä½¿ç”¨"getDefinitionByName()"
package {
   import flash.display.DisplayObject;
   import flash.display.Sprite;
   import flash.utils.getDefinitionByName;
   public class GetDefinitionByNameExample extends Sprite {
       private var bgColor:uint = 0xFFCC00;
       private var size:uint = 80;
       public function GetDefinitionByNameExample() {
           var ClassReference:Class = getDefinitionByName(“flash.display.Sprite� as Class;
           var instance:Object = new ClassReference();
           instance.graphics.beginFill(bgColor);
           instance.graphics.drawRect(0, 0, size, size);
           instance.graphics.endFill();
           addChild(DisplayObject(instance));
       }
   }
}
ž®½ç®¡˜q™æ˜¯ä¸€äº›éžå¸¸æ–¹ä¾¿çš„æ–ÒŽ(gu¨©)³•åQŒä½†æ˜¯åœ¨FlashPlayerä¸ä‹É用垮„还是会有许多的é™åˆ¶åQŒå› 为缺ä¹è¿è¡Œæ—¶çš„åŠ¨æ€æºç 编译。上é¢çš„功能对于那些在内建的¾c»ï¼Œæ¯”如åQšSprite¾cÀL¥è¯´æ— 疑是有用的,但是对于自定义类æ¥è¯´åQŒæˆ‘们会é‡åˆ°å¾ˆå¤šéºÈƒ¦ã€‚比如:
package {
   import com.customtypes.string; // Custom String Implementation Class
   import flash.utils.getDefinitionByName;
   public class GetDefinitionByNameExample {
       public function GetDefinitionByNameExample() {
           var ClassReference:Class = getDefinitionByName(“com.customtypes.string� as Class;
           var instance:Object = new ClassReference();
           instance.customParameter = “my parameter�
       }
   }
}
ž®½ç®¡æˆ‘们使用了importè¯å¥åQŒä½†æ˜?getDefinitionByName()"˜q˜æ˜¯ä¼šå¤±è´¥ã€‚åŽŸå› ä¸Šé¢å·²¾l说˜q‡äº†åQŒåœ¨˜q行时编译æºä»£ç 是ä¸å…è®¸çš„ã€‚ä¹Ÿè®æ€»¥åŽå¯ä»¥ã€‚åœ¨ç›®å‰æƒ…况下,è¦å®žçŽîC¸Š˜q°åŠŸèƒ½ï¼Œè‡›_°‘è¦åœ¨ä»£ç ä¸åˆå§‹åŒ–一个类的实例。也ž®±æ˜¯å£°æ˜Žä¸€ä¸ªç±»çš„实例:
var customType : com.customtypes.string;
Â
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ public var foo:String = "bar"; ]]> </mx:Script> </mx:Application>
在其它的地方ž®±å¯ä»¥ä‹Éç”?
Application.application.foo
æ¥è®¿é—®äº†. 如果需è¦? 也å¯ä»¥æ·»åŠ?Bindable 属æ€?
ä½†æ˜¯è¦æ³¨æ„到一个问题就æ˜? 在ä‹É用的时候编译器ä¸ä¼š˜q›è¡Œ¾cÕdž‹çš„æ£€æŸ? å› æ¤æœ€å¥½æ·»åŠ ç±»åž‹å¼ºåˆ¶è{æ?
当然, 全局å˜é‡å®žçŽ°çš„å¦ä¸€¿U方法是使用å•例模å¼.
ç”Þq¼–译器自动选择一个éžå¸¸å¥½çš„æ‰“包方法是比较困难的。很å¯èƒ½éœ€è¦åœ¨åº”ç”¨å¼€å‘æ—¶˜q›è¡Œä¸€äº›è®¾å®šï¼Œòq¶ä¸æ—¶åœ°ç›‘控¾cÈš„引用。能够统计出最优的分拆æ–ÒŽ(gu¨©)³•åQšåº”用应该分æˆå‡ 个SWFåQŒå“ªäº›ç±»åº”该攑֜¨å“ªä¸ªSWFä¸ã€‚但是这¿U方法å¬èµäh¥æ›´è±¡æ˜¯ä¸€¿Uç ”½I¶èŒƒç•ß_¼Œå®žé™…æ“作èµäh¥éžå¸¸å›°éš¾ã€?/p>
让我们æ¥çœ‹ä¸€äº›æ›´å…ähœ‰æ“作性的æ–ÒŽ(gu¨©)³•ã€?/p>
很多应用分解åŽï¼ŒåŒ…å«ä¸¤ç§¾cÕdž‹çš„功能:“å¯åЍåŽç«‹å³å¡«å……â€å’Œâ€œå¯åŠ¨åŽ½EåŽå¡«å……â€ã€?/p>
有许许多多的应用是这¿U模å¼çš„。比如:游æˆåQ›ä½ 有一个游æˆå¼•擎和一些游æˆåœºæ™¯ã€‚或者Portalså’ŒPorlets; 一些基¼‹€çš„共享功能和数æ®é©±åŠ¨çš„å°åº”用。或者是一个大型的有ç€1500个页é¢çš„ä¿é™©åº”用åQŒè¿è¡Œç‰¹å®šåŠŸèƒ½æ˜¯åªä¼šè®‰K—®ä¸€ž®éƒ¨åˆ†çš„™åµé¢ã€‚或者是充斥大é‡å†…容的应用,它å¯ä»¥ç‹¬ç«‹çš„æ›´æ–°éƒ¨åˆ†å†…å®¹è€Œä¸æ˜¯å¼ºåˆ¶ç”¨æˆäh¯‹Æ¡æµè§ˆæ—¶éƒ½å¿…™åÖM¸‹è½½å…¨éƒ¨å†…å®V€?/p>
我称˜q™äº›ç›¸å¯¹ç‹¬ç«‹çš„å¯ä»¥åšg˜qŸåŠ è½½çš„åŠŸèƒ½ä¸ºâ€œæ¨¡å—â€?Modules)åQŒç§°åŠ è²æ¨¡å—çš„åº”ç”¨äØ“â€œShellâ€ã€?/p>
在这里,我们先ä¸çœ‹å¦‚何åšåQŒå…ˆæ¥çœ‹ä¸€äº?/p>
shell需è¦èƒ½å¤Ÿä¸Žæ¨¡å—交互åQŒåŒæ äh¨¡å—也需è¦å’ŒShell交互。如果shell引用了modules的一个类åQŒé‚£ä¹ˆå®ƒä¼šæŠŠå®ƒé“¾æŽ¥è¿›æ¥ã€‚åŒæ øP¼Œå¦‚果模嗾cÕd¼•用了shell¾c»ï¼Œå®ƒä¹Ÿä¼šæŠŠå®ƒé“¾æŽ¥è¿›æ¥ã€‚应用能æ£å¸¸˜qè¡Œåªæœ‰ä¸¤ä¸ªæ–ÒŽ(gu¨©)³•åQšæˆ–è€…å¼•ç”¨æ˜¯ç›¸åŒè€Œä¸”å…׃ínçš?˜q™æ ·ž®×ƒ¸éœ€è¦ä¸‹è½½ä¸¤‹Æ?åQŒæˆ–者两者是ä¸åŒçš„,而且没有ä»ÖM½•关系(ž®½ç®¡ä¸¤ä¸ª¾cÕdå—相åŒï¼Œä½†æ˜¯å®ƒä»¬è¢«è®¤ä¸ºæ˜¯æ— 关的,而且ä¸èƒ½äº¤äº’)ã€?/p>
最好的解决办法是让模å—å’Œshell通过接å£äº¤äº’ã€‚è¿™æ øP¼Œshellä¸éœ€è¦å¼•用模å—,而是引用模å—会实现的一些接å£ã€‚åŒæ øP¼Œæ¨¡å—ä¸å®žçްshell的类åQŒè€Œæ˜¯å…许调用的API接å£ã€?/p>
˜q™æ ·åœ¨shellå˜åŒ–的时候凞®‘äº†é‡æ–°¾~–译模å—的次数。具体实现的å˜åŒ–é¢‘çŽ‡å¾€å¾€ä¼šæ¯”æŽ¥å£æœ¬èínçš„å˜åŒ–高得多åQŒè€Œåªè¦æŽ¥å£ç¨³å®šï¼Œž®×ƒ¸éœ€è¦é‡æ–°ç¼–译所有的东西ã€?/p>
注æ„åQšéœ€è¦ä‹É用externåQˆæˆ–者extern-library-path)选项æ¥åˆ›å»ºæ¨¡å—,˜q™æ ·å¯ä»¥è‡ªåЍ剔除shell的类åQŒå› ä¸ºæ¨¡å—æ˜¯è¢«åŠ è½½åˆ°shellçš„å应用域ä¸çš„,ž®†shell的类剔除是安全的。这æ äh¨¡å—å¯ä»¥çœŸæ£ç›´æŽ¥å¼•用shellä¸çš„¾c…R€?/p>
Â
è®îC½SWCæ–‡äšg是一个包å«SWFæ–‡äšg的二˜q›åˆ¶æ–‡äšgåQŒè€ŒSWFæ–‡äšg包嫘q行时的定义和附属元数æ®ã€‚ä½ å¯ä»¥ç”¨åŽ‹¾~©å·¥å…äh¯”如WinZipæ¥æ‰“å¼€SWCæ–‡äšgã€?br />在ä‹É用RSL之å‰åQŒé¦–先需è¦äº†è§£å¦‚何陿€é“¾æŽ¥ä¸€ä¸ªSWCæ–‡äšgã€?/p>
在这个例åä¸åQŒåº”用有一个app.mxmlæ–‡äšgåQŒä‹É用ProductConfigurator.aså’ŒProductView.as。文件目录如下:
project/src/app.mxml
project/libsrc/ProductConfigurator.as
project/libsrc/ProductView.as
project/lib/
project/bin/
¾~–译˜q™ä¸ªåº”用æ—Óž¼Œå¯ä»¥ä½¿ç”¨source-path选项ž®?libsrc目录下的¾c»é“¾æŽ¥è¿›æ¥ï¼Œæ–ÒŽ(gu¨©)³•如下åQ?/p>
cd project/src
mxmlc -o=../bin/app.swf -source-path+=../libsrc app.mxml
˜q™ä¸ªå‘½ä×oæ·ÕdŠ ProductConfiguratorå’ŒProductView¾cÕdˆ°SWFæ–‡äšgä¸ã€?/p>
如果è¦åˆ›å»ºåº“åQŒå¯ä»¥ç”¨compcæ¥åˆ›å»ºSWCæ–‡äšgåQŒç”¨ä¸‹é¢çš„命令:
cd project
compc -source-path+=libsrc -debug=false -o=lib/mylib.swc
ProductConfigurator ProductView
注æ„è¦å°†debug选项讄¡½®ä¸ºfalse. 生戾l“果是project/lib/mylib.swcæ–‡äšgåQŒåŒ…å«ProductConfiguratorå’ŒProductView两个¾c…R€?/p>
现在å¯ä»¥ä½¿ç”¨æ–°åˆ›å»ºçš„库æ¥é‡æ–°¾~–译应用åQŒç”¨library-pathé€‰é¡¹æ¥æŒ‡å®šåº“åQŒæ–¹æ³•如下:
cd project/src
mxmlc -o=../bin/app.swf -library-path+=../lib/mylib.swc app.mxml
创å¾åº“以åŽï¼Œä½ å¯ä»¥ç”¨RSLæ¥é‡æ–°ç¼–译生æˆåº”用。完整的æ¥éª¤å¦‚下åQ?/p>
  1. 指示¾~–译器ä¸è¦å°†åº“链接到应用ä¸ã€?br />  2. 准备RSLåQŒä»¥ä¾¿äºŽåœ¨è¿è¡Œæ—¶ä½¿ç”¨ã€?br />  3. 指示¾~–译器生æˆé™„åŠ å…ƒæ•°æ®ç”¨äºŽåŠ è²RSLã€?/p>
½W¬ä¸€æ¥æ˜¯æŒ‡å®š¾~–译生æˆåº”用时库ä¸çš„哪些¾c»éœ€è¦æŽ’é™¤åœ¨å¤–ã€‚ä¸»è¦æ˜¯ä½¿ç”¨external-library-path选项åQŒå¦‚下é¢çš„例忉€½Cºï¼š
cd project/src
mxmlc -o=../bin/app.swf -external-library-path+=../lib/mylib.swc app.mxml
å¦‚æžœä½ å°è¯•è¿è¡Œapp.swfåQŒFlash Player会抛å‡ÞZ¸€ä¸ªè¿è¡Œæ—¶å¼‚å¸¸ã€‚å› ä¸ºProductConfiguratorå’ŒProductView¾c»è¿˜æœªå®šä¹‰ã€‚external-library-pathé…置选项告诉¾~–译器编译这些库åQŒä½†æ˜¯å¿½ç•¥äº†å®šä¹‰ã€‚ä½ ä¹Ÿå¯ä»¥ä‹É用externs选项åQŒä½†æ˜¯ä¸€èˆ¬æ¥è¯ß_¼Œä½¿ç”¨external-library-pathæ›´æ–¹ä¾Ñ€?/p>
ä¸‹ä¸€æ¥æ˜¯å‡†å¤‡RSL以便于能在è¿è¡Œæ—¶æ‰‘Öˆ°å®ƒã€‚首先从SWCæ–‡äšgä¸å°†library.swf解压出æ¥ã€?/p>
䏋颿˜¯å¦‚何解压的例ååQ?/p>
cd project/lib
unzip mylib.swc library.swf
mv library.swf ../bin/myrsl.swf
æ¤ä¾‹å丞®†library.swfæ›´å为myrsl.swfåQŒåƈ把它¿UÕdŠ¨åˆ°åº”ç”¨SWFæ–‡äšg所在的目录ã€?/p>
最åŽä¸€æ¥æ˜¯ä½¿ç”¨RSL釿–°¾~–è¯‘åº”ç”¨ã€‚ä¸»è¦æ˜¯ä½¿ç”¨runtime-shared-libraries选项åQŒæ–¹æ³•如下:
cd project/src
mxmlc -o=../bin/app.swf -external-library-path+=../lib/mylib.swc
-runtime-shared-libraries=myrsl.swf app.mxml
现在新的SWFæ–‡äšg会在˜q行应用å‰åЍæ€åŠ è½½RSL了ã€?/p>
   * runtime-shared-libraries æä¾›˜q行˜q行时共享库的佾|?
   * external-library-path|externs|load-externs æä¾›¾~–译时库的佾|? ¾~–译器需è¦è¿™ä¸ªä¿¡æ¯åЍæ€é“¾æŽ?
使用runtime-shared-librariesé€‰é¡¹æ¥æŒ‡å®šSWFæ–‡äšg的佾|? ˜q™æ ·åº”用能够在è¿è¡Œæ—¶åŠ è²RSL. éœ€è¦æŒ‡å®šSWF与部¾|²ä½¾|®çš„相对路径. 比如: 如果把library.swfæ–‡äšg攑֜¨web_root/libraries目录ä¸? 而应用在web_root目录ä¸? 那么文äšg的指定方法是: libraries/library.swf
å¯ä»¥ç”¨è¿™ä¸ªé€‰é¡¹æŒ‡å®šå¤šä¸ªåº? 如果指定了多个库, 需è¦ç”¨é€—å·åˆ†éš”.
使用external-library-pathé€‰é¡¹æ¥æŒ‡å®šlibrary在编译时的SWCæ–‡äšg或者目录的ä½ç½®. ¾~–译器会在编译时æ ÒŽ(gu¨©)®˜q™ä¸ªé€‰é¡¹˜q›è¡Œé“¾æŽ¥çš„æ£€æŸ? ä½ è¿˜å¯ä»¥ä½¿ç”¨externs或者load-externsé€‰é¡¹æ¥æŒ‡å®šå…¶ä»–å•独的classes或者xmlæ–‡äšgæ¥å®šä¹‰åº“的内å®?
䏋颿˜¯ä¸€ä¸ªç¼–译MyApp应用的命令行½CÞZ¾‹, å…¶ä¸ä½¿ç”¨äº?个库:
mxmlc -runtime-shared-libraries=
../libraries/CustomCellRenderer/library.swf,
../libraries/CustomDataGrid/library.swf
-external-library-path=../libraries/CustomCellRenderer,
../libraries/CustomDataGrid MyApp.mxml
库的™åºåºéžå¸¸é‡è¦, å› äØ“åŸºç¡€¾cÕd¿…™åÕd…ˆåŠ è².
ä½ å…ˆå¯ä»¥ä½¿ç”¨é…置文äšg, ½CÞZ¾‹å¦‚下:
<compiler>
   <external-library-path>
       <path-element>../libraries/CustomCellRenderer</path-element>
       <path-element>../libraries/CustomDataGrid</path-element>
       <path-element>../libs/playerglobal.swc</path-element>
   </external-library-path>
</compiler>
<runtime-shared-libraries>
   <url>../libraries/CustomCellRenderer/library.swf</url>
   <url>../libraries/CustomDataGrid/library.swf</url>
</runtime-shared-libraries>
runtime-shared-libraries选项值是library.swfæ–‡äšg是相寚wƒ¨¾|²ç›®å½•的路径. external-library-path选项是编译时SWCæ–‡äšgçš„èµ\å¾? å› æ¤, 必须先知é“库的部¾|²èµ\å¾?
Â
½CÞZ¾‹ä¸? ¾~–译时文件结构如ä¸?
c:/appfiles/MyApp.mxml
c:/libraries/CustomCellRenderer/CustomCellRenderer.swc
c:/libraries/CustomDataGrid/CustomDataGrid.swc
library.swfåœ¨ç¼–è¯‘è¿›ä¸æ˜¯å¿…需çš? Flex¾~–译器ä¸éªŒè¯SWFæ–‡äšgçš„å˜åœ¨ä¸Žå? 但会把èµ\径信æ¯ç¼–译进行最åŽçš„应用代ç ä¸?
æ–‡äšg的部¾|²ç»“构如ä¸?
web_root/MyApp.swf
web_root/libraries/CustomCellRenderer/library.swf
web_root/libraries/CustomDataGrid/library.swf
Â
å¯ä»¥ä½¿ç”¨Flex Builder或者Compc命ä×o行æ¥åˆ›å¾åº? 库å¯ä»¥æ˜¯ä¸€ä¸ªSWCæ–‡äšg, 或者是包å«äº†library.swfå’Œcatalog.xmlæ–‡äšg的目å½? 一个库通常包å«è‡ªå®šä¹‰ç»„ä»¶å’Œ¾c? 然厞®±å¯ä»¥åœ¨RSLä¸ä‹É用这些库äº?
在Flex Bulderä¸? 通过使用Flex Library Build Pathå¯¹è¯æ¡†æ¥æ·ÕdŠ èµ„æºåˆ°åº“ä¸?
在命令行ä¸? 使用include-classeså’Œinclude-namespacesé€‰é¡¹æ¥æ·»åŠ æ–‡ä»¶åˆ°åº“ä¸.
下é¢çš„命令行½CÞZ¾‹è¯´æ˜Žäº†å¦‚何创å»ÞZ¸€ä¸ªåå—å«CustomCellRenderer的库:
compc -source-path ../mycomponents/components/local
-include-classes CustomCellRendererComponent -directory=true -debug=false
-output ../libraries/CustomCellRenderer
所有包å«çš„¾l„äšgå¿…é¡»æ˜¯é™æ€é“¾æŽ¥çš„æ–‡äšg. 使用compc¾~–译器创建库æ—? ä¸èƒ½ä½¿ç”¨include-file选项, å› äØ“˜q™ä¸ªé€‰é¡¹ä¸æ˜¯ž®†library.swfæ–‡äšg陿€é“¾æŽ¥åˆ°åº“ä¸çš?
å¯ä»¥ä½¿ç”¨directory选项指定输出åˆîC¸€ä¸ªç›®å½•è€Œä¸æ˜¯åˆ°ä¸€ä¸ªSWCæ–‡äšgä¸?
<?xml version="1.0">
<flex-config>
   <compiler>
       <source-path>
           <path-element>mycomponents/components/local</path-element>
       </source-path>
   </compiler>
   <output>libraries/CustomCellRenderer</output>
   <directory>true</directory>
   <debug>false</false>
   <include-classes>
       <class>CustomCellRendererComponent</class>
   </include-classes>
</flex-config>
输出会是一个目å½?目录里包å«ä¸¤ä¸ªæ–‡ä»?br />   * catalog.xml
   * library.swf
创å¾library.swfæ–‡äšgå? ä½ å¯ä»¥ç¼–è¯‘åº”ç”¨åÆˆä¸”æŒ‡å®šæ–‡ä»¶çš„ä½ç½®.
Flex and Flash provide a complete, unlimited, flexible tool to build user experiences. From the standpoint of a programmer’s time investment, you can learn a single language for building UIs without worrying about running into problems or limitations later—issues like:
原文链接:
http://www.artima.com/weblogs/viewpost.jsp?thread=193593
Computing Thoughts
Hybridizing Java
by Bruce Eckel
January 30, 2007
RSLä¹Ÿä¸æ˜¯å¯¹äºŽæ‰€æœ‰çš„应用都是有益çš? 需è¦å¯¹åº”用RSLå‰åŽçš„下载时间和å¯åŠ¨æ—‰™—´éƒ½æµ‹è¯•过, æ‰èƒ½å¾—到æ£ç¡®çš„结è®?
RSLä¸èƒ½è·¨åŸŸå…׃ín. 如果客户在一个域ä¸ä‹É用了RSL, 然厘q行了å¦ä¸€ä¸ªåŸŸçš„应ç”? 虽然˜q™ä¸¤ä¸ªRSL是相åŒçš„, 但是需è¦ä¸‹è½½ä¸¤‹Æ?
RSLé€šå¸¸ä¼šå¢žåŠ åº”ç”¨çš„å¯åŠ¨æ—‰™—´. ˜q™æ˜¯åº”用ä¸ç®¡æ•´ä¸ªåº“实际如何ä‹Éç”? åªæ˜¯½Ž€å•åœ°å…¨éƒ¨åŠ è²æ•´ä¸ªåº? ž®Þp¿™ä¸€ç‚ÒŽ(gu¨©)¥è¯? RSL‘Šå°‘Šå¥½. ˜q™ä¸Žé™æ€é“¾æŽ¥åº“çš„ä‹É用是ä¸åŒçš? å½“ä½ ¾~–译一个Felx应用æ—? ¾~–译器åªè§£å¼€éœ€è¦çš„¾l„äšg. 一般æ¥è¯? 库的大å°å¯ä»¥æ˜¯ä“Qæ„çš„, 它åªå½±å“¾~–译旉™—´è€Œä¸ä¼šåª„å“下载的旉™—´.
å¦‚æžœåœ¨å¥½å‡ ä¸ªåº”ç”¨ä¸ä‹É用相åŒçš„¾l„äšgåº? 那么å¯ä»¥è€ƒè™‘åˆåƈ˜q™äº›åº? å½¢æˆä¸€ä¸ªRSL. 但是如果库åˆòq¶åŽ, æ¯ä¸ªåº”用åªä¼šç”¨åˆ°å…¶ä¸çš„一ž®éƒ¨åˆ? 那么˜q˜ä¸å¦‚å¤šåŠ è²å‡ 个ž®RSL更高æ•?
如果一些类é‡å¤æ‰“包在多个RSLä¸? é‚£ä¹ˆä¸€å®šè¦æ³¨æ„åŒæ¥æ›´æ–°çš„é—®é¢?
RSLä¸èƒ½åº”用在基¾cÀL˜¯Sprite或者MovieClip的纯ActionScript™å¹ç›®ä¸? å› äØ“RSL需è¦åŸº¾cÈŸ¥é“å¦‚ä½•åŠ è½½RSL, 比如: Application或者SimpleApplication.
关于 framework.swcæ–‡äšg
framework.swcæ˜¯ä¸€ä¸ªæ ‡å‡†çš„SWCæ–‡äšg. ¾~ºçœåœ°å®ƒä¸èƒ½ç”¨ä½œRSL. 整个framwork.swcæ–‡äšgä¸è¢«é“¾æŽ¥åˆîC“Q何一个应用ä¸. Flex¾~–译器媞®†é‚£äº›åº”ç”¨ç”¨åˆ°çš„éƒ¨åˆ†é“¾æŽ¥åˆ°ç”Ÿæˆæœ€åŽçš„SWFæ–‡äšg. 比如: 如果一个应用åªä½¿ç”¨äº†Button, Panelå’ŒTextArea控äšg, é‚£ä¹ˆåªæœ‰˜q™å‡ 个控件和它们的ä¾èµ–项被编译器链接.
å‡ ä¹Žæ‰€æœ‰çš„åº”ç”¨éƒ½éœ€è¦framework.swcæ–‡äšg的一部分, ä½†æ˜¯å®ƒåÆˆä¸é€‚åˆä½œäØ“RSL. åŽŸå› å¦‚ä¸Šæ®è¯´, RSL是整个链æŽ? ä¸ç®¡å®žé™…使用多少çš? 如果RSL包å«äº†å¾ˆå¤šç±», 而应用åªä½¿ç”¨äº†å…¶ä¸çš„一ž®éƒ¨åˆ? 那么˜q™æ ·çš„åŠ è½½æ–¹å¼åÆˆä¸æ˜¯æœ€åˆç†çš? ˜q™æ ·ä½¿ç”¨ä¼šé€ æˆåº”用的å¯åŠ¨æ—¶é—´å¤§å¤§å¢žåŠ?
RSL的优�/p>
下é¢çš„一个例å说明了ž®†å‡ 个的å…׃ín¾l„äšgåšæˆRSL的优ç‚? 在这个例åä¸, ¾l„äšgåº“çš„å¤§å°æ˜?50K, ¾~–译åŽçš„应用的大ž®æ˜¯100K. Â
使用了RSL, RSLåªè¢«ä¸‹è²ä¸€‹Æ? 那么åˆè®¡ä¸‹è²é‡æ˜¯350K, 节约äº?0%. å¦‚æžœå†æ·»åŠ ç¬¬3ä¸? ½W?个应用的è¯? æ¯æ¬¡éƒ½èƒ½150K的下载é‡.
一般æ¥è¯? 在一个域ä¸ä‹É用åŒä¸€ä¸ªRSL的应用越å¤? 那么好处ž®Þp¶Šå¤?
å½“ä½ ä½¿ç”¨é™æ€é“¾æŽ¥æ—¶, ¾~–è¯‘å™¨å°†åº”ç”¨ä¸æ‰€æœ‰å¼•用的¾cÕd’Œä¾èµ–生æˆåˆ°æœ€¾lˆçš„SWFæ–‡äšgä¸? ˜q™ä¸ªæ–‡äšg会比较大, 下è²ä¹Ÿä¼šæ¯”较æ…? 但是下è²å®Œæ¯•å? ˜q行会比较快, å› äØ“SWFæ–‡äšgä¸å·²¾l包å«äº†æ‰€æœ‰çš„代ç .
å¦‚æžœä½ çš„åº”ç”¨ä¸ä‹É用了¾cÕdº“, é‚£ä¹ˆä½ éœ€è¦ä‹É用类路径或者是æ·ÕdŠ SWCæ–‡äšg. 如果是ä‹É用类路径, ¾~–译器会ž®†ç±»è·¯å¾„ä¸ç”¨åˆ°çš„那部分类打包生æˆåˆ°SWFæ–‡äšgä¸? 如果是ä‹É用SWCæ–‡äšg, ¾~–译器会ž®†æ•´ä¸ªSWCæ–‡äšg打包到SWFæ–‡äšgä¸?
动æ€é“¾æŽ¥æ˜¯˜q™æ ·çš? 一个应用è¦ä½¿ç”¨çš„一部分¾cÕd˜åœ¨äºŽä¸€ä¸ªå¤–部的文äšgä¸? ˜q行时动æ€åŠ è½? ˜q™æ ·çš„è¯, 主SWFæ–‡äšgå¯ä»¥ž®ä¸€äº? 但是应用ä¾èµ–于è¿è¡Œæ—¶åŠ è²çš„外部文ä»? RSLž®±æ˜¯ä½¿ç”¨åЍæ€é“¾æŽ¥çš„.
如果想ä‹É用动æ€é“¾æŽ¥ç±», éœ€è¦æŠŠå®ƒä»¬¾~–译æˆåº“. 然厾~–译器将库ä¸çš„内容从SWFæ–‡äšg剔除出去. 而且必须在编译时æä¾›é“¾æŽ¥‹‚€æŸ?
为指定哪些文件是动æ€é“¾æŽ¥çš„,需è¦ä‹É用外部库路径选项,å¤–éƒ¨é€‰é¡¹æˆ–è€…å¤–éƒ¨åŠ è½½ç¼–è¯‘é€‰é¡¹. ˜q™äº›é€‰é¡¹å‘Šè¯‰¾~–译器从应用ä¸å޻除æ¤éƒ¨åˆ†å†…容, 而预备在˜q行时调ç”? 外部选项为动æ€é“¾æŽ¥æŒ‡å®šäº†å•独的类. å¤–éƒ¨åŠ è²é€‰é¡¹æŒ‡å®šäº†ä¸€ä¸ªXMLæ–‡äšg, æè¿°äº†åЍæ€é“¾æŽ¥çš„¾c?
指定SL的外部资æºçš„™åºåºæ˜¯éžå¸¸å…³é”®çš„, å› äØ“è¢«å…¶ä»–ç±»è°ƒç”¨çš„åŸº¼‹€¾cÕd¿…™å»è¢«é¦–å…ˆåŠ è².
ä½ è¿˜è¦ç”¨runtime-shared-librariesé€‰é¡¹æ¥æŒ‡å®šRSL的佾|?
ä½ å¯ä»¥ä‹É用link-report˜q™ä¸ª¾~–è¯‘é€‰é¡¹æ¥æŸ¥çœ‹åº”用的链接信æ¯.
å¦‚æžœä½ æœ‰å¤šä¸ªåº”ç”¨è€Œä¸”˜q™äº›åº”用å…׃ínä¸€äº›æ ¸å¿ƒç»„ä»¶æˆ–è€…ç±», é‚£ä¹ˆä½œäØ“RSL,用户åªä¼šå”¯ä¸€çš„一‹Æ¡åŠ è½½è¿™äº›èµ„æº? åªè¦åº”用在åŒä¸€ä¸ªåŸŸä¸? ˜q™äº›åº”用å…׃ínåŒä¸€ä¸ªç¼“å˜çš„RSL, ˜q™æ ·åº”用文äšg的大ž®å°±å‡å°äº? 使用RSL的应用越å¤? 效果‘Šå¥½, å¦‚æžœåªæœ‰ä¸€ä¸ªåº”ç”? æ€Èš„æ–‡äšg大å°ä¸ä½†ä¸å‡ž®?å而会增大.
ä½ æ—¢å¯ä»¥ä½¿ç”¨Flex Builder通过™å¹ç›®é€‰é¡¹æ¥åˆ›å»ºFlexçš„Library™å¹ç›®,也å¯ä»¥ä‹É用compc˜q™æ ·çš„命令行. ¾~–译好RSL以åŽ, å¯ä»¥åœ¨ç¼–译应用时把Library的佾|®ä¼ 递给¾~–译å™?
䏋颿˜¯é€‚åˆä½¿ç”¨RSL的典型用ä¾?
   * 大型应用, 需è¦ä‹É用通用¾l„äšgåº“åŠ è½½å¤šä¸ªå°åž‹åº”ç”? 最™å¶çñ”的应用和下çñ”应用å¯ä»¥å…׃ínå˜å‚¨åœ¨RSLä¸çš„¾l„äšg.
   * 在一个æœåŠ¡å™¨ä¸Šçš„ä½¿ç”¨é€šç”¨¾l„äšg库的¾pÕdˆ—应用. 当用æˆäh“作第一个应用时, 用户下è²åº”用的SWFæ–‡äšgå’ŒRSL. 当æ“作第二个应用æ—? 用户ž®±åªéœ€è¦ä¸‹è½½åº”用本íw«çš„SWFæ–‡äšgž®Þp¡Œäº?
   Â
   * 一个独立的应用使用RSLçš„æ„义在äº? 如果˜q™ä¸ªåº”用本èín会频¾J的修改, 而有一部分¾l„äšg是枞®‘改动的. 在这¿U情况下, 使用RSL的好处是: ¾l„äšg下è²ä¸€‹Æ? 而应用å¯ä»¥å¤š‹Æ¡ä¸‹è½?
Â
3) 也ä¸è¦ç”¨*¾cÕdž‹ã€?/p>
4) ä¸è¦ž®†ActionScript的类声明为动æ€ã€?/p>
5) 注æ„Application.application (å’Œå…¶ä»–çš„æ— ç±»åž‹çš„æ¡†æž¶å±žæ€?. ˜q™ä¸ªå±žæ€§æœ‰ä¸€äº›å¤æ€?  他应该是Applicaton¾cÕdž‹çš„ï¼Œå› äØ“ä»–æŒ‡å‘的实例必须是Applicationçš„å¾c? 但实际上他的¾cÕdž‹æ˜?Object', æ— æ³•åº”ç”¨¾~–译时的‹‚€æŸ¥ã€‚å¦‚æžœä½ ä¸€å®šè¦ç”¨ï¼Œæœ€å¥½ä¹Ÿ˜q›è¡Œ¾cÕdž‹çš„强制性è{æ¢ã€?
MyApplication( Application.application ).functionCall();
6) ž®è£…ä½ çš„Xml。ä‹É用Xml与Server˜q›è¡Œæ•°æ®çš„交互éžå¸¸æ–¹ä¾¿ï¼Œä½†æ˜¯ž®½é‡é¿å…使用Xmlä½œäØ“æ ¸å¿ƒæ•°æ®æ¨¡åž‹ã€‚从æœåŠ¡å™¨æ”¶åˆ°æ•°æ®åŽåQŒå°½é‡æŠŠXml转æ¢ä¸ºå¼º¾cÕdž‹çš„对象模型。在Flex应用内部使用Xml是绕开¾~–译器的作法ã€?
7) ä¸è¦ä½¿ç”¨DynamicEvent.
8) ä¸è¦ä½¿ç”¨mx:Model。如上所˜qŽÍ¼Œè¯·å°½é‡ä‹É用自定义的强¾cÕdž‹çš„ç±».
9) ä¸è¦ä½¿ç”¨Cairngormä¸çš„data属性,而应该ç‘ô承扩展CairngormEventæ¥ä¼ 递数æ®ã€?/p>
10) ä¸è¦æŠŠç¼–è¯‘å™¨çš„ä¸¥æ ¼æ¨¡å¼å…³æŽ?/p>
          var label:String = childItem[tree.labelField];
          var branch:Boolean = descriptor.isBranch(childItem);
         Â
          // good place for a custom method()
          trace("Sibling Nodes :: ", label, "Is Branch :: ", branch);
         Â
          // if the child item is a branch
          if(descriptor.isBranch(childItem))
            // traverse the childs branch all the way down
            // before returning
            walkTree(tree, childItem);
          // do it again!
          cursor.moveNext();
        }
      }
    }
  }
  else// we don't want the parent OR this is the second iteration
  {
    // if we are a branch
    if(descriptor.isBranch(item))
    {
      // if the branch has children to run through
      if(descriptor.hasChildren(item))
      {
        // get the children of the branch
        childItems = descriptor.getChildren(item);
      }
     Â
      // if the child items exist
      if(childItems)
      {
        // create our cursor pointer
        cursor = childItems.createCursor();
        // loop through all of the children
        // if one of these children are a branch we will recurse
        while(!cursor.afterLast)
        {
          // get the current child item
          childItem = cursor.current;
          var label:String = childItem[tree.labelField];
          var branch:Boolean = descriptor.isBranch(childItem);
         Â
          // good place for a custom method()
          trace("-- Sub Node :: ", label, "Is Branch :: ", branch);
          // if the child item is a branch
          if(descriptor.isBranch(childItem))
            // traverse the childs branch all the way down
            // before returning
            walkTree(tree, childItem);
          // check the next child
          cursor.moveNext();
        }
      }
    }
  }
}
Â
Â
在Flex的开å‘过½E‹ä¸åQŒå°¤å…¶æ˜¯åœ¨ä‹É用Cairngorm的时候,æ€ÖM¼šé‡åˆ°éœ€è¦åœ¨Model的属性值改å˜åŽåQŒéœ€è¦è°ƒç”¨ä¸€ä¸ªæŒ‡å®šçš„å‡½æ•°ã€‚ä¼ ¾lŸçš„解决æ–ÒŽ(gu¨©)³•是ä‹É用一个Setteræ–ÒŽ(gu¨©)³•åQŒåœ¨˜q™ä¸ªæ–ÒŽ(gu¨©)³•ä¸é¦–先对属性赋å€û|¼Œç„¶åŽè°ƒç”¨æŒ‡å®šçš„函敎ͼŒæ¯”如åQ?/p>
---------------------------
[ChangeEvent("deleteEnabledChange")]
public function get deleteEnabled() : Boolean {
return _deleteButtonVisible;
}
public function set deleteEnabled(value : Boolean) : Void {
_deleteButtonVisible = value;
SimpleButton(deleteButton)._visible = false;
dispatchEvent(new Event("deleteEnabledChange", this));
}
--------------
但是现在我们有一个更½Ž€‹z的解决之é“
首先æ·ÕdŠ ˜q™æ ·ä¸€ä¸ªç±»
package com.adobe.ac.util
{
  public class Observe
  {
     public var handler : Function;
Â
     public function set source( source : * ) : void
     {
        handler.call();
     }
  }
}
然厞®±å¯ä»¥ä‹Éç”¨è¿™ä¸ªä½œä¸ºæ ‡½{¾äº†ã€?br /><util:Observe source="{ model.myProperty }"
             handler="{ this.myFunction }"/>
使用了这æ ïL(f¨¥ng)š„ä¸€ä¸ªæ ‡½{‘ÖŽåQŒä»ŠåŽå˜¦æ˜¯å¯¹model.myProperty˜q›è¡Œèµ‹å€û|¼Œž®×ƒ¼šè°ƒç”¨myFunction
˜q™ä¸ªåïL(f¨¥ng)§°ä¸–上最ž®çš„æ ‡ç¾æ˜¯ä¸æ˜¯å¾ˆå¥½ç”¨å•Šï¼Ÿ
Â
Â
å¢žåŠ éªŒè¯
我们现在æ·ÕdŠ å¯¹è‚¡¼œ¨æŠ¥ä»ïL(f¨¥ng)š„验è¯åŠŸèƒ½åQŒå¯¹äºŽè¿™ä¸€ç‚¹ï¼Œæˆ‘们å¯ä»¥ä½¿ç”¨mx.validators.StringValidatoræ¥å®Œæˆè¿™ä¸€åŠŸèƒ½ã€‚åº”ç”¨ä¸˜q™ä¸¤ä¸ªå‚æ•°å…±åŒæŽ§åˆ¶æŒ‰é’®çš„æœ‰æ•ˆæ€§ã€‚è¿™æ ·å¯ä»¥åœ¨Model对象ä¸è®¾¾|®ä¸€ä¸ªisValid属性,用于¾l„刘q™ä¸¤å‚æ•°ã€?br />
isSymbolValidæ˜¯ä¸€ä¸ªå±žæ€§ï¼Œå˜æ”¾StringValidator的结果ã€?br />在StockMarketPod.mxml䏿·»åŠ mx:StringValidator˜q™ä¸ªTag
从视图ä¸ç›´æŽ¥è°ƒç”¨Model对象ä¸ç¬¦åˆMVC原则åQŒå› 䏸™§†å›‘ÖŽŸåˆ™ä¸Šåªèƒ½‹z‘֑事äšg。但在这个例åä¸åQŒè¿™æ ·å·²¾lèƒö够好了ã€?/p>
å¢žåŠ æ ¼å¼åŒ?br />我们ž®†è‚¡¼œ¨æŠ¥ä»·ä»¥é‡‘é¢çš„æ–¹å¼è¿›è¡Œå±•½Cºï¼Œåœ¨StockMarketPod.mxmlä¸å¢žåŠ ä¸€ä¸ªformatter
现在看一下完整的StockQuote¾c?br />
å…¶ä¸isPending属性的值由GetStockQuoteCommand控制
最åŽçœ‹ä¸€ä¸‹StockMarketPod.mxml的全部代ç ?br />
æ¤è§†å›¾ä¸æˆ‘们ä¸éœ€è¦ä‹É用ModelLocatoråQŒè€Œæ˜¯ä½¿ç”¨StockQuoteä½œäØ“å‚æ•°ä¼ å…¥StockMarketPod.mxml
引用视图的代ç ?br />
Â
åªä¼ 递需è¦çš„信毾l™è§†å›¾æ˜¯ä¸€ä¸ªæ¯”è¾ƒå¥½çš„åšæ³•,而尽é‡å°‘使用ModelLocator˜q™æ ·çš„全局å˜é‡åQŒè¿™æ ·ä¹Ÿä½¿ç”¨è§†å›¾é‡ç”¨æ€§æ›´é«˜ã€?br />