2010年12月24日 星期五

網頁與AIR程式互動

如果需要在Browser上可以與AIR應用程式做互動,如安裝AIR App,或由網頁上的Click觸發啟動AIR App,以下是相關執行程序

一.準備工作
1.AIR程式端設定AIR程式允許透過Browser觸發
設定AIR發布用的application.xml的
 <application xmlns="http://ns.adobe.com/air/application/2.0">  
建議設定發布為AIR 1.53以上版本,因為如果AIR為1.53之前的版本,Browser要呼叫AIR,一定要知道AIR的PID值(在AIR內可以用NativeApplication.nativeApplication.publisherID取得)。若AIR為1.53後的版本,若Browser不知道AIR的PID,可以用""代即可。

加入
 <allowBrowserInvocation>true</allowBrowserInvocation>  
讓AIR允許被Browser啟動

2.Browser端Flash取得AIR Browser API
Browser端Flash要操作AIR所要用的API都放在http://airdownload.adobe.com/air/browserapi/air.swf內
透過loader載入這個檔案即可使用相關功能

public var airSWF:Object;
public var airSWFLoader:Loader = new Loader();
public var loaderContext:LoaderContext = new LoaderContext();
loaderContext.applicationDomain = ApplicationDomain.currentDomain; 
airSWFLoader.contentLoaderInfo.addEventListener(Event.INIT, onInit); 
airSWFLoader.load(new URLRequest(" http://airdownload.adobe.com/air/browserapi/air.swf"), loaderContext);
private function onInit(e:Event):void { 
    airSWF = e.target.content;
    airSWF.getApplicationVersion(appID, pubID, versionDetectCallback);
}        

二.Browser檢查Client是否已經安裝AIR執行環境
var result:String=airSWF.getStatus();
取得回傳值
"available":可安裝但尚未安裝。
"unavailable":無法安裝
"installed":已安裝

三.Browser檢查Client端是否已經安裝AIR 應用程式
利用檢查AIR應用程式版本來確認程式是否已經安裝,執行後,若檢查完成
會呼叫執行所設定的versionDetectCallback函式,並在這callBack函式內
取得版本值,當版本值為null代表未安裝程式
airSWF.getApplicationVersion(appID, pubID, versionDetectCallback);
private function versionDetectCallback(version:String):void { }    

設定參數:
appID:應用程式ID,即AIR應用程式的application.xml內的id值,或在air內透過
    NativeApplication.nativeApplication.applicationID取得
pubID:發佈者ID,在air內透過
    NativeApplication.nativeApplication.publisherID取得

注意:要讓這功能有效可以使用,在使用air.swf一定要是載入http://airdownload.adobe.com/air/browserapi/air.swf
若將這air.swf複製到local端呼叫使用,則取得版本永遠會是null值

四.Browser安裝AIR App
airSWF.installApplication(installPath, runtimeVersion, arguments); 
設定參數:
installPath:String,要安裝的air檔案路徑
runtimeVersion:String,允許執行的AIR Runtime最低版本,例如"1.5"
arguments:Array,非必填項目,要傳遞給AIR的參數,這參數會被AIR內的
BrowserInvokeEvent.BROWSER_INVOKE事件所接收

五.Browser 啟動已安裝AIR APP
airSWF.launchApplication(appID, pubID, myArguments);

六.Browser傳遞參數給AIR App
airSWF.launchApplication(appID, pubID, myArguments);
只要將傳遞的參數放到myArguments陣列內即可

2010年12月9日 星期四

List物件客製CellRenderer與設定背景顏色

在使用List或DataGrid物件,如果需要自行設計CellRenderer,例如加入圖片,底圖或使用多文字框,以下是自訂CellRender操作流程

一.自訂 CellRenderer Class
自訂CellRenderer必須繼承Sprite或MovieClip且實作ICellRenderer介面
因此一個自訂的CellRenderer Class基本上一定具備以下結構

public class ItemRenderer extends Sprite implements ICellRenderer{
    private var _listData:ListData; 
    private var _data:Object; 
    private var _selected:Boolean; 
    public function ItemRenderer() {}
    public function set data(d:Object):void { 
    }
    public function get data():Object { 
        return _data; 
    } 
    public function set listData(ld:ListData):void { 
        trace("ListData=" + ld.label);
        _listData = ld; 
    } 
    public function get listData():ListData { 
        return _listData; 
    } 
    public function set selected(s:Boolean):void { 
        _selected = s;             
    } 
    public function get selected():Boolean { 
        return _selected; 
    } 
    public function setSize(width:Number, height:Number):void { } 
    public function setStyle(style:String, value:Object):void { } 
    public function setMouseState(state:String):void{ } 

}
雖然自訂的CellRenderer可以直接繼承自系統的CellRenderer,但最好還是實作ICellRenderer介面,可以有比較大的彈性應用

二.在Flash IDE上產生Instance
在Flash IDE上,依照需要設計產生CellRender所要對應的Symbol
並在Library內設定該Symble的Linkage
Class:完整的CellRenderer Class名稱
base Class:flash.display.MovieClip

三.List利用setStyle指定cellRenderer Class
當已經設計好CellRenderer Class並在fla上產生好Symbol
執行
list.setStyle("cellRenderer", ItemRendererClass);
(ItemRendererClass是自訂的Renderer Class)
即可讓list使用你自訂的CellRenderer

四.List加入資料
將要提供給cellRenderer用的資料以物件芳式包裝好,再以addItem()加入,這樣CellRenderer內的 set data(obj:Object)即會收到所傳入的物件

var obj=new Object();
obj.id=xxx;
obj.thumb=xxx;...
list.addItem(obj)

五.CellRenderer內各Method說明

1.data
當list以addItem將資料加入後,會自動執行set data()

在list上
list.addItem(_itemObj);    
在renderer上會觸發
public function set data(d:Object):void { 
    //--d即是addItem所帶的_itemObj
    //--利用d帶進來的資料,顯示在你要顯示的文字框或圖片--
}        

2.listdata
當list.addItem(_itemObj);也同時會觸發renderer內的這個listData method
set listData(ld:ListData)內的ld為一個ListData物件,包含了這個renderer在List內的相關資訊
例如ld.index即是這個render在list內所在位置的index值

3.selected
當render的選取狀態有變化時會觸發這個method,也就是說當使用者在list上click item
如果這個item被選取時,selected(s:Boolean)
s會得到true,若在非選取狀態,則為false
在這裡可利用s值,改變render顯示的樣式,顯示物件選取狀態

4.setSize
只要是在list上做關於size改變的設定,例如
list.setSize()或設定list.rowHeight,都會把在list上設定的大小值
傳給render的setSize(),你可以在這method內依照傳進來的值
調整render內物件的大小
5.setStyle
可用來設定CellRender的顯示樣式,若不想做任何處理,保持空的即可
但一定要保留這method在Class內

6.setMouseState
可用來設定CellRender的滑鼠狀態,若不想做任何處理,保持空的即可
但一定要保留這method在Class內

六.設定List的背景色
List本身並無backgroundColor的選項可供改變List的底色,使用serStyle("backgroundColor")也是無效,若要改變底色需要設定的是"skin"的style,並傳入一個你要當作背景的物件當作傳入值

var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xff0000,0.5);
bg.graphics.drawRect(0, 0, 10, 10);
bg.graphics.endFill();
list.setStyle("skin", bg);

註:skin style預設是List_Skin這Class