一.引
很多新人對Flex的事件機制都不太熟悉,在使用過程中難免會出現各種問題,這是一個非常普遍的問題,為了更快更好的幫助大家,將介紹一下Flex中事件的各種機制和用法。
Flex的精髓之一就是事件和綁定機制,了解之后,能幫助大家更靈活的設計程序,也對新手上路有一定的幫助。
講解可能不太系統,也不全面,有很多沒有深入。如果高手看到后有疑問,歡迎指正。當然各位也可以提出自己的看法,或者經驗分享,謝謝。
二.事件機制介紹
1.????? 什么是事件機制
事件可以看作是一種觸發機制,當滿足了一定的條件后,會觸發這個事件。比如MouseEvent就是指的當鼠標進行操作之后觸發的一系列的事件。很多控件中都有click事件,這個事件就是一個MouseEvent的實例,當點擊鼠標后,系統會自動拋出一個名稱為click的MouseEvent事件(這種方法我們將在后面介紹到)。如果此時在click上注冊一個方法,那么觸發該事件時就會執行這個方法。
大致示意圖
?
image001.png (14.50 K)
2007-11-23 15:28:46
該示意圖對應的Flex主應用的mxml代碼
[復制到剪貼板]
CODE:
<mx:Script>
????????? <![CDATA[
??????????????? import mx.controls.Alert;???????
??????????????? private function clickHandler(e:MouseEvent){
????????????????????? Alert.show(e.currentTarget.toString());
??????????????? }
????????? ]]>
</mx:Script>
<mx:Button id="testBtn" click="clickHandler(event)" label="測試">
</mx:Button>
在我們寫代碼時,編輯器的代碼補全提示列表中,有很多不同的圖標,如圖
?
image003.png (4.90 K)
2007-11-23 15:28:46
那些帶有閃電的就是事件,三個小塊的就是樣式,空心圓圈的是屬性,實心圓點的是公有方法,還有一個是效果。
我們能在這個列表中看到的事件,我把它稱之為事件注冊通道。(官方仍然稱它為事件,但是它又和普通的事件含義不同。關于事件注冊通道會再下面講述到)
2.????? 事件注冊通道
上面說到了,這些通道是只能在mxml的代碼提示中可以看到的,他的作用就是給mxml組件提供 事件觸發時所執行的方法的注冊通道,而且能在代碼提示中可見,這樣給組件提供了很大的抽象的好處,我們可以很清楚的告訴組件的使用者,組件里包含哪些事件給你調用。
為什么把他區別對待?除了代碼提示外,他還有一些實現上的不同。
Button的click事件是繼承自核心類InteractiveObject,遺憾我們看不到他的源碼,但是說明了“事件注冊通道”是可以繼承的。
我們會在自定義事件中講述到如何聲明“事件注冊通道”。
3.????? 事件觸發方法
注冊通道中如果填入了函數,那么就代表觸發該事件時,會執行這個方法。
click="clickHandler(event)"
我們看到這個方法有一個event對象作為參數傳入,新人可能會問到,這個event對象哪里來的?我也沒聲明這個變量啊。他實際上是注冊通道傳給他的,默認變量名就是event。我們如果想在事件觸發時傳其他的參數,可以通過自定的事件對象來實現。
這個對象就是這個組件分發的事件對象,即name為“click”的MouseEvent的一個實例。
這個event對象包含了觸發該事件時的各種信息,比如觸發對象是哪個,觸發時鼠標點在哪里等等,不同的event類會包含不同的屬性,比如KeyboardEvent包含了鍵盤點擊了哪個鍵。
我們也可以通過自定義一個事件類,來傳遞我們自己想要的各種信息。(這在后面將介紹到)
4.????? 事件分發(重點了)
最終繼承自EventDispatcher的對象都會含有dispatchEvent這個方法,他有一個參數,事件對象。
之前說到的事件注冊通道,他只是一個通道,實際上事件是由這個方法來分發出去的,通道只是一個管道而已。
他的作用就是分發一個事件對象,他的分發是沒有目的的,一種廣播形式的,Flex的事件監聽線程會接收到各種各樣的事件(我們稱之為捕獲事件,這在后面會介紹到),那么哪種才是你要的事件,標識就通過name來區分。
1)事件對象
在分發事件時,將會分發一個事件對象出去。不管是那個事件類,都是繼承自flash.events.Event對象的,他包含一些比較重要的屬性,name和bubbles。
Name是這個對象在被捕捉到時的憑證。
Bubbles是個布爾值,決定了該對象是否會向上傳遞。什么意思呢?畫個圖就明白了。
比如說,當button組件分發click事件對象時,設置的bubbles為false,那么他的分發是這樣的
示意代碼
dispatchEvent(new MouseEvent( “click” , false ));
?
image005.png (20.82 K)
2007-11-23 15:28:46
事件對象無法跨越組件本身,當然,除了之前講到的注冊通道(這樣就很形象了吧)
因此,如果沒有注冊通道,在Flex主應用中,就無法捕獲到這個button組件分發出的事件。
如果我們將Bubbles設為true,他看起來就是這樣
dispatchEvent(new MouseEvent( “click” , true ));
?
image007.png (25.61 K)
2007-11-23 15:28:46
可以看到,這個事件可以跨過組件本身,到達Flex主應用里。不止這樣,在幫助手冊中明確說到,如果在傳遞過程中間一直沒有被捕獲的話,這個事件會逐層上傳,直到最終的stage,那時如果還沒被捕獲,這個事件就會被銷毀掉。
這樣一來,即使我們沒有click的事件通道,只要我們在Flex主應用中添加事件監聽器(addEventListener)那么我們就可以獲得到這個分發出的click事件了。
那么,注冊通道不是沒用了嗎?不是,之前說到過,注冊通道是現式的,可見的,因此如果你的組件要給其他人使用,那么就非常一目了然,而不必知道你源碼中究竟分發了什么事件。但是,不要監聽和注冊同一個事件,這樣會重復執行的。(后面將講到)
5.????? 事件監聽
在分發中,我們講到,如果不是通過注冊通道來調用觸發事件,那么我們是需要一個監聽來捕捉的。如何捕捉到分發出的事件,就是通過事件的name值。
比如:
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" xmlns:comp
????? creati
>
<mx:Script>
??????????????? <![CDATA[
private function init(){
??????????????????? testBtn.addEventListener(“click”, clickHandler);
}
Flex的事件中都提供了一些靜態常量,讓我們調用,避免我們打錯了。因此這句話可以這么寫
testBtn.addEventListener(MouseEvent.CLICK,clickHandler);
我們看到,監聽的回調方法中沒有傳遞參數,是的,這和通道的寫法有些不同,這里的回調方法(即clickHandler)只是個引用,并不是代表方法的執行,他的含義是,告訴eventLinstener,如果捕捉到click事件,那么就去找clickHandler,并執行它,event對象參數在執行時動態的傳遞。(如果熟悉ajax的朋友這里應該很容易懂了)
他作用起來就是這樣
?
image009.png (40.46 K)
2007-11-23 15:28:46
如果你又注冊了click的事件通道,那么這兩個都會生效,顯然這是多余的。
????? 6.? 關于異步和執行順序
可以看到,事件的分發,和事件捕獲的回調(clickHandler)并不是同步的,因為在dispatchEvent之后,該線程不會停下來,等待listener捕捉,而是繼續做自己的事。
當你分發了click事件后,仍然會繼續執行click之后的操作,Lintenser是一個獨立的線程,他至始至終都在工作,當他捕捉到你add的事件后,則會去調用回調的函數。分發任何事件都是這樣。
異步示意圖
?
image011.png (6.01 K)
2007-11-23 15:28:46
上圖可以看出,回調方法執行的順序甚至還不如dispatchEvent之后的方法。如果接下來的方法依賴于事件回調,那么把接下來的方法寫到回調方法中去
?
image013.png (6.54 K)
2007-11-23 15:28:46
三.綁定機制
????? 在我們了解了事件機制后,那么理解綁定就不難了。綁定其實也是事件機制的運用
????? 1.? 什么是綁定
綁定的原理就是事件,在被綁定的對象上增加了改變事件的監聽,一旦某個被綁定對象改變后,就會分發一個“propertyChange”事件(默認的,也可以改變成自己定義的事件),在其他組件中,會有propertyChange的事件監聽,當捕捉到該事件后,則會去更新組件的屬性并顯示。
綁定的作用在于,將Flex中的變量、類、方法等與組件的值進行綁定。例如,一個變量如果被綁定后,那么引用該變量的組件的相關屬性也會發生改變。我們用一個實例來表示
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=http://www.adobe.com/2006/mxml layout="absolute" xmlns:comp
????? >
????? <mx:Script>
????????? <![CDATA[
??????????????? import mx.controls.Alert;???????????
??????????????? [Bindable]
??????????????? private var isSelected:Boolean;
??????????????? private function clickHandler(e:MouseEvent){
??????????????? //Alert.show(e.currentTarget.toString());
isSelected=isSelected?false:true; //這句話的意思是如果isSelected為true,改變它為false,如果它為false,改變它為true;
????????????????????? Alert.show(isSelected.toString());
??????????????? }
????????? ]]>
????? </mx:Script>
????? <mx:Button id="testBtn"? click="clickHandler(event)" label="測試" />
????? <mx:CheckBox x="60" selected="{isSelected}" />
</mx:Application>
上述程序的效果就是,當點擊button時,button不是直接改變checkbox的選中狀態,而是改變isSelected這個變量,由于isSelected是被綁定了的,那么會關聯的改變CheckBox的選中狀態。
這樣看起來有些多此一舉,完全可以直接改變checkbox的selected屬性,我只是為了演示一下效果。如果說你的checkbox是動態構造的上百個,你不會去一個個的改變他吧。
因此,我們多數會將一個數據源進行綁定聲明,這樣引用了這個數據源的控件,比如datagrid,在數據源發生了改變時,即使你不重新設置dataProvider,列表的數據也會刷新。當然,還有很多應用等待你去嘗試。
如果這個代碼中取消了[Bindable]的聲明,會怎么樣?isSelected不會改變了嗎?
isSelected會改變,我們alert出來的結果也會顯示結果改變了,但是checkbox的選擇狀態不會改變,因為當一個組件由創建到最終顯示出來時是經過很多方法的,比如addChild,commitProperties,updateDisplayList等,updataDisplayList則是類似刷新顯示效果一樣的方法。
僅僅改變屬性,而不去更新顯示效果那么組件不會因為屬性的改變而發生任何變化。
?
綁定的原理也是利用的事件分發。更復雜的綁定有待你去自己發現了
?
四.? 自定義事件的分發
????? 這部分就不長篇大論了,因為各位應該已經掌握了事件的原理,因此貼出演示源碼,并進行些簡單的解釋。
????? 1.? 自定義事件 components/MyEventTest.as
????? package components
{
????? import mx.events.FlexEvent;
????? public class MyEventTest extends FlexEvent
????? {
????????? public static const ONCHANGE:String = "onChange";
????????? public var eventInfo:String; //自定義的事件信息
????????? public function? MyEventTest(s:String){
??????????????? super(s); //如果在構造時不設bubbles,默認是false,也就是不能傳遞的。
??????????????? eventInfo="這個事件是:"+s;
????????? }
????? }
}
????????? 2.??????? 自定義組件 components/ComponentForEvent.as
package components
{
????? import flash.events.EventDispatcher;
????? //這個就是聲明事件注冊通道的方法了。Type是該事件的類
????? [Event(name="onChange", type="components.MyEventTest")]
????? public class ComponentForEvent extends EventDispatcher
????? {
????????? private var name:String;
????????? public function changeName(newName:String){
??????????????? this.name=newName;
??????????????? dispatchEvent(new MyEventTest(MyEventTest.ONCHANGE) );
????????? }
????? }
}
3.??????? App.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx=">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private function? changeName(){
??????????????????? cfe.changeName("新名稱");
}
??????????????? ]]>
</mx:Script>
<mx:Button id="testBtn"? click=" changeName ()" label="測試" />
<components:ComponentForEvent
id="cfe"? />
</mx:Application>
這幾年企業應用系統慢慢己從窗口桌面轉移到網頁平臺上,人們開始習慣在瀏覽器上購買商品、轉帳、繳費、甚至公司的入口網站也都是從網頁進入使用,如請假、簽到、人資系統甚至物流管理等。
網頁開發人員也不例外,動態網頁不管是用什么語言來撰寫(如:ASP.NET、PHP、JSP、ColdFusion等),你會發現到,現在這些語言似乎成了基本配備,殊不知Web 2.0的應用理念排山倒海而來,也讓Ajax的技術使用掘起,RIA(Rich Internet Applications)的應用也更加擴大;伴隨著使用上的要求,瀏覽器上的功能變得越來越復雜,開發者也越來越頭痛,一方面要學習許多技術,一方面又要能符合顧客所需,如何讓開發者不用再重新學習,只善用本身既有技能,也能滿足顧客口味,客戶端也能夠兼顧到網頁及窗口程序的優點,如此想法,AIR油然而生。
什么是AIR?
AIR(全名Adobe Integrated Runtime),前身是Apollo,美商Adobe公司在開發此項目時所命名的一個代號名稱,它是專為網絡桌面系統應用的一個執行環境(RunTime),競爭產品如同微軟的WPF,AIR能真正跨平臺在Windows/Mac/Linux操作系統上執行,目前為Alpha 1階段(Linux版還沒釋出),很適合應用在網絡多媒體內容上,如把PDF、Flash/Flex、HTML、Ajax全部結合在一個程序上,加上善用操作系統上的環境資源,就能快速開發出RIA應用,并且原有的網頁開發者不需要重新學習新的語言。
你會需要AIR嗎?
我們需要區分幾種類型來分析、思考,AIR是否對你有需要,以下列出3種類型族群。
使用者(End user)
你常使用計算機,你己發現到,現在的系統大多都會讓你在瀏覽器(常見是IE/FireFox)上完成,不管是查詢最新上映電影、網絡訂車票、網絡報稅、在線購物,或企業的入口網站要查詢庫存、銷售報表等,甚至采購訂單,幾乎在瀏覽器上就能一手包辦,不過你也發現到幾個惱人的事,例如:你使用的過程中,不小心要回上一步,瀏覽器的認定卻是上一頁,剛剛輸入的動作就幾乎要重來,亦或者網絡剛好中斷,而你的交易正執行到一半,等待網絡可以重新連上后,之前所輸入的內容也是要再來一遍,另外,網絡上的畫面真的都跟使用者一樣,所見即所得嗎?不一定,因為正當你要把最關鍵的網絡信息打印下來時,卻也發現,邊緣的信息怎么被截斷了。
以上,都是屢見不鮮的案例,這樣的節骨眼,利用AIR所提供的環境程序,就可以協助你,當離線時還能保持功能正常運作,當打印時也能常保完整(因為PDF能夠有一致的文件結構),你也不需要有充份的時間去學如何操作系統,因為RIA的接口與互動,己足夠讓你省下不少摸索時間。
設計者/開發者(Designer/Developer)
視覺設計者通常強在美術天份的表達,舒適性的畫面總是在他們的巧手上完成,然而一般在設計網頁與窗口的表現,過程中是需要很多加以調整,如:尺寸大小、檔案格式等,AIR的系統環境里,你可以專注在原來網頁設計的技巧,其它靠著Flash的引擎,就能發揮與網頁同質的效果。
開發者亦是,他們最不喜歡花時間去學習新的語言,你可以善用己熟悉的HTML、CSS、Ajax、Flash、Flex等,就能夠開發出桌面窗口程序,并且支持實時聯機/離線、檔案拖拉等功能,甚至還可與二個不同的窗口程序溝通,整個工作流程更具簡便。
企業業主/老板
花錢的是老板,要利潤的也是老板,大多數人的想法是不用花費任何一毛錢最好,要告訴老板們的是,AIR執行環境是不用任何費用,沒錯,「就是免費」,公司所養的開發人員也不用為了教育費用重新來過,只需花一點技巧,讓他們知道怎么導入企業應用,怎么把現有網頁轉換成AIR程序即可,當然,若采用Adobe的解決方案,花小額,采用最適合的工具,如Flex Builder、Flash等,更容易創造出公司未來的生財服務,還是一句話,「值得」。
AIR技術賣點
用相同Web技術就能制作出窗口系統,并且強調的是RIA系統,AIR它不是原生于操作系統內,而是附加安裝后可以讓你執行的環境,也因此,不建議你用AIR做一個類似PhotoShop軟件,甚至是Premiere很仰賴系統資源的軟件,但是你卻能做出如Kuler色彩管理工具或其它結合網絡應用的程序,想象一下,所有網頁能夠執行的內容,都可以搬到桌面窗口應用,再者,加上檔案拖曳功能,實時聯機與離線作業,可把PDF、SWF、HTML集于一身,支持跨平臺安裝與執行,這就是AIR的技術賣點。
Adobe針對AIR的使用技術,區分了二種技術類型,一為「應用程序」,二為「文件」。以下就以這二類型來說清楚講明白。
一、應用程序類型
以一針見血來說,其實就是利用Flash與HTML來建立與布署AIR程序。
AIR己有把Flash Player核心放進來,這是AIR的核心之一,所以它支持ECMAScript為基礎的ActionScript 3語言,現在Flash Player也貢獻在開放性程序代碼的Tamarin項目,未來在Firefox瀏覽器版本上也能看到。(更多Tamarin專案詳情,請見網站:http://www.mozilla.org/projects/tamarin/)
?
非但如此,AIR不僅在既有的Flash Player APIs可以用,可做的事情更加擴大,主要包含如下:
AIR引擎可實時解析ActionScript語法,以致有更好的效能表現。
完整的網絡堆棧,所以支持HTTP、RTMP、2位及XML Sockets。
完整性的圖形向量著色功能,加上還有繪圖APIs,讓你可以自由設計手繪功能。
多媒體支持,包含Bitmaps(位圖)、向量圖、影像、聲音等。(這在傳統的Ajax技術無法辦到)。?
不能忘記的是Flex框架(Framework),所有Flex 2的功能,你都可以在AIR身上全力發揮。
只要是HTML的功能,在AIR也都能施展,這其中包括了,HTML、JavaScript、CSS、XHTML、DOM(Document Object Model)。因此,你可以不需使用Flash,同樣可以寫出AIR程序,而且用的是HTML、JavaScript等,這項對傳統網頁開發者來說無疑是如魚得水,可以這么做的原因也是在于用了開放性的WebKit引擎,此引擎在許多瀏覽器上可以找到,如Mac OS的Safari瀏覽器、Linux相關系統的KHTML等。
在這里我們應該要曉得背后的動機是什么,為什么要采用WebKit,知道主要原因將有助于了解日后發展狀況。
首當其沖因為Webkit是開放性項目,Adobe知道一個HTML引擎的長期開發及維護是相當不容易,Webkit有全球眾多的開發者及社群在維護著,尤其許多使用者分布在Apple及Nokia領域的Power User,使得Adobe可以專心在其它如除錯、延伸功能等,并且有效回報內容給Webkit組織,獲得不斷精進。
其次是Adobe在決定用Webkit時,希望Web開發人員可以熟悉Webkit引擎的解析狀況,好比,同個HTML碼在Firefox執行可能是沒問題的,但在IE就會錯誤百出。
很多人都希望AIR的執行環境程序能夠越小越好,而WebKit引擎的程序代碼是經過組織性的討論與嚴謹撰寫下而完成,目前以Flash與HTML引擎加上之后的檔案大小大約在5MB多左右(遠比.NET Framework小太多倍)。
WebKit是被計劃可以執行在手持裝置上,這與Adobe長期的策略不謀而合,現己證實能執行在Nokia及Apple的手機上。
二、文件類型
文件類型在AIR的應用是希望可以用在動態電子文件中,也就是說每個字段內容都是可以用互動方式產生,在這里PDF及HTML就是主角。
以目前來說Alpha1還沒把PDF功能整合進來,但是值得一提的是,AIR程序里的PDF文件是可以嵌在Flash里或HTML里,甚至是同時混搭(Mash-up)在Flash、HTML中。同樣的,HTML也是可以做相同工作,把PDF與SWF都放在一塊。如圖1所示。
圖1:PDF可任意嵌在HTML或SWF環境里。
所以,我們先來綜整一下,AIR的語言模型可以怎么形成:
圖2所示,你可以用
純粹使用Flash技術,此包含了Flex。
你可以使用Flash為底層,再嵌入HTML內容。
你可以單純只使用HTML或JavaScript。
你可以使用HTML或JavaScript再嵌入Flash內容。
以上所有語言的混搭都可以結合PDF文件內容。
圖2:適合開發AIR程序的語言
?
描述語言的整合
由于WebKit與Flash Player引擎二者同時包含在AIR執行環境里,所以Adobe也將他們能發揮的功能整合在一塊,這對開發者上將會更加便利,舉例來說,HTML內容被包含在Flash里,事實上將是經由Flash來負責著色,這意味你可以任何在Flash里做位圖,像是模糊(Blur)、旋轉(Rotate)、變型(Transform)等。
另外使開發人員感到興奮的一件事就是,ActionScript可以與JavaScript做雙向溝通,如下:
容許JavaScript程序代碼去呼叫ActionScript APIs
容許ActionScript程序代碼去呼叫JavaScript APIs
ActionScript程序代碼可以直接操作DOM
能藉由JavaScript與ActionScript來做事件注冊?
AIR支援哪些APIs ?
除了原有的Flash Player及WebKit引擎所提供的APIs之外,AIR附加了新的重要APIs功能,皆可由ActionScript或JavaScript來呼叫,如下:
完整的檔案輸入/輸出功能
完整的窗口控制
完整的目錄控制
網絡聯機/離線偵測
數據快取與同步(便于讓你開發離線作業的功能)
系統通知功能(此需視操作系統的機制而定)
程序自動更新功能
以上所有APIs功能都可以直接在執行環境上或AIR框架中完成。
桌面系統整合能力
如同前言,擺脫以往瀏覽器之所不能,又能讓使用者像是在用原來桌面應用程序,更重要是讓人去驗驗Flash接口的互動能力,這就是AIR的桌面整合特色。目前包括了:
正常程序的安裝與移除
可把安裝完畢的程序直接放在桌面快捷方式或程序集
程序拖曳的操作,如:操作系統與AIR程序間的拖曳,AIR程序間的拖曳。
一般程序與AIR程序的溝通。
支持剪貼簿功能
系統通知功能
自訂圖示
可將AIR程序在背景中執行
一旦安裝完成,AIR程序如同一般安裝后的程序感覺都一樣,每一支都是獨立的,你可以來回用Tab鍵切換。使用者不需知道這程序的背后機制是怎么來,只管其操作方法。但其接口的互動感覺確是可以讓人深刻體會。
AIR相關工具組
網頁程序現在應用為什么會這么普遍,其中之一也是因為網頁開發者根本不需要知道使用者用的是什么操作系統,就可以把他們寫好的程序馬上給客戶使用,不管是Windows或Linux、Solaris、或手機,祗要是網頁程序能夠被瀏覽器讀取,就幾乎都可以使用。
對AIR也是同樣道理,不僅是可以提供跨平臺的網頁桌面應用能力外,它也是可以在打包成軟件的情況下,讓你在其它操作系統上執行。
事實上,AIR目前不局限只能在Flex Builder上開發,你可以用NotePad(筆記本),或是任何可以寫HTML、JavaScript的編輯工具,就可以打造出AIR的應用程序。
當然,工欲善其事,必先利其器。若你要有視覺性的開發工具,Flex Builder不失為值得使用的IDE工具,你可以到Adobe官方網站下載試用,記得必須要下載Flex Builder 2.0.1加上AIR Extensions for Flex Builder 2.0.1,才能管理整個AIR程序項目。
另外,Adobe官方剛釋放一些AIR的重要工具,各位可以去下載把玩,試試便知道精彩神奇的內容在哪里。
開始前你必須要知道的
AIR RunTime
這是主要運行AIR程序的執行環境,如同微軟的.NET Framework一樣,任何開發好的AIR程序都要有這執行環境才能使用。
AIR SDK
SDK包含了AIR Frameworks、命令列程序、鏈接庫、基本設定檔等內容。所以可以讓你做測試、除錯或利用其它文字、視覺編輯工具寫好后,直接打包成AIR程序。
在SDK里有二個重要的命令列工具是:
ADL(AIR Debugger Launcher)
主要是用在不需要先前經過安裝,就可以直接測試并執行AIR程序。
ADT(AIR Developer Tool)
這就是封裝成AIR安裝程序,擴展名是.air,當你打包成air檔后,你就可以布署在任何的系統上(目前Alpha1祗提供Windows及Macintosh二種平臺,正式版會有Linux平臺,官方說明未來也會有手機運行版本)。
以上,所有下載網址都在http://labs.adobe.com/downloads/air.html。
小結:
多數的朋友聽到AIR的應用后,常詢問一個問題,那就是AIR會不會就是取代瀏覽器上的應用?并且未來直接再把AIR的程序再放回瀏覽器上使用?
這問題我與Adobe資深開發人員關系產品經理討論過,AIR是為了解決瀏覽器上應用的不足,并且他是用相同的技術、語言、鏈接庫來完成桌面上的應用,并且AIR還在發展階段,后續將上市的功能也都會顧及到使用者在長期以來得不到的解決方案,然而開發者什么時候會用AIR技術在桌面平臺上?這也會視需求量而定,不過既然都使用Web技術,所以你可以很快就轉換成AIR版本,還可以同時有二個版本存在,這給你的客戶或未來所有使用者有了更好的選擇。
作者簡介:
劉仲濱
國立交通大學電機信息學院數字圖書組碩士,研究 Adobe/macromedia相關產品多年,為國內企業暨華人社群大力推展 RIA互動多媒體應用暨解決方案,著作有相關Adobe/Macromedia網頁書籍、多篇雜志專欄,同時為大型研討會講師,技術顧問,及RiS平臺(http://j2eemx.com)資深社群主持人。
文章來源于 mon的博客:http://monw3c.blogbus.com/logs/7971758.html
HTTPService
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="<mx:Script>
<![CDATA[
private function initializeHandler(event:Event):void {
countriesService.send();
}
private function changeHandler(event:Event):void {
statesService.send();
}
]]>
</mx:Script>
<!-- 載入純靜態的xml數據 -->
<mx:HTTPService id="countriesService" url="<!-- 載入由php生成的xml數據 -->
<mx:HTTPService id="statesService" url="<!-- 以下標簽就是要發送到服務端的數據了,可以這樣理解:有一個名為country的變量,它的值為花括號{}里的內容 -->
<mx:request>
<country>{country.value}</country>
</mx:request>
</mx:HTTPService>
<mx:VBox>
<!-- 此控件的數據由第一個<mx:HTTPService/>控件接收的內容提供,并且由這個ComboBox控制著第二個ComboBox所要顯示的內容 -->
<mx:ComboBox id="country" dataProvider="{countriesService.lastResult.countries.country}"
change="changeHandler(event)" />
<!-- 下面的ComboBox已經綁定了{statesService.lastResult.states.state},隨它的數據改變而改變 -->
<mx:ComboBox dataProvider="{statesService.lastResult.states.state}" />
</mx:VBox>
</mx:Application>
URLLoader
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="<mx:Script>
<![CDATA[
private var _countriesService:URLLoader;
private var _statesService:URLLoader;
private function initializeHandler(event:Event):void {
_countriesService = new URLLoader();
_countriesService.addEventListener(Event.COMPLETE, countriesCompleteHandler);
_countriesService.load(new URLRequest("_statesService = new URLLoader();
_statesService.addEventListener(Event.COMPLETE, statesCompleteHandler);
XML.ignoreWhitespace = true;
}
private function countriesCompleteHandler(event:Event):void {
var xml:XML = new XML(_countriesService.data);
country.dataProvider = xml.children();
}
private function statesCompleteHandler(event:Event):void {
var xml:XML = new XML(_statesService.data);
state.dataProvider = xml.children();
}
private function changeHandler(event:Event):void {
var request:URLRequest = new URLRequest("var parameters:URLVariables = new URLVariables();
parameters.country = country.value;
request.data = parameters;
_statesService.load(request);
}
]]>
</mx:Script>
<mx:VBox>
<mx:ComboBox id="country" change="changeHandler(event)" />
<mx:ComboBox id="state" />
</mx:VBox>
</mx:Application>
?
WebService 方法一
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="<mx:Script>
<![CDATA[
private function initializeHandler(event:Event):void {
statesService.getCountries();
}
private function changeHandler(event:Event):void {
statesService.getStates(country.value);
}
]]>
</mx:Script>
<mx:WebService id="statesService"
wsdl="<mx:operation name="getCountries" />
<mx:operation name="getStates" />
</mx:WebService>
<mx:VBox>
<mx:ComboBox id="country"
dataProvider="{statesService.getCountries.lastResult}" change="changeHandler(event)" />
<mx:ComboBox dataProvider="{statesService.getStates.lastResult}" />
</mx:VBox>
</mx:Application>
WebService 方法二
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="<mx:Script>
<![CDATA[
private function initializeHandler(event:Event):void {
statesService.getCountries.send( );
}
private function changeHandler(event:Event):void {
statesService.getStates.send( );
}
]]>
</mx:Script>
<mx:WebService id="statesService" wsdl="<mx:operation name="getCountries" />
<mx:operation name="getStates">
<mx:request>
<country>{country.value}</country>
</mx:request>
</mx:operation>
</mx:WebService>
<mx:VBox>
<mx:ComboBox id="country"
dataProvider="{statesService.getCountries.lastResult}" change="changeHandler(event)" />
<mx:ComboBox dataProvider="{statesService.getStates.lastResult}" />
</mx:VBox>
</mx:Application>
原文:http://bbs.airia.cn/FLEX/thread-2738-1-1.aspx